【问题标题】:How can I add a linear regression in a for loop or s/lapply?如何在 for 循环或 s/lapply 中添加线性回归?
【发布时间】:2016-03-22 03:12:48
【问题描述】:

我一直在尝试(几天来)“自动化”几个使用相同 x 轴数据(“甲烷”)但 y 轴变化(第 1、10、16 天等)的线性回归。从每个回归中,我想提取截距和斜率并将它们写在每个相应的列下(第 1 天到第 72 天)。我也不知道哪种方法更合适,for循环还是s/lapply

示例(名为“raw_standards”的数据框):

Methane 1        10       16       62       72 
224.62  1490700  1423400  2475400  2063300  1819650 
449.23  3297100  2878950  4980300  4078800  3701750 
842.32  4181900  5292200  10718500 8247400  7566600 
2246.18 9211500  12535000 25439000 19867500 16443000 
4492.36 29228000 27567000 49345000 39328000 30743000 

我当前的for循环如下:

for (i in raw_standards[,2:6]) {
  y = raw_standards [,3:20]
  lm(y ~ raw_standards$'uM Methane', raw_standards)
}

我也试过 lapply:

lapply (raw_standards [ , 2:6],
  lm(raw_standards [ , 2:6] ~ raw_standards$'uM Methane',raw_standards))

非常感谢任何有助于了解如何正确编写正确代码的帮助。

【问题讨论】:

    标签: r for-loop linear-regression lapply sapply


    【解决方案1】:

    我喜欢用管道做这些事情。来自 hadley 的三个包的绝妙组合就可以解决问题。

    df <- data.frame(Methane = rnorm(30),Day1 = rnorm(30),Day2 = rnorm(30),Day3 = rnorm(30))
    
    library(tidyr)
    library(dplyr)
    library(purrr)
    
    df %>% gather(Variable,value,-Methane) %>% split(.$Variable) %>% 
          map(~ lm(value ~ Methane, data = .)) %>%
          map("coefficients") 
    

    第一步:gather函数将数据转换为长格式。

    第二步:将数据帧的函数拆分为数据帧列表。

    第三步:map在列表的所有元素上建立线性模型(同lapply)

    如需进一步说明,请参阅这些包的包小插曲,这些包写得非常好。上面代码的输出是:

    $Day1
    (Intercept)     Methane 
     0.17664660 -0.07090221 
    
    $Day2
    (Intercept)     Methane 
     0.03615358  0.24230124 
    
    $Day3
    (Intercept)     Methane 
      0.1662604  -0.2836147 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 2022-01-15
      • 2015-03-13
      • 2017-07-12
      • 2019-09-07
      • 1970-01-01
      相关资源
      最近更新 更多