如何向laply传递多个参数以批量执行回归模型?
解决方案
当然可以实现,以下是几种可行的方法:
方法1:使用plyr::laply结合do.call
因为你的models列表每个元素是包含三个参数的向量,而run_regressions2需要三个独立参数,所以可以用do.call把向量拆成参数传递,结合laply完成迭代:
library(plyr) set.seed(1) df <- data.frame(x1 = rnorm(100, 0, 1), x2 = rnorm(100, 0, 1), y1 = rnorm(100, 0, 1), y2 = rnorm(100, 0, 1), t2 = sample(0:1, 100, replace = TRUE), t1 = sample(0:1, 100, replace = TRUE)) run_regressions2 <- function(outcome, treatment, covariates) { # 优化公式拼接,避免协变量为空时出现多余的+号 rhs <- paste(c(treatment, covariates), collapse = " + ") model_formula <- formula(paste(outcome, "~", rhs)) model <- glm(model_formula, data = df) return(summary(model)$coefficients[2,]) } models <- list(c("y1", "t1", "x1"), c("y2", "t2", "x1 + x2")) # 用laply执行,通过do.call传递参数 results <- laply(models, function(x) do.call(run_regressions2, as.list(x))) results
原理说明
- 每次迭代时,
laply会把models中的单个向量(比如c("y1","t1","x1"))传给匿名函数的x参数 as.list(x)把向量转成列表list("y1","t1","x1"),do.call会自动将列表元素依次作为run_regressions2的三个参数传入
方法2:使用base R的sapply/vapply
如果不想依赖plyr,可以用base R的函数实现相同效果:
# sapply版本,转置后和laply结果格式一致 results <- t(sapply(models, function(x) do.call(run_regressions2, as.list(x)))) # vapply更严谨,指定返回值类型(这里是长度为4的数值向量,对应系数、标准误、t值、p值) results <- t(vapply(models, function(x) do.call(run_regressions2, as.list(x)), FUN.VALUE = numeric(4)))
方法3:使用purrr(现代tidyverse工具)
如果你熟悉tidyverse生态,purrr::map_dfr或map_dfc可以更直观地处理,还能直接得到数据框格式的结果:
library(purrr) # 返回数据框,每行对应一个模型的结果 results_df <- map_dfr(models, function(x) { res <- do.call(run_regressions2, as.list(x)) as.data.frame(t(res)) }) # 如果需要数组格式,转成矩阵即可 results_matrix <- as.matrix(results_df)
内容的提问来源于stack exchange,提问作者Rob F
相关产品推荐
相关产品推荐

