如何为R中的每个列运行lm回归

时间:2017-02-26 04:31:23

标签: r dataframe regression

我的数据框为:

df=data.frame(x=rnorm(100),y1=rnorm(100),y2=rnorm(100),y3=...)

我想运行一个循环,从第一列的第二列开始对每列进行回归:

for(i in names(df[,-1])){
    model = lm(i~x, data=df)
}

但我失败了。关键是我想为每列做一个回归循环,一些列名只是一个数字(例如404.1)。我找不到使用上面的命令为每列运行循环的方法。

2 个答案:

答案 0 :(得分:0)

您的代码看起来不错,除非您在i内拨打lm,R会将i作为字符串读取,您无法对其进行回归。使用get可以提取与i对应的列。

df=data.frame(x=rnorm(100),y1=rnorm(100),y2=rnorm(100),y3=rnorm(100))

storage <- list()
for(i in names(df)[-1]){
  storage[[i]] <- lm(get(i) ~ x, df)
}

我创建了一个空列表storage,我将填充循环的每次迭代。这只是个人偏好,但我也建议你不要写你当前的循环:

 for(i in names(df[,-1])){
    model = lm(i~x, data=df)
}

您将覆盖model,因此仅返回最后一次迭代结果。我建议你把它改成一个列表,或者你可以迭代存储结果的矩阵。

希望有所帮助

答案 1 :(得分:0)

另一种使用扫帚和tidyverse的解决方案:

library(tidyverse)
library(broom)
df <- data.frame(x=rnorm(100),y1=rnorm(100),y2=rnorm(100))

result <- df %>% 
  gather(measure, value, -x) %>%
  nest(-measure) %>%
  mutate(fit = map(data, ~ lm(value ~ x, data = .x)),
         tidied = map(fit, tidy)) %>%
  unnest(tidied)