【问题标题】:Loop for glm model with changing number of variables变量数量变化的 glm 模型循环
【发布时间】:2015-02-24 05:23:15
【问题描述】:

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

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

dfPRAC <- structure(list(DepVar1 = c(0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 
1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1), DepVar2 = c(0, 1, 0, 0, 
1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1), 
    IndVar1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 
    0, 0, 0, 1, 0, 0, 0, 1, 0), IndVar2 = c(1, 3, 9, 1, 5, 1, 
    1, 8, 4, 6, 3, 15, 4, 1, 1, 3, 2, 1, 10, 1, 9, 9, 11, 5), 
    IndVar3 = c(0.500100322564443, 1.64241601558441, 0.622735778490702, 
    2.42429812749226, 5.10055213237027, 1.38479786027561, 7.24663629203007, 
    0.5102348706939, 2.91566510995229, 3.73356170379198, 5.42003495939846, 
    1.29312896116503, 3.33753833987496, 0.91783513806083, 4.7735736131668, 
    1.17609362602233, 5.58010703426296, 5.6668754863739, 1.4377813063642, 
    5.07724130837643, 2.4791994535923, 2.55100067348583, 2.41043629522981, 
    2.14411703944206)), .Names = c("DepVar1", "DepVar2", "IndVar1", 
"IndVar2", "IndVar3"), row.names = c(NA, 24L), class = "data.frame")

我当前运行单个 glm 模型的代码是:

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

我尝试运行它,但出现了几个错误。任何建议将不胜感激。

【问题讨论】:

  • 你得到什么错误?
  • 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 个元素: 只使用第一个

标签: r loops glm


【解决方案1】:

也许是这样的:

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

【讨论】:

  • 这很好用!感谢您的建议。不过有两个快速的问题。 1)我怎样才能知道模型在哪个因变量上运行?仅记录自变量。 2)有没有办法从中获得p值?以及准确的预测率?我过去使用“ClassLog”来获得 % 预测,但不知道如何应用它?
  • 添加名称效果很好!但是,提取 p 值问题是指特定模型。如果我有 1,000 个模型并且我想检查所有模型的 p 值,我可以使用单个命令而不是为每个模型运行它吗?
  • 感谢您添加 p 值行。不幸的是,它只返回单个模型的 p 值。是否可以只使用几行代码来获取变量组合的所有 p 值,以便我可以轻松地比较它们?
  • 已更新。查看 2 个更改:1) ind_vars 使用所有值组合进行更新,2) p_values 扩展
猜你喜欢
  • 2020-08-24
  • 2016-07-05
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
相关资源
最近更新 更多