在R中从数据框运行多个简单线性回归

6
我有一个数据集(数据框),包含5列数字值。
我想为数据集中的每一对变量运行简单线性回归分析。例如,如果列名为A、B、C、D、E,我想要运行lm(A~B), lm(A~C), lm(A~D)……以及lm(D~E),然后绘制出每一对变量的数据和回归线图形。
但是我对R还比较陌生,不知道如何实现这一操作。应该使用ddply还是lapply?我真的不确定该怎么处理。

欢迎来到SO。您可以使用combnapply函数来解决您的问题。 - Metrics
1
请提供一个最小化的、可复现的示例(https://dev59.com/eG025IYBdhLWcg3whGSx#5963610)。谢谢。 - Henrik
1
抱歉,我尝试将数据与代码一起包含,但它似乎无法正确地发布(我也是 SO 的新手)。 - mrp
1
дҪ еҸҜд»ҘдҪҝз”ЁGGallyеҢ…дёӯзҡ„ggpairsеҮҪж•°пјҡhttp://www.r-bloggers.com/example-9-17-much-better-pairs-plots/ - Ben Bolker
我也很好奇是否有一个通用的pairapply函数存在于某个地方 - 尽管我找不到...虽然下面的combn解决方案基本上可以实现。 - Ben Bolker
@ Ben Bolker,我不熟悉GGally,但我会去了解一下。谢谢。 - mrp
3个回答

7
这里有一个使用 combn 的解决方案。
 combn(names(DF), 2, function(x){lm(DF[, x])}, simplify = FALSE)

例子:

set.seed(1)
DF <- data.frame(A=rnorm(50, 100, 3),
                 B=rnorm(50, 100, 3),
                 C=rnorm(50, 100, 3),
                 D=rnorm(50, 100, 3),
                 E=rnorm(50, 100, 3))

更新:添加@Henrik的建议(请参见评论)

# only the coefficients
> results <- combn(names(DF), 2, function(x){coefficients(lm(DF[, x]))}, simplify = FALSE)
> vars <- combn(names(DF), 2)
> names(results) <- vars[1 , ] # adding names to identify variables in the reggression
> results
$A
 (Intercept)            B 
103.66739418  -0.03354243 

$A
(Intercept)           C 
97.88341555  0.02429041 

$A
(Intercept)           D 
122.7606103  -0.2240759 

$A
(Intercept)           E 
99.26387487  0.01038445 

$B
 (Intercept)            C 
99.971253525  0.003824755 

$B
 (Intercept)            D 
102.65399702  -0.02296721 

$B
(Intercept)           E 
96.83042199  0.03524868 

$C
(Intercept)           D 
 80.1872211   0.1931079 

$C
(Intercept)           E 
 89.0503893   0.1050202 

$D
 (Intercept)            E 
107.84384655  -0.07620397 

2
也许可以将响应变量作为每个列表元素的名称添加进去?类似这样 vars <- combn(names(DF), 2); names(the-coef-list) <- vars[1 , ]。或许可以这样做。 - Henrik
这太棒了,非常感谢。我能够使用相同的combn()代码来绘制每个回归图:combn(names(DF), 2, function(x){coefficients(plot(DF[, x]))}, simplify = FALSE)。但是如何在每个图中添加回归线呢?我可以在其中嵌套一个lines()函数吗?我一直在尝试公式,但是一直出现错误。或者单独运行abline()?再次感谢! - mrp

2
我建议您也查看相关矩阵(cor(DF)),通常是发现变量之间线性关系的最佳方法。相关性与协方差和简单线性回归的斜率密切相关。下面的计算示例说明了这种联系。
样本数据:
set.seed(1)
DF <- data.frame(
  A=rnorm(50, 100, 3),
  B=rnorm(50, 100, 3),
  C=rnorm(50, 100, 3),
  D=rnorm(50, 100, 3),
  E=rnorm(50, 100, 3)
)

回归斜率是 cov(x, y) / var(x)。其中,cov表示x和y的协方差,var表示x的方差。
beta = cov(DF) * (1/diag(var(DF)))

            A            B           C           D           E
A  1.00000000 -0.045548503 0.028448192 -0.32982367  0.01800795
B -0.03354243  1.000000000 0.003298708 -0.02489518  0.04501362
C  0.02429041  0.003824755 1.000000000  0.24269838  0.15550116
D -0.22407592 -0.022967212 0.193107904  1.00000000 -0.08977834
E  0.01038445  0.035248685 0.105020194 -0.07620397  1.00000000

截距是 mean(y) - beta * mean(x)
colMeans(DF) - beta * colMeans(DF)

             A         B         C         D         E
A 1.421085e-14 104.86992  97.44795 133.38310  98.49512
B 1.037180e+02   0.00000 100.02095 102.85026  95.83477
C 9.712461e+01  99.16182   0.00000  75.38373  84.06356
D 1.226899e+02 102.53263  80.87529   0.00000 109.22915
E 9.886859e+01  96.38451  89.41391 107.51930   0.00000

1
使用combn来获取一列中所有名称的组合(在以下示例中,我假设您仅想要两列的组合),并使用Map循环运行。
使用R中的mtcars数据进行示例:
colc<-names(mtcars)
colcc<-combn(colc,2)
colcc<-data.frame(colcc)
kk<-Map(function(x)lm(as.formula(paste(colcc[1,x],"~",paste(colcc[2,x],collapse="+"))),data=mtcars), as.list(1:nrow(colcc)))

 head(kk)
[[1]]

Call:
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars)

Coefficients:
(Intercept)          cyl  
     37.885       -2.876  


[[2]]

Call:
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars)

Coefficients:
(Intercept)         disp  
   29.59985     -0.04122  


[[3]]

Call:
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars)

Coefficients:
(Intercept)           hp  
   30.09886     -0.06823  


[[4]]

Call:
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars)

Coefficients:
(Intercept)         drat  
     -7.525        7.678  


[[5]]

Call:
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars)

Coefficients:
(Intercept)           wt  
     37.285       -5.344  


[[6]]

Call:
lm(formula = as.formula(paste(colcc[1, x], "~", paste(colcc[2, 
    x], collapse = "+"))), data = mtcars)

Coefficients:
(Intercept)         qsec  
     -5.114        1.412  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接