所有
我正在尝试为几个变量拟合线性模型并报告所有R平方值。
但是,我想问一下,有没有一种方法可以一次性做到这一点而不是成对呢?
例如,我知道如何使用2个变量:
data(mtcats)
fit<-lm(formula = mtcars[,1] ~ mtcars[,2])
summary(fit)$r.squared
mtcars有11个数字变量,是否有办法为所有变量添加? 我的意思是,因为有11个变量,我们想记录所有的r平方值? 我们想要一个11乘11矩阵,它是对称的,对角线是0?
答案 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。