1

全部

我正在尝试为多个变量拟合线性模型并报告所有 R 平方值。

但是,我想问一下,有没有一种方法可以一次性完成,而不是成对完成?

例如,我知道如何使用 2 个变量来做到这一点:

data(mtcats)
fit<-lm(formula = mtcars[,1] ~ mtcars[,2])
summary(fit)$r.squared

mtcars 有 11 个数值变量,有没有办法对所有变量进行 dong 操作? 我的意思是,既然有 11 个变量,我们要记录所有 r 平方值吗? 我们想要一个 11 x 11 的对称矩阵,对角线为 0?

4

2 回答 2

2

因为这些是单变量回归模型,所以 r 平方只是每对变量之间相关系数的平方,所以你可以这样做:

rsq = cor(mtcars)^2
diag(rsq) = 0  # To get zeros on the diagonals

这是前 3 行和列:

> rsq[1:3, 1:3]
           mpg       cyl      disp
mpg  0.0000000 0.7261800 0.7183433
cyl  0.7261800 0.0000000 0.8136633
disp 0.7183433 0.8136633 0.0000000

顺便说一句,您可能会发现该corrplot软件包对可视化 r 平方值很有用。该软件包实际上是用于相关性,而不是相关性的平方,但它是一种快速了解哪些变量对具有最强关系的简单方法。您也可以使用更通用的热图,但corrplot为相关性提供了一些更集中的工具。

library(corrplot)

corrplot.mixed(cor(mtcars)^2) 

# Or, to sort the column order by clustering
corrplot.mixed(cor(mtcars)^2, order="hclust")

有关更多信息,请参阅小插图

于 2014-11-01T18:14:04.557 回答
2

您可以使用outer

 res1 <- outer(colnames(mtcars), colnames(mtcars), FUN= function(x,y) {
          sapply(as.list(paste(x,y, sep="~")), function(z) {
               form1 <- as.formula(z)
               fit <- lm(form1, data=mtcars)
               summary(fit)$r.squared})
               })

或者expand.grid

indx <- expand.grid(colnames(mtcars), colnames(mtcars), stringsAsFactors=FALSE)
res2 <- sapply(seq_len(nrow(indx)),function(i) {i1 <- indx[i,]
                       form1 <-as.formula(paste(i1[,1], i1[,2], sep="~"))
                       fit <- lm(formula=form1, data=mtcars)
                       summary(fit)$r.squared})

 dim(res2) <- c(11,11)
 res2[1:3,1:3]
 #         [,1]      [,2]      [,3]
 #[1,] 0.0000000 0.7261800 0.7183433
 #[2,] 0.7261800 0.0000000 0.8136633
 #[3,] 0.7183433 0.8136633 0.0000000

 identical(res1,res2)
 #[1] TRUE
于 2014-11-01T17:53:39.710 回答