你想要的是summary(.)$correlation
.
如果你想从object
中提取一些东西,请查看 struct str(object)
以找到所需的元素.(如果你在RStudio中工作,可能从str(object, max.levels=1)
开始,因为如果输出太大,它会挂起或崩溃.
查看fitted()
个方法(如stats:::fitted.lm
)的源代码会发现,它们本质上提取了相应对象的$fitted.values
元素(类似于resid()
).
就像我们写一个函数ex_corr_lm()
一样.为了自动获得RHS变量,我们可以在公式元素上使用all.vars()
.
object
还包含model
数据,这是原始数据中用于拟合模型的数据的一部分.如果有NA
个,它们可能会被移除.我们可以使用它来重建"使这些关联成为可能"的列.
> ex_corr_lm <- \(object, data=FALSE, vars) {
+ if (missing(vars)) {
+ vars <- all.vars(s$call$formula)[-1]
+ }
+ if (inherits(object, c("lm", "glm"))) {
+ s <- summary(object, corr=TRUE)
+ corr <- s$correlation[vars, vars]
+ corr_data <- object$model[, vars]
+ } else if (inherits(object, "lmerMod")) {
+ s <- summary(object, corr=TRUE)
+ corr <- as.matrix(s$vcov@factors$correlation)[vars, vars]
+ corr_data <- object@frame[, vars]
+ } else {
+ stop('not implemented.')
+ }
+ if (data) {
+ list(corr=corr, corr_data=corr_data)
+ } else {
+ corr
+ }
+ }
> ex_corr_lm(f_lm)
a b
a 1.0000000 -0.4798395
b -0.4798395 1.0000000
>
> ex_corr_lm(f_lm, vars=c('a', 'b')) ## explicitly specify vars
a b
a 1.0000000 -0.4798395
b -0.4798395 1.0000000
>
> ex_corr_lm(f_glm)
a b
a 1.0000000 -0.4798395
b -0.4798395 1.0000000
>
> ex_corr_lm(f_lmer)
a b
a 1.0000000 -0.4798395
b -0.4798395 1.0000000
如果我们设置data=TRUE
,我们可以得到相应的列.在这种情况下,ex_corr_lm()
抛出一个包含相关性和数据列的列表.
> ex_corr_lm(f_lm, TRUE)
$corr
a b
a 1.0000000 -0.4798395
b -0.4798395 1.0000000
$corr_data
a b
1 1 1
2 2 4
3 3 9
4 4 16
5 5 25
6 1 36
7 2 49
8 3 64
9 4 81
10 5 100
我们可以在他们身上使用cor()
英镑.请注意,估计系数的相关性和变量本身之间的相关性不一定相同.
> ex_corr_lm(f_lm, TRUE)$corr_data |> cor()
a b
a 1.0000000 0.4798395
b 0.4798395 1.0000000
Data:
> set.seed(42)
> d <- data.frame(a=rep(1:5, 2), b=(1:10)^2);d$x <- .5 + 2*d$a + .1*d$b + rnorm(10,,.5)
> f_lm <- lm(x ~ a + b, d,)
> f_glm <- glm(x ~ a + b, d, fam=gaussian())
> f_lmer <- lme4::lmer(x ~ a + b + (1|a), d)