R循环线性回归

R loop over linear regression

我浏览了论坛,但找不到我要找的东西。


我想运行 进行几次简单的线性回归。每次使用不同的列作为我的自变量时,因变量都保持不变。在 运行 之后,我希望能够从每个回归中提取 R 平方。我的想法是使用一个简单的 for 循环。但是,我无法让它工作。

假设我使用以下数据:

    num value person1 person2 person3
0   1   229   29      81      0
1   2   203   17      75      0
2   3   244   62      0       55

并且我想 运行 使用三个变量对 value 进行回归:person1person2person3。请注意,这是一个最小的工作示例,但我希望概括这个想法。

所以我最初的尝试是:

column <- names(df)[-2]
for(i in 3:5){
  temp <- df[,c("value", column[i])]
  lm.test <- lm(value ~ ., data = temp)
  i + 1 
}

然而,当我 运行 summary(lm.test) 时,我只得到最后一次回归的总结,即 lm(value ~ person3) 我认为这是有道理的,但当我试图将其重写为: lm.test[i] <- lm(value ~ ., data = temp) 我收到以下错误:

debug at #3: temp <- df[,c("value", column[i])]

暗示第 3 行有问题?

如果可能的话,我希望能够获取每个回归的摘要,但是 我真正想要的是每个回归的 R 平方

您可以在循环中创建 formula,然后 运行 lm。例如,如果我想 运行 对 mtcars 进行回归以对每个 cyl, wt, hp 进行回归 mpg,我可以使用以下内容:

vars <- c("cyl", "wt", "hp")
lm_results <- lapply(vars, function(col){
    lm_formula <- as.formula(paste0("mpg ~ ", col))
    lm(lm_formula, data = mtcars)
})

然后您可以再次迭代 lm_results 以获得 r.squared:

lapply(lm_results, function(x) summary(x)$r.squared)

这是一种使用 broom::glance()purrr::map_dfr() 将模型摘要统计信息收集到整洁的小标题中的方法:

library(broom)
library(purrr)

lm.test <- map_dfr(
    set_names(names(df)[-2]),
    ~ glance(lm(
      as.formula(paste("value ~", .x)),
      data = df
     )),
    .id = "predictor"
)

结果:

# A tibble: 4 x 13
  predictor r.squared adj.r.squared sigma statistic p.value    df logLik   AIC
  <chr>         <dbl>         <dbl> <dbl>     <dbl>   <dbl> <dbl>  <dbl> <dbl>
1 num           0.131       -0.739   27.4     0.150   0.765     1  -12.5  31.1
2 person1       0.836        0.672   11.9     5.10    0.265     1  -10.0  26.1
3 person2       0.542        0.0831  19.9     1.18    0.474     1  -11.6  29.2
4 person3       0.607        0.215   18.4     1.55    0.431     1  -11.3  28.7
# ... with 4 more variables: BIC <dbl>, deviance <dbl>, df.residual <int>,
#   nobs <int>

注意,您可以使用 broom::tidy() 而不是 glance() 来捕获具有 a similar approach 的模型系数。