【问题标题】:Running multiple, simple linear regressions from dataframe in R从 R 中的数据框运行多个简单的线性回归
【发布时间】:2017-11-15 09:19:55
【问题描述】:

我有一个包含 5 列的数据集(数据框),所有列都包含数值。

我希望为数据集中的每一对运行一个简单的线性回归。

例如,如果列名为A, B, C, D, E,我想运行lm(A~B), lm(A~C), lm(A~D), ...., lm(D~E),...,然后我想将每对的数据与回归线一起绘制。

我对 R 还很陌生,所以我有点想知道如何真正实现这一点。我应该使用ddply 吗?或lapply?我不确定如何解决这个问题。

【问题讨论】:

  • 欢迎来到 SO。您可以使用 combn of cols 和 apply 函数来解决您的问题
  • 请包含一个最小值,reproducible example。谢谢。
  • 抱歉,我试图将数据与代码一起包含,但没有显示它会正确发布(我也是 SO 新手)。
  • 你可以使用GGally包中的ggpairs函数:r-bloggers.com/example-9-17-much-better-pairs-plots
  • 我也很好奇是否有一个通用的pairapply 函数存在于某处——不是我能找到的......尽管下面的combn 解决方案基本上可以做到。

标签: r linear-regression


【解决方案1】:

这是使用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 建议(参见 cmets)

# 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 

【讨论】:

  • 也许将响应变量作为名称添加到每个列表元素? vars &lt;- combn(names(DF), 2) 之类的东西; names(the-coef-list) &lt;- vars[1 , ]。也许吧。
  • 这太棒了,非常感谢。我能够使用相同的 combn() 代码来绘制每个回归:commn(names(DF), 2, function(x){coefficients(plot(DF[, x]))}, simple = FALSE)。我如何将回归线添加到每个图中?我可以在某处嵌套一个 lines() 函数吗?我一直在修改公式,但一直出错。或者也许运行一个单独的 abline()?再次感谢!
【解决方案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)

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

【讨论】:

    【解决方案3】:

    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  
    

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 2018-08-13
      • 2018-06-06
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2013-03-15
      相关资源
      最近更新 更多