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
进行回归:person1
、person2
和 person3
。请注意,这是一个最小的工作示例,但我希望概括这个想法。
所以我最初的尝试是:
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 的模型系数。
我浏览了论坛,但找不到我要找的东西。
我想运行 进行几次简单的线性回归。每次使用不同的列作为我的自变量时,因变量都保持不变。在 运行 之后,我希望能够从每个回归中提取 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
进行回归:person1
、person2
和 person3
。请注意,这是一个最小的工作示例,但我希望概括这个想法。
所以我最初的尝试是:
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 的模型系数。