R 变量个数变化的glm模型的循环

R 变量个数变化的glm模型的循环,r,loops,glm,R,Loops,Glm,我有一个数据集,包含1-3个版本的因变量和10-15个自变量。我想为模型运行一个glm命令,但希望它为所有可能的自变量组合循环。我从来没有为循环编写过代码,我想确保我正确地设置了循环 下面是我的数据框的一小部分。实际数据帧对每个变量都有一个明确的名称;不仅仅是“DepVar1”或“IndVar1” 我试着运行它,但出现了几个错误。如果您有任何建议,我们将不胜感激。可能是这样的: dep_vars <- c("DepVar1", "DepVar2") ind_vars <- c("I

我有一个数据集,包含1-3个版本的因变量和10-15个自变量。我想为模型运行一个glm命令,但希望它为所有可能的自变量组合循环。我从来没有为循环编写过代码,我想确保我正确地设置了循环

下面是我的数据框的一小部分。实际数据帧对每个变量都有一个明确的名称;不仅仅是“DepVar1”或“IndVar1”


我试着运行它,但出现了几个错误。如果您有任何建议,我们将不胜感激。

可能是这样的:

dep_vars <- c("DepVar1", "DepVar2") 
ind_vars <- c("IndVar1", "IndVar2", "IndVar3")

# create all combinations of ind_vars
ind_vars_comb <- 
  unlist( sapply( seq_len(length(ind_vars)), 
          function(i) {
               apply( combn(ind_vars,i), 2, function(x) paste(x, collapse = "+"))
          }))

# pair with dep_vars:
var_comb <- expand.grid(dep_vars, ind_vars_comb ) 

# formulas for all combinations
formula_vec <- sprintf("%s ~ %s", var_comb$Var1, var_comb$Var2)

# create models
glm_res <- lapply( formula_vec, function(f)   {
    fit1 <- glm( f, data = dfPRAC, family = binomial("logit"))
    fit1$coefficients <- coef( summary(fit1))
    return(fit1)
})
names(glm_res) <- formula_vec

# get model for specific formula
glm_res[["DepVar1 ~ IndVar1"]] 

# coefficients for var1 ~ var1
coef(glm_res[["DepVar1 ~ IndVar1"]])

# p-values for var1 ~ var2
coef(glm_res[["DepVar1 ~ IndVar2"]])[,"Pr(>|z|)"]

# p-values in a data.frame
p_values <- 
  cbind(formula_vec, as.data.frame ( do.call(rbind,
        lapply(glm_res, function(x) {
          coefs <- coef(x)
          rbind(c(coefs[,4] , rep(NA, length(ind_vars) - length(coefs[,4]) + 1)))
        })
  )))

您会得到什么错误?model.frame.default(formula=DepVar1~i,data=dfPRAC,drop.unused.levels=TRUE)中的错误:变量长度不同(为“i”找到)此外:警告消息:1:dfPRAC$IndVar1:dfPRAC$IndVar3中:数值表达式有24个元素:仅第一个使用的2:dfPRAC$IndVar1:dfPRAC$IndVar3中:数值表达式有24个元素:仅第一个使用的元素此操作正常!谢谢你的建议。不过有两个简单的问题。1) 如何判断模型运行的因变量?仅注明自变量。还有2)有没有办法也从中得到p值?以及准确的预测率?我以前使用过“ClassLog”来获得%预测,但不确定如何应用它?请参阅添加名称非常有效!然而,提取p值问题涉及一个特定的模型。如果我有1000个模型,并且我想检查所有模型的p值,我可以用一个命令而不是为每个模型运行它吗?感谢添加p值行。不幸的是,它只返回单个模型的p值。是否可以只使用几行代码来获取变量组合的所有p值,以便我可以轻松比较它们?更新。请参阅2项更改:1)使用所有值的组合更新ind_变量,2)扩展p_值
RegPRAC <- glm(DepVar1 ~ IndVar1, data=dfPRAC, family=binomial("logit"))
summary(RegPRAC)
for (i in dfPRAC$IndVar1:dfPRAC$IndVar3) {glm(DepVar1 ~ i, data=dfPRAC, family=binomial("logit")) }
dep_vars <- c("DepVar1", "DepVar2") 
ind_vars <- c("IndVar1", "IndVar2", "IndVar3")

# create all combinations of ind_vars
ind_vars_comb <- 
  unlist( sapply( seq_len(length(ind_vars)), 
          function(i) {
               apply( combn(ind_vars,i), 2, function(x) paste(x, collapse = "+"))
          }))

# pair with dep_vars:
var_comb <- expand.grid(dep_vars, ind_vars_comb ) 

# formulas for all combinations
formula_vec <- sprintf("%s ~ %s", var_comb$Var1, var_comb$Var2)

# create models
glm_res <- lapply( formula_vec, function(f)   {
    fit1 <- glm( f, data = dfPRAC, family = binomial("logit"))
    fit1$coefficients <- coef( summary(fit1))
    return(fit1)
})
names(glm_res) <- formula_vec

# get model for specific formula
glm_res[["DepVar1 ~ IndVar1"]] 

# coefficients for var1 ~ var1
coef(glm_res[["DepVar1 ~ IndVar1"]])

# p-values for var1 ~ var2
coef(glm_res[["DepVar1 ~ IndVar2"]])[,"Pr(>|z|)"]

# p-values in a data.frame
p_values <- 
  cbind(formula_vec, as.data.frame ( do.call(rbind,
        lapply(glm_res, function(x) {
          coefs <- coef(x)
          rbind(c(coefs[,4] , rep(NA, length(ind_vars) - length(coefs[,4]) + 1)))
        })
  )))
                         formula_vec (Intercept)    IndVar1         V3        V4
1                  DepVar1 ~ IndVar1  1.00000000 1.00000000         NA        NA
2                  DepVar2 ~ IndVar1  0.65526203 0.29437334         NA        NA
3                  DepVar1 ~ IndVar2  0.29307777 0.19121066         NA        NA
4                  DepVar2 ~ IndVar2  0.07298241 0.03858791         NA        NA
5                  DepVar1 ~ IndVar3  0.99950535 0.99940963         NA        NA
6                  DepVar2 ~ IndVar3  0.52105212 0.44715614         NA        NA
7          DepVar1 ~ IndVar1+IndVar2  0.31112860 0.76310468 0.18416266        NA
8          DepVar2 ~ IndVar1+IndVar2  0.06488501 0.08833369 0.03031766        NA
9          DepVar1 ~ IndVar1+IndVar3  0.99952006 0.99999188 0.99940957        NA
10         DepVar2 ~ IndVar1+IndVar3  0.38508258 0.29593637 0.45010697        NA
11         DepVar1 ~ IndVar2+IndVar3  0.28167430 0.15753070 0.54363164        NA
12         DepVar2 ~ IndVar2+IndVar3  0.22644873 0.04654188 0.84059019        NA
13 DepVar1 ~ IndVar1+IndVar2+IndVar3  0.27858393 0.71600105 0.14812808 0.5222330
14 DepVar2 ~ IndVar1+IndVar2+IndVar3  0.15634739 0.08611677 0.02889574 0.7449513