Как улучшить время выполнения для импутации данных R MICE

9

Мой вопрос вкратце: есть ли способы улучшить время работы R MICE (вменение данных)?

Я работаю с набором данных (30 переменных, 1,3 миллиона строк), который содержит (совершенно случайно) недостающие данные. Около 8% наблюдений примерно в 15 из 30 переменных содержат НК. Чтобы вложить недостающие данные, я запускаю функцию 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")
Dendrobates
источник
1
В целом: подходят ли подобные вопросы к перекрестной проверке или лучше подходят для переполнения стека?
Dendrobates
3
Это может быть решение суда. Поскольку (как общий принцип) наиболее существенные улучшения во времени выполнения достигаются путем понимания базовых алгоритмов, я ожидаю, что ваш лучший шанс получить действительно эффективный ответ может быть здесь, в сообществе, где люди могут предложить альтернативные подходы. , Если вы не получите адекватных ответов в течение дня или двух, просто пометьте этот пост для переноса, и мы отправим его в SO (вместе с любыми ответами и комментариями, которые он мог собрать за это время).
whuber
1
Вы можете изменить опцию 'fastppm' на 'norm', она будет быстрее
marc1s
1
Thx @ marc1s, это значительно улучшило работу с большими наборами данных. Для случайного фрейма данных (как указано выше) с 10000 строк метод "норма" был примерно в 4 раза быстрее, чем "fastpmm". С 50000 строк это было даже в 12 раз быстрее. Следовательно, относительный выигрыш во времени выполнения увеличивается на количество строк.
Dendrobates
1
В зависимости от модели, которую вы собираетесь запустить, может быть быстрее использовать оценку максимального правдоподобия (или максимальной вероятности полной информации), которая асимптотически эквивалентна вменению, если модель задана правильно. Вот статья, в которой я участвовал, в которой сравниваются различные методы: emeraldinsight.com/doi/abs/10.1108/JCP-02-2015-0007
Джереми Майлз,

Ответы:

4

Вы можете использовать quickpred()из miceпакета, с помощью которого вы можете ограничить предикторы, указав mincor (Минимальная корреляция) и minpuc (пропорция используемых случаев). Также вы можете использовать параметры exclude и include для управления предикторами.

Aanish
источник
2

Я сделал обертку для 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)
}
Бен Огорек
источник