【问题标题】:Stacking lapply results堆叠 lapply 结果
【发布时间】:2018-11-22 03:46:26
【问题描述】:

我正在使用以下代码生成数据,并且我正在跨变量列表(covar1 和 covar2)估计回归模型。我还为系数创建了置信区间并将它们合并在一起。

我一直在这里和其他网站上检查各种示例,但我似乎无法完成我想要的。我想将每个 covar 的结果堆叠到一个数据框中,通过它归属的 covar(即“covar1”和“covar2”)标记每个结果集群。下面是使用 lapply 生成数据和结果的代码:

##creating a fake dataset (N=1000, 500 at treated, 500 at control group)
#outcome variable
outcome <- c(rnorm(500, mean = 50, sd = 10),  rnorm(500, mean = 70, sd = 10))

#running variable
running.var <- seq(0, 1, by = .0001)
running.var <- sample(running.var, size = 1000, replace = T)

##Put negative values for the running variable in the control group
running.var[1:500] <- -running.var[1:500]

#treatment indicator (just a binary variable indicating treated and control groups)
treat.ind <- c(rep(0,500), rep(1,500))

#create covariates
set.seed(123)
covar1 <- c(rnorm(500, mean = 50, sd = 10), rnorm(500, mean = 50, sd = 20))
covar2 <- c(rnorm(500, mean = 10, sd = 20), rnorm(500, mean = 10, sd = 30))
data <- data.frame(cbind(outcome, running.var, treat.ind, covar1, covar2))
data$treat.ind <- as.factor(data$treat.ind)

#Bundle the covariates names together
covars <- c("covar1", "covar2")

#loop over them using a convenient feature of the "as.formula" function
models <- lapply(covars, function(x){
  regres <- lm(as.formula(paste(x," ~ running.var + treat.ind",sep = "")), data = d)
  ci <-confint(regres, level=0.95)
  regres_ci <- cbind(summary(regres)$coefficient, ci)
})
names(models) <- covars
print(models)

非常感谢任何朝着正确方向的推动,或指向我尚未遇到的帖子的链接。

【问题讨论】:

  • 代码中的d是什么?
  • lapply() 内的lm() 调用中,d 是否意味着data?此外,如果您可以概述预期的输出(预期数据框的尺寸和名称),这将有所帮助
  • 上面的好点,我猜像models %&gt;% purrr::map_df(broom::tidy, .id = "covar_id") 这样的东西会接近你想要的

标签: r


【解决方案1】:

你可以使用do.call,第二个参数是一个列表(like in here):

do.call(rbind, models)

我对您的lapply 函数进行了(可能的)改进。这样您就可以将估计的参数和变量保存在data.frame 中:

models <- lapply(covars, function(x){
  regres <- lm(as.formula(paste(x," ~ running.var + treat.ind",sep = "")), data = data)
  ci <-confint(regres, level=0.95)
  regres_ci <- data.frame(covar=x,param=rownames(summary(regres)$coefficient),
                          summary(regres)$coefficient, ci)
})

do.call(rbind,models)

【讨论】:

  • 谢谢!这很简洁,给了我我需要的东西。非常感谢!
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2022-06-14
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多