【发布时间】:2020-11-12 08:19:53
【问题描述】:
下面的代码目前针对每个结果的每次曝光(每个结果 3 次曝光)运行未经调整的 glm,并将结果导出到列表中。对于每次曝光,我需要 3 个模型: model 1:未调整(我们目前有),model 2:针对 cov1 进行了调整,model 3:针对 cov1、cov2 和 cov3 进行了调整
我将如何在这段代码中实现不同的模型?
amino_df <- data.frame(y = rbinom(100, 1, 0.5), y2 = rbinom(100, 1, 0.3), y3 = rbinom(100, 1, 0.2), y4 = rbinom(100, 1, 0.22),
exp1 = rnorm(100), exp2 = rnorm(100), exp3 = rnorm(100),
cov1 = rnorm(100), cov2 = rnorm(100), cov3 = rnorm(100))
exp <- c("exp1", "exp2", "exp3")
y <- c("y", "y2","y3","y4")
cov <- c("cov1", "cov2", "cov3")
obs_results <- replicate(length(y), data.frame())
for(j in seq_along(y)){
for (i in seq_along(exp)){
mod <- as.formula(paste(y[j], "~", exp[i]))
glmmodel <- glm(formula = mod, family = binomial, data = amino_df)
obs_results[[j]][i,1] <- names(coef(glmmodel))[2]
obs_results[[j]][i,2] <- exp(glmmodel$coefficients[2])
obs_results[[j]][i,3] <- summary(glmmodel)$coefficients[2,2]
obs_results[[j]][i,4] <- summary(glmmodel)$coefficients[2,4]
obs_results[[j]][i,5] <- exp(confint.default(glmmodel)[2,1])
obs_results[[j]][i,6] <- exp(confint.default(glmmodel)[2,2])
}
colnames(obs_results[[j]]) <- c("exposure","OR", "SE", "P_value", "95_CI_LOW","95_CI_HIGH")
}
names(obs_results) <- y
obs_df <- do.call("rbind", lapply(obs_results, as.data.frame))
编辑 - 我现在有一个解决方案:
还有一个问题,下面的代码是否可以调整为包含针对不同曝光的不同模型?所以对于 exp1,调整所有 3 个缺点:cov1、cov2、cov3,但对于 exp2,只调整 cov1、cov2?只有 exp3 cov2 和 cov1?
amino_df <- data.frame(y = rbinom(100, 1, 0.5), y2 = rbinom(100, 1, 0.3),
y3 = rbinom(100, 1, 0.2), y4 = rbinom(100, 1, 0.22),
exp1 = rnorm(100), exp2 = rnorm(100), exp3 = rnorm(100),
cov1 = rnorm(100), cov2 = rnorm(100), cov3 = rnorm(100))
exp <- c("exp1", "exp2", "exp3")
y <- c("y", "y2","y3","y4")
model <- c("", "+ cov1", "+ cov1 + cov2 + cov3")
obs_df <- lapply(y, function(j){
lapply(exp, function(i){
lapply(model, function(h){
mod = as.formula(paste(j, "~", i, h))
glmmodel = glm(formula = mod, family = binomial, data = amino_df)
obs_results = data.frame(
outcome = j,
exposure = names(coef(glmmodel))[2],
covariate = h,
OR = exp(glmmodel$coefficients[2]),
SE = summary(glmmodel)$coefficients[2,2],
P_value = summary(glmmodel)$coefficients[2,4],
`95_CI_LOW` = exp(confint.default(glmmodel)[2,1]),
`95_CI_HIGH` = exp(confint.default(glmmodel)[2,2])
)
return(obs_results)
}) %>% bind_rows
}) %>% bind_rows
}) %>% bind_rows %>% `colnames<-`(gsub("X95","95",colnames(.))) %>% `rownames<-`(NULL)
head(obs_df)
【问题讨论】: