r语言 - 通过混合二项逻辑回归模型使用数据集的一列中的公式进行循环



我的最终目标是能够创建一个循环,通过多个混合二项逻辑回归模型,使用在单独的数据框中指定的不同公式,或在数据框中为模型指定的列。

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")

在字符向量中使用df1df2的公式,您可以尝试使用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"
)
}

[注意,在示例数据中,循环将继续覆盖列表位置,因为示例数据中的所有公式都是相同的。]

最新更新