首页 文章

使用来自{mice}包的as.mids()时,插补数属性是否错误?

提问于
浏览
2

我对R来说比较新,对论坛来说也是新手,所以我可能不知道一些发布规则(善意) .

我的问题与Stef van Buuren在鼠标包中的as.mids()函数有关:当使用它时,新mids对象中的数据很好,但属性中的插补数量是原始1 .

示例(利用原始as.mids()示例和鼠标包中的数据):

imp <- mice(boys, print = FALSE, maxit = 1) #using the default number of imputations m = 5
X <- complete(imp, action = "long", include = TRUE)
test <- as.mids(X)

创建的对象现在显示:插补数= 6(而不是5),不知何故也影响分析,如之间的区别所示

fit <- with(imp, lm(bmi ~ age))
round(summary(pool(fit)), 2)
fit2 <- with(test, lm(bmi ~ age))
round(summary(pool(fit2)), 2).

在查看as.mids()的代码时,一个小的改变似乎可以解决这个问题,但我的R知识确实需要第二个意见 .

原始as.mids()代码如下:

function (data, .imp = 1, .id = 2) 
{
  ini <- mice(data[data[, .imp] == 0, -c(.imp, .id)], m = max(as.numeric(data[, 
                                                                              .imp])), maxit = 0)
  names <- names(ini$imp)
  if (!is.null(.id)) {
    rownames(ini$data) <- data[data[, .imp] == 0, .id]
  }
  for (i in 1:length(names)) {
    for (m in 1:(max(as.numeric(data[, .imp])) - 1)) {
      if (!is.null(ini$imp[[i]])) {
        indic <- data[, .imp] == m & is.na(data[data[, 
                                                     .imp] == 0, names[i]])
        ini$imp[[names[i]]][m] <- data[indic, names[i]]
      }
    }
  }
  return(ini)
}

现在修改ini(3行)定义中鼠标调用中的m参数似乎可以解决它(仅考虑max(as.numeric())给出级别数的事实,因此包括原始数据,这可能不是真的):

as.mids.mod <- function(data, .imp = 1, .id = 2){
  ini <- mice(data[data[, .imp] == 0, -c(.imp, .id)], m = (max(as.numeric(data[, .imp])) -1), maxit = 0)
  names <- names(ini$imp)
  if (!is.null(.id)) {
    rownames(ini$data) <- data[data[, .imp] == 0, .id]
  }
  for (i in 1:length(names)) {
    for (m in 1:(max(as.numeric(data[, .imp])) - 1)) {
      if (!is.null(ini$imp[[i]])) {
        indic <- data[, .imp] == m & is.na(data[data[, .imp] == 0, names[i]])
        ini$imp[[names[i]]][m] <- data[indic, names[i]]
      }
    }
  }
  return(ini)

现在在示例中使用as.mids.mod可以得到类似的分析结果:

imp <- mice(boys, print = FALSE, maxit = 1)
data <- complete(imp, action = "long", include = TRUE)
test <- as.mids(data)
test2 <- as.mids.mod(data)

fit <- with(imp, lm(bmi ~ age))
round(summary(pool(fit)), 2)
fit3 <- with(test2, lm(bmi ~ age))
round(summary(pool(fit3)), 2)

我在使用函数和/或解决问题时做错了什么,或者as.mids()函数是否应该稍微修改一下?

1 回答

  • 2

    谢谢你提出这个问题 . 以下工作示例中的函数 as.mids2() 生成所需的 mids 对象 .

    as.mids2 <- function(data2, .imp=1, .id=2){
        ini <- mice(data2[data2[, .imp] == 0, -   c(.imp, .id)], m =   max(as.numeric(levels(data2[,  .imp]))), maxit=0)
        names  <- names(ini$imp)
        if (!is.null(.id)){
            rownames(ini$data) <- data2[data2[, .imp] == 0, .id]
        }
        for (i in 1:length(names)){
            for(m in 1:(max(as.numeric(levels(data2[,  .imp]))))){
                if(!is.null(ini$imp[[i]])){
                     indic <- data2[, .imp] == m &  is.na(data2[data2[, .imp]==0, names[i]])
                    ini$imp[[names[i]]][m] <- data2[indic, names[i]]
                }
            } 
        }
        return(ini)
    }
    
    require(mice)
    imp <- mice(nhanes)
    com <- complete(imp, "long", include = TRUE)
    
    imp2 <- as.mids2(com)
    com2 <- complete(imp2, "long", include = TRUE)
    all(na.omit(com == com2))
    

相关问题