使用 purrr 和 R 执行多元回归
Performing multiple regression with purrr and R
我想弄清楚如何设置 purrr 到 运行 多个多元回归,如下图所示。您会注意到,此数据集描述了一个干预程序,我们正在使用 ANCOVA 程序(TIME 2 ~ TIME 1 + CONDITION)分析此数据。
om4g**TIME2**01 ~ om4g**TIME1**01 + CONDITION
示例:
om4g201 ~ om4g01 + CONDITION
以防万一有人想要可重现的代码:
dataset <- data.frame(rest201=c(10,20,30,40),
rest101=c(5,10,20,24),
omgt201=c(40,10,20,10),
omgt101=c(10,20,10,05),
CONDITION=c(0,1))
lm(rest201~rest101+CONDITION, data=dataset)
lm(omgt201~omgt101+CONDITION, data=dataset)
我在这里发现了一个与我类似的问题 (Making linear models in a for loop using R programming),但答案无效。
谢谢!
您可以为每个模型构建一个公式列表,然后使用它来构建模型。
x <- c(101, 102, 103)
mdls <- sprintf("omg4g%s ~ om4g%s + CONDITION",
as.character(x + 100),
as.character(x)
)
out <- sapply(mdls, FUN = function(x) {
formula(x, data = latino_dataset)
})
$`omg4g201 ~ om4g101 + CONDITION`
omg4g201 ~ om4g101 + CONDITION
<environment: 0x0000000009aff7b8>
$`omg4g202 ~ om4g102 + CONDITION`
omg4g202 ~ om4g102 + CONDITION
<environment: 0x0000000009afda98>
$`omg4g203 ~ om4g103 + CONDITION`
omg4g203 ~ om4g103 + CONDITION
<environment: 0x00000000099b0828>
例如
sapply(out, FUN = lm)
类似于@Roman 的回答,这里是使用 purrr
中的 map2
的方法:
library(purrr)
y_var = c("rest201", "omgt201")
x_var = list(c("rest101", "CONDITION"), c("omgt101", "CONDITION"))
map2(x_var, y_var, ~ lm(as.formula(paste(.y, "~", paste(.x, collapse = " + "))), data = dataset))
要获得每个模型的摘要 table,您可以用 summary
包装每个 lm
并提取 coefficients
table:
map2(x_var, y_var, ~ {
lm(as.formula(paste(.y, "~", paste(.x, collapse = " + "))), data = dataset) %>%
summary() %>%
`$`("coefficients")
})
结果:
[[1]]
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.779097 0.76821670 3.617596 0.17169133
rest101 1.377672 0.04750594 29.000000 0.02194371
CONDITION 3.800475 0.72163694 5.266464 0.11945968
[[2]]
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.000000e+01 16.666667 1.800000e+00 0.3228289
omgt101 -2.445145e-16 1.333333 -1.833859e-16 1.0000000
CONDITION -2.000000e+01 14.529663 -1.376494e+00 0.3999753
我想弄清楚如何设置 purrr 到 运行 多个多元回归,如下图所示。您会注意到,此数据集描述了一个干预程序,我们正在使用 ANCOVA 程序(TIME 2 ~ TIME 1 + CONDITION)分析此数据。
om4g**TIME2**01 ~ om4g**TIME1**01 + CONDITION
示例:
om4g201 ~ om4g01 + CONDITION
以防万一有人想要可重现的代码:
dataset <- data.frame(rest201=c(10,20,30,40),
rest101=c(5,10,20,24),
omgt201=c(40,10,20,10),
omgt101=c(10,20,10,05),
CONDITION=c(0,1))
lm(rest201~rest101+CONDITION, data=dataset)
lm(omgt201~omgt101+CONDITION, data=dataset)
我在这里发现了一个与我类似的问题 (Making linear models in a for loop using R programming),但答案无效。
谢谢!
您可以为每个模型构建一个公式列表,然后使用它来构建模型。
x <- c(101, 102, 103)
mdls <- sprintf("omg4g%s ~ om4g%s + CONDITION",
as.character(x + 100),
as.character(x)
)
out <- sapply(mdls, FUN = function(x) {
formula(x, data = latino_dataset)
})
$`omg4g201 ~ om4g101 + CONDITION`
omg4g201 ~ om4g101 + CONDITION
<environment: 0x0000000009aff7b8>
$`omg4g202 ~ om4g102 + CONDITION`
omg4g202 ~ om4g102 + CONDITION
<environment: 0x0000000009afda98>
$`omg4g203 ~ om4g103 + CONDITION`
omg4g203 ~ om4g103 + CONDITION
<environment: 0x00000000099b0828>
例如
sapply(out, FUN = lm)
类似于@Roman 的回答,这里是使用 purrr
中的 map2
的方法:
library(purrr)
y_var = c("rest201", "omgt201")
x_var = list(c("rest101", "CONDITION"), c("omgt101", "CONDITION"))
map2(x_var, y_var, ~ lm(as.formula(paste(.y, "~", paste(.x, collapse = " + "))), data = dataset))
要获得每个模型的摘要 table,您可以用 summary
包装每个 lm
并提取 coefficients
table:
map2(x_var, y_var, ~ {
lm(as.formula(paste(.y, "~", paste(.x, collapse = " + "))), data = dataset) %>%
summary() %>%
`$`("coefficients")
})
结果:
[[1]]
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.779097 0.76821670 3.617596 0.17169133
rest101 1.377672 0.04750594 29.000000 0.02194371
CONDITION 3.800475 0.72163694 5.266464 0.11945968
[[2]]
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.000000e+01 16.666667 1.800000e+00 0.3228289
omgt101 -2.445145e-16 1.333333 -1.833859e-16 1.0000000
CONDITION -2.000000e+01 14.529663 -1.376494e+00 0.3999753