【问题标题】:Automatically compare nested models from mice's glm.mids自动比较来自小鼠 glm.mids 的嵌套模型
【发布时间】:2014-10-29 00:54:14
【问题描述】:

我有一个来自 R 的 mice 包的多重估算模型,其中有很多因子变量。例如:

library(mice)
library(Hmisc)

# turn all the variables into factors
fake = nhanes
fake$age = as.factor(nhanes$age)
fake$bmi = cut2(nhanes$bmi, g=3) 
fake$chl = cut2(nhanes$chl, g=3) 

head(fake)
  age         bmi hyp       chl
1   1        <NA>  NA      <NA>
2   2 [20.4,25.5)   1 [187,206)
3   1        <NA>   1 [187,206)
4   3        <NA>  NA      <NA>
5   1 [20.4,25.5)   1 [113,187)
6   3        <NA>  NA [113,187)

imput = mice(nhanes)

# big model
fit1 = glm.mids((hyp==2) ~ age + bmi + chl, data=imput, family = binomial)

我想通过针对每次删除一个变量的每个可能的嵌套模型测试完整模型来测试模型中每个整个因子变量的重要性(而不是每个级别的指示变量) .手动,我可以做到:

# small model (no chl)
fit2 = glm.mids((hyp==2) ~ age + bmi, data=imput, family = binomial)

# extract p-value from pool.compare
pool.compare(fit1, fit2)$pvalue

如何为模型中的所有因子变量自动执行此操作?非常有用的功能drop1 被建议给我a previous question——现在我想做一些与mice 完全一样的事情,除了mice

可能有用的说明:pool.compare 的一个烦人的特性是,它似乎希望将较大模型中的“额外”变量放在与较小模型共享的变量之后。

【问题讨论】:

    标签: r anova categorical-data r-mice


    【解决方案1】:

    在按照pool.compare 所需的顺序排列预测变量后,您可以使用循环遍历预测变量的不同组合。

    所以使用上面的 fake 数据 - 调整了类别的数量

    library(mice)
    library(Hmisc)
    # turn all the variables into factors
    # turn all the variables into factors
    fake <- nhanes
    fake$age <- as.factor(nhanes$age)
    fake$bmi <- cut2(nhanes$bmi, g=2) 
    fake$chl <- cut2(nhanes$chl, g=2) 
    
    # Impute
    imput <- mice(fake, seed=1)
    
    # Create models 
    # - reduced models with one variable removed
    # - full models with extra variables at end of expression
    vars <- c("age", "bmi", "chl")
    
    red <- combn(vars, length(vars)-1 , simplify=FALSE)
    diffs <- lapply(red, function(i) setdiff(vars, i) )
    (full <- lapply(1:length(red), function(i) 
                                paste(c(red[[i]], diffs[[i]]), collapse=" + ")))
    #[[1]]
    #[1] "age + bmi + chl"
    
    #[[2]]
    #[1] "age + chl + bmi"
    
    #[[3]]
    #[1] "bmi + chl + age"
    
    (red <- combn(vars, length(vars)-1 , FUN=paste, collapse=" + "))
    #[1] "age + bmi" "age + chl" "bmi + chl"
    

    模型现在以正确的顺序传递给glm 调用。我还替换了 glm.mids 方法,因为它已被 with.mids 替换 - 请参阅 ?glm.mids

    out <- vector("list", length(red))
    
    for( i in 1:length(red)) {
    
      redMod <-  with(imput, 
                   glm(formula(paste("(hyp==2) ~ ", red[[i]])), family = binomial))
    
      fullMod <-  with(imput, 
                   glm(formula(paste("(hyp==2) ~ ", full[[i]])), family = binomial))
    
      out[[i]] <- list(predictors = diffs[[i]], 
                       pval = c(pool.compare(fullMod, redMod)$pvalue))
       }
    
    do.call(rbind.data.frame, out)
    #    predictors      pval
    #2         chl 0.9976629
    #21        bmi 0.9985028
    #3         age 0.9815831
    
    # Check manually by leaving out chl
    mod1 <- with(imput, glm((hyp==2) ~ age + bmi + chl , family = binomial))
    mod2 <- with(imput, glm((hyp==2) ~ age + bmi , family = binomial))
    pool.compare(mod1, mod2)$pvalue
    #         [,1]
    #[1,] 0.9976629
    

    使用这个数据集你会收到很多警告

    编辑

    你可以把它包装在一个函数中

    impGlmDrop1 <- function(vars, outcome, Data=imput,  Family="binomial") 
    {
    
      red <- combn(vars, length(vars)-1 , simplify=FALSE)
      diffs <- lapply(red, function(i) setdiff(vars, i))
      full <- lapply(1:length(red), function(i) 
                          paste(c(red[[i]], diffs[[i]]), collapse=" + "))
      red <- combn(vars, length(vars)-1 , FUN=paste, collapse=" + ")
    
      out <- vector("list", length(red))
      for( i in 1:length(red)) {
    
      redMod <-  with(Data, 
                  glm(formula(paste(outcome, red[[i]], sep="~")), family = Family))
      fullMod <-  with(Data, 
                  glm(formula(paste(outcome, full[[i]], sep="~")), family = Family))
      out[[i]] <- list(predictors = diffs[[i]], 
                       pval = c(pool.compare(fullMod, redMod)$pvalue)  )
      }
      do.call(rbind.data.frame, out)
    }
    
    # Run
    impGlmDrop1(c("age", "bmi", "chl"), "(hyp==2)")
    

    【讨论】:

    • 这太棒了;谢谢你!我将使用此功能来处理即将提交的论文。如果您对此感到满意,我将非常乐意承认您。
    • 好东西,不客气 - 很高兴它有效。干杯,但无需承认 - 所有 S.V.布伦的努力。 (我确定你注意到了这一点,但 pool.compare 的默认测试是 Wald 近似值,所以如果你使用逻辑回归,你应该改变它)
    • 是的,我确实改变了它。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多