R中的线性模型用于data.frame中的所有变量,返回结果矩阵

时间:2014-11-01 15:54:00

标签: r dataframe linear-regression coefficients

所有

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

但是,我想问一下,有没有一种方法可以一次性做到这一点而不是成对呢?

例如,我知道如何使用2个变量:

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

mtcars有11个数字变量,是否有办法为所有变量添加? 我的意思是,因为有11个变量,我们想记录所有的r平方值? 我们想要一个11乘11矩阵,它是对称的,对角线是0?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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")

有关详细信息,请参阅the vignette