Як покращити час роботи для внесення даних R MICE


9

Моє запитання коротко: чи існують методи покращити час роботи R MICE (внесення даних)?

Я працюю з набором даних (30 змінних, 1,3 мільйона рядків), який містить (цілком випадково) відсутні дані. Близько 8% спостережень у приблизно 15 із 30 змінних містять НС. Для того щоб імпулювати відсутні дані, я виконую функцію MICE, що є частиною пакету MICE .

Я відчуваю досить повільний час роботи, навіть на підмножині (100 000 рядків), з методом = "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")

1
Загалом: чи підходять такі питання щодо Cross Valified чи краще підходять для переповнення стека?
Дендробати

3
Це може бути виклик рішення. Оскільки (як загальний принцип) найбільш суттєві покращення часу роботи отримуються, розуміючи основні алгоритми, я б очікував, що найкращий шанс отримати дійсно ефективну відповідь може бути тут, у громаді, де люди можуть запропонувати альтернативні підходи . Якщо ви не отримаєте адекватних відповідей через день чи два, тоді просто позначте цю публікацію для міграції, і ми надішлемо її SO (разом із будь-якими відповідями та коментарями, які вона може зібрати тим часом).
whuber

1
Ви можете змінити параметр 'fastppm' на 'norma', це буде швидше
marc1s

1
Thx @ marc1s, що значно покращило великі набори даних. Для випадкового кадру даних (як вище) з 10000 рядків метод "норма" був приблизно в 4 рази швидшим, ніж "fastpmm". З 50 000 рядків це було навіть у 12 разів швидше. Отже, відносний коефіцієнт підсилення в ході роботи збільшується на кількість рядів.
Dendrobates

1
Залежно від моделі, яку ви збираєтеся запустити, можливо швидше використовувати максимальну оцінку (або максимальну ймовірність повної інформації), яка асимптотично еквівалентна імпутації, якщо модель вказана правильно. Ось документ, в якому я брав участь, в якому порівнюються різні методи: emeraldinsight.com/doi/abs/10.1108/JCP-02-2015-0007
Джеремі Майлз

Відповіді:


4

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


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)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.