Jak poprawić czas działania imputacji danych R MICE

9

Moje pytanie w skrócie: czy istnieją metody poprawy czasu działania R MICE (imputacja danych)?

Pracuję z zestawem danych (30 zmiennych, 1,3 miliona wierszy), który zawiera (dość losowo) brakujące dane. Około 8% obserwacji w około 15 z 30 zmiennych zawiera NA. Aby przypisać brakujące dane, uruchamiam funkcję MICE, część pakietu MICE .

Doświadczam dość wolnego czasu działania, nawet na podzbiorze (100 000 wierszy), przy metodzie = „fastpmm” im = 1 i działa przez około 15 minut.

Czy istnieje sposób na poprawę czasu pracy bez utraty wydajności? (mice.impute.mean jest dość szybki, ale wiąże się z istotną utratą informacji!).

Powtarzalny kod:

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
źródło
1
Ogólnie: czy tego rodzaju pytania są odpowiednie w przypadku weryfikacji krzyżowej, czy lepiej nadają się do przepełnienia stosu?
Dendrobates
3
Może to być wyrok sądu. Ponieważ (zgodnie z ogólną zasadą) najistotniejsze usprawnienia w zakresie czasu działania są uzyskiwane dzięki zrozumieniu podstawowych algorytmów, spodziewałbym się, że Twoja najlepsza szansa na uzyskanie naprawdę skutecznej odpowiedzi może być tutaj, w społeczności, w której ludzie mogą zaproponować alternatywne podejście . Jeśli nie otrzymasz odpowiednich odpowiedzi w ciągu jednego lub dwóch dni, po prostu oflaguj ten post w celu migracji, a my wyślemy go do SO (wraz z wszelkimi odpowiedziami i komentarzami, które mogły w międzyczasie zebrać).
whuber
1
Możesz zmienić opcję „fastppm” na „normę”, będzie szybciej
marc1s 28.04.16
1
Dzięki @ marc1s, które znacznie się poprawiły w przypadku dużych zestawów danych. W przypadku losowej ramki danych (jak wyżej) z 10.000 wierszami metoda „norm” była około 4 razy szybsza niż „fastpmm”. Przy 50 000 rzędach było nawet 12 razy szybsze. W związku z tym względne zwiększenie czasu wykonywania rośnie o liczbę rzędów.
Dendrobates
1
W zależności od modelu, który zamierzasz uruchomić, szybsze może być zastosowanie oszacowania maksymalnego prawdopodobieństwa (lub pełnego prawdopodobieństwa pełnego informacji), które jest asymptotycznie równoważne imputacji, jeśli model jest poprawnie określony. Oto artykuł, w który byłem zaangażowany, porównujący różne metody: emeraldinsight.com/doi/abs/10.1108/JCP-02-2015-0007
Jeremy Miles

Odpowiedzi:

4

Możesz użyć quickpred()z micepakietu, za pomocą którego możesz ograniczyć predyktory, określając mincor (minimalna korelacja) i minpuc (proporcja użytecznych przypadków). Możesz także użyć parametrów wykluczania i dołączania do sterowania predyktorami.

Aanish
źródło
2

Zrobiłem opakowanie dla micefunkcji, która zawiera jeden dodatkowy argument, droplistw którym możesz przekazać wektor znakowy zmiennych predykcyjnych, których nie chcesz, aby były używane po prawej stronie formuł imputacyjnych. Dotyczyło to szybkości, ponieważ stwierdziłem, że zmienne czynnikowe o wielu poziomach znacznie spowolnią imputację . Nie zdawałem sobie sprawy z quickpredfunkcji, do której odwołuje się @Aanish, i być może moglibyście użyć obu koncepcji razem.

Poniżej znajduje się funkcja, która pojawia się w moim pakiecie glmmplus . Jeśli uznasz to za przydatne, mogę otworzyć żądanie ściągnięcia w rzeczywistym micepakiecie.

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)
}
Ben Ogorek
źródło