R语言 如何将多个参数传递给laply?

jv4diomz  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(126)

我想运行一系列回归模型,并将与特定协变量相关的输出放入数组。我已经能够使用plyr包中的laply来实现这一点,如下所示:

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_regressions <- function(model) {
  model <- glm(model, data = df)
  return(summary(model)$coefficients[2,])
}

models <- list("y1 ~ t1 + x1",
               "y2 ~ t2 + x1 + x2")

results <- laply(models, run_regressions)
results

字符串
现在我想扩展它,以便我可以将回归模型的不同元素分别传递给run_regressions函数。回归函数的定义如下

run_regressions2 <- function(outcome, treatment, covariates) {
  model <- glm(paste(outcome, " ~ ", treatment, " + ", covariates), data = df)
  return(summary(model)$coefficients[2,])
}


其中要运行的特定模型被指定为

models <- list(c("y1", "t1", "x1"),
               c("y2", "t2", "x1 + x2"))


有没有一些方法可以使用laply或其他函数来实现这一点?
我试着在plyr文档中搜索类似的例子,并在SO中搜索类似的问题,但没有找到任何结果。

qf9go6mv

qf9go6mv1#

正如@jdobres所提到的,plyr已经退休很久了。有很多现代的替代品,如dplyrpurrr包。
一种选择是在R基中使用lapply。在这种情况下,第一种情况将更改为

models <- list("y1 ~ t1 + x1", "y2 ~ t2 + x1 + x2")
results <- lapply(models, run_regressions)
results

#[[1]]
#   Estimate  Std. Error     t value    Pr(>|t|) 
#-0.42628388  0.20517578 -2.07765211  0.04038316 

#[[2]]
#  Estimate Std. Error    t value   Pr(>|t|) 
#-0.2966993  0.1991987 -1.4894639  0.1396433

字符串
在第二种情况下,您可以继续使用lapply-

models <- list(c("y1", "t1", "x1"),c("y2", "t2", "x1 + x2"))

lapply(seq_along(models), \(x) 
      run_regressions2(models[[x]][1], models[[x]][2], models[[x]][3]))


或者更一般地,对任意数量的参数使用do.call

lapply(seq_along(models), \(x) do.call(run_regressions2, as.list(models[[x]])))

5lwkijsr

5lwkijsr2#

@Ronak Shah的最终解决方案的替代方案,而不必使用models两次,将是:

lapply(lapply(models, as.list), do.call, what=run_regressions2)

字符串
内部的lapplymodels更改为列表的列表,然后将其用作do.call的参数。

相关问题