我的最终目标是能够创建一个循环,通过多个混合二项逻辑回归模型,使用在单独的数据框中指定的不同公式,或在数据框中为模型指定的列。
df2在每一行中都有公式。为了简单起见,我只包含了同样的10个公式,但我最终会运行10个不同的公式。
我合并df1(数据模型)和df2(公式模型)到df3的情况下,一切都需要在一个数据集。
我正在使用gamlj包函数gamljGlmMixed拟合模型。
如果可以通过列或df2中的公式进行循环,那么我将创建代码从每个模型中提取AIC和BIC,以最终选择最佳选项。
在最后,我包含了用于拟合不带循环的模型的代码。
#install gamlj from github if needed
devtools::install_github("gamlj/gamlj")
#load packages
library(tidyverse)
library(gamlj)
#add example data
df1 <- read.csv("https://stats.idre.ucla.edu/stat/data/hdp.csv")
df1
#data with formulas for loop
df2 <- structure(list(Column1 = c("remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)",
"remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)", "remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)",
"remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)", "remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)",
"remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)", "remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)",
"remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)", "remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)",
"remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID)")), row.names = c(NA,
-10L), class = "data.frame")
#Merge data sets by row #
#Now loop again to add distance in
df1 <- df1 %>% mutate(Row_ = row_number())
df2 <- df2 %>% mutate(Row_ = row_number())
df3 <- merge(df1, df2, by="Row_", all = T)
df3
gamlj::gamljGlmMixed(
formula = remission ~ 1 + IL6 + CRP +(1 + IL6 + CRP | DID),
data = df3,
showParamsCI = TRUE,
showExpbCI = FALSE,
modelSelection = "custom",
custom_family = "binomial",
custom_link = "logit")
在字符向量中使用df1
和df2
的公式,您可以尝试使用as.formula
循环公式并将所有结果存储在列表中(如下所示)。虽然我使用标准的glm
是为了一般化,但对于gamlj::gamljGlmMixed
也应该是一样的。不需要df3
,所以分析数据将是df1
。
# just need a character vector for the model formulas
fmlas <- unlist(df2)
model_list <- list()
for (xx in fmlas){
model_list[[xx]] <- glm(as.formula(xx), data = df1)
}
或为您的模型:
for (xx in fmlas){
model_list[[xx]] <- gamlj::gamljGlmMixed(
formula = as.formula(xx),
data = df1,
showParamsCI = TRUE,
showExpbCI = FALSE,
modelSelection = "custom",
custom_family = "binomial",
custom_link = "logit"
)
}
[注意,在示例数据中,循环将继续覆盖列表位置,因为示例数据中的所有公式都是相同的。]