在R中运行统计模型(例如,glmlmlme4::lmer等)之后,我使用corr=TRUE运行summary()命令以获得系数表的相关性.它以给定模型中截距和自变量的相关矩阵为特征.我想要做的是提取使这些关联成为可能的列.例如,如果模型为x ~ a + b,表格如下所示...

 (Intercept)   a   
a    0.##      
b    0.##     0.##

我想提取允许ab之间相关性的列.

我找到了各种各样的命令来提取拟合值和残差,但到目前为止,还没有任何命令可以给我对应于表中相关性的ab的值.

推荐答案

你想要的是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)

R相关问答推荐

提取R中值和列名的所有可能组合

使用对管道内单元格的引用生成新变量

以R中的正确顺序将日期时间字符列转换为posixct

Highcharter多次钻取不起作用,使用不同方法

如何直接从Fortran到R的数组大小?

在GGPLATE中将突出的点放在前面

如何根据R中其他列的值有条件地从列中提取数据?

为什么当用osmdata映射R时会得到相邻状态?

汇总数据表中两个特定列条目的值

一小时满足条件的日期的 Select

在R gggplot2中是否有一种方法将绘图轴转换成连续的 colored颜色 尺度?

条形图顶部与其错误条形图不对齐

R+reprex:在呈现R标记文件时创建可重现的示例

我如何使用循环来编写冗余的Rmarkdown脚本?

用满足特定列匹配的另一行替换NA行

如何在内联代码中添加额外的空格(R Markdown)

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

带有Bootswatch Cerulean主题的shiny 仪表板中的浏览&按钮可见性问题

删除r中每个因素级别的最后2行

如何修改Rust中的R字符串并将其赋给新的R变量,并使用extendr保留原始R字符串