如何提高 R MICE 数据插补的运行时间

机器算法验证 r 多重插补 老鼠
2022-03-03 17:10:09

简而言之,我的问题是:有没有办法改善 R MICE(数据插补)的运行时间?

我正在处理一个包含(相当随机)缺失数据的数据集(30 个变量,130 万行)。在 30 个变量中,约有 15 个变量中约有 8% 的观测值包含 NA。为了估算丢失的数据,我正在运行 MICE 函数,它是MICE包的一部分。

我的运行时间很慢,即使在一个子集(100,000 行)上,使用 method="fastpmm" 和 m=1 并运行大约 15 分钟。

有没有办法在不损失太多性能的情况下提高运行时间?(mice.impute.mean 非常快,但会丢失重要的信息!)。

可重现的代码:

library(mice)
df <- data.frame(replicate(30,sample(c(NA,1:10),1000000,rep=TRUE)))
df <- data.frame(scale(df))

output <- mice(df, m=1, method = "fastpmm")
2个回答

您可以使用quickpred()frommice包,您可以通过指定mincor(最小相关性)和minpuc(可用案例的比例)来限制预测变量。您还可以使用排除和包含参数来控制预测变量。

mice我为包含一个额外参数的函数制作了一个包装器droplist,您可以在其中传递一个您希望在插补公式右侧使用的预测变量的字符向量。这是为了速度,因为我发现具有多个级别的因子变量会大大减慢插补速度我不知道quickpred@Aanish 引用的函数,也许您可​​以同时使用这两个概念。

下面是出现在我的glmmplus包中的函数。如果你觉得它有用,我可能会在实际mice包中打开一个拉取请求。

ImputeData <- function(data, m = 10, maxit = 15, droplist = NULL) {
  if (length(intersect(names(data), droplist)) < length(droplist)) {
    stop("Droplist variables not found in data set")
  }
  predictorMatrix <- (1 - diag(1, ncol(data)))
  for (term in droplist) {
  drop.index <- which(names(data) == term)
    predictorMatrix[, drop.index] <- 0
  }
  mids.out <- mice(data, m = m, maxit = maxit,
                   predictorMatrix = predictorMatrix)
  return(mids.out)
}