Como melhorar o tempo de execução da imputação de dados do R MICE

9

Minha pergunta, em resumo: existem métodos para melhorar o tempo de execução do R MICE (imputação de dados)?

Estou trabalhando com um conjunto de dados (30 variáveis, 1,3 milhão de linhas) que contém (aleatoriamente) dados ausentes. Cerca de 8% das observações em cerca de 15 em 30 variáveis ​​contêm NAs. Para imputar os dados ausentes, estou executando a função MICE, parte do pacote MICE .

Eu experimento um tempo de execução bastante lento, mesmo em um subconjunto (100.000 linhas), com o método = "fastpmm" em = 1 e é executado por cerca de 15 minutos.

Existe uma maneira de melhorar o tempo de execução sem perder muito desempenho? (mice.impute.mean é bastante rápido, mas vem com perda importante de informações!).

Código reproduzível:

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
fonte
11
Em geral: esse tipo de pergunta é apropriado para validação cruzada ou mais adequado para estouro de pilha?
Dendrobates
3
Pode ser uma decisão judicial. Como (como princípio geral) as melhorias mais substanciais nos tempos de execução são obtidas com a compreensão dos algoritmos subjacentes, espero que sua melhor chance de obter uma resposta realmente eficaz possa estar aqui, em uma comunidade onde as pessoas possam sugerir abordagens alternativas . Se você não obtiver respostas adequadas em um dia ou dois, basta sinalizar esta postagem para migração e a enviaremos para o SO (juntamente com quaisquer respostas e comentários que possam ter sido coletados nesse meio tempo).
whuber
11
Você pode alterar a opção 'fastppm' a 'norma', ele vai ser mais rápido
marc1s
11
Thx @ marc1s, que melhorou muito para grandes conjuntos de dados. Para um quadro de dados aleatório (como acima) com 10.000 linhas, o método "norma" foi cerca de 4 vezes mais rápido que "fastpmm". Com 50.000 linhas, era até 12 vezes mais rápido. Portanto, o ganho relativo no tempo de execução está aumentando pelo número de linhas.
Dendrobates
11
Dependendo do modelo que você executará, pode ser mais rápido usar a estimativa de máxima probabilidade (ou de informações completas), que é assintoticamente equivalente à imputação, se o modelo for especificado corretamente. Aqui está um artigo em que eu estive envolvido, que compara os diferentes métodos: emeraldinsight.com/doi/abs/10.1108/JCP-02-2015-0007
Jeremy Miles

Respostas:

4

Você pode usar quickpred()do micepacote usando o qual você pode limitar os preditores, especificando o mincor (correlação mínima) e minpuc (proporção de casos utilizáveis). Além disso, você pode usar os parâmetros de exclusão e inclusão para controlar os preditores.

Aanish
fonte
2

Criei um invólucro para a micefunção que inclui um argumento extra droplist, no qual você pode passar um vetor de caracteres de variáveis ​​preditoras que não deseja que sejam usadas no lado direito das fórmulas de imputação. Isso foi por velocidade, pois descobri que variáveis ​​fatoriais com muitos níveis desacelerariam consideravelmente a imputação . Eu não estava ciente da quickpredfunção mencionada pelo @Aanish e talvez você pudesse usar os dois conceitos juntos.

Abaixo está a função que aparece no meu pacote glmmplus . Se você achar útil, posso abrir uma solicitação de recebimento no micepacote real .

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
fonte