Como executar a imputação de valores em um número muito grande de pontos de dados?

12

Eu tenho um conjunto de dados muito grande e faltam cerca de 5% de valores aleatórios. Essas variáveis ​​estão correlacionadas entre si. O exemplo a seguir do conjunto de dados R é apenas um exemplo de brinquedo com dados correlatos simulados.

set.seed(123)

# matrix of X variable 
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated 

N <- 2000000*0.05 # 5% random missing values 
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA 
> xmat[1:10,1:10]
         M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1  -1 -1  1 NA  0 -1  1 -1  0  -1
sample2   1  1 -1  1  0  0  1 -1 -1   1
sample3   0  0  1 -1 -1 -1  0 -1 -1  -1
sample4   1  0  0 -1 -1  1  1  0  1   1
sample5  NA  0  0 -1 -1  1  0 NA  1  NA
sample6  -1  1  0  1  1  0  1  1 -1  -1
sample7  NA  0  1 -1  0  1 -1  0  1  NA
sample8   1 -1 -1  1  0 -1 -1  1 -1   0
sample9   0 -1  0 -1  1 -1  1 NA  0   1
sample10  0 -1  1  0  1  0  0  1 NA   0

Existe uma (melhor) maneira de imputar valores ausentes nesta situação? O algoritmo Random Forest é útil? Qualquer solução de trabalho em R seria muito apreciada.

Editar% s:

(1) Os valores ausentes são distribuídos aleatoriamente entre as variáveis ​​e as amostras. Como número de variáveis é muito grande (aqui no exemplo - 10000), enquanto o número de amostras é pequeno aqui no exemplo fictício acima, é cerca de 200. Então, quando Quando analisamos qualquer amostra de todas as variáveis ​​(10000), há grandes chances de que haja valor ausente em alguma variável - devido ao grande número de variáveis. Portanto, apenas excluir a amostra não é uma opção.

(2) A variável pode ser tratada como quantitativa ou qualitativa (binária) no processo de imputação. O único julgamento é o quão bem podemos prever (precisão). Portanto, previsões como 0,98 em vez de 1 podem ser aceitáveis, em vez de 0 vs 1 ou -1 vs 1. Talvez eu precise trocar entre tempo e precisão de computação.

(3) A questão que estou pensando em como a adaptação excessiva pode afetar os resultados, pois o número de variáveis ​​é grande em comparação ao número de amostras.

(4) Como a quantidade total de valores ausentes é de cerca de 5% e é aleatória (não concentrada em nenhuma variável ou amostra, foi tomado cuidado para remover as variáveis ​​ou amostras que possuem valores ausentes muito altos)

(5) Tornar os dados completos para análise é o primeiro objetivo e a precisão, secundária. Portanto, não muito sensível à precisão.

John
fonte
1
A razão pela qual os dados estão ausentes está fortemente relacionada à escolha da técnica apropriada. Por exemplo, se os dados estiverem faltando completamente aleatoriamente, você perderá pouco ao eliminar todos os casos com valores ausentes (porque o conjunto de dados é grande e faltam relativamente poucos valores); mas se a falta estiver relacionada a variáveis ​​importantes na análise, a remoção desses casos pode introduzir um viés.
whuber
1
@whuber Concordo, não é possível remover para um conjunto de dados desse tamanho, pois todos os casos terão um valor ausente pelo menos em uma variável. Isso causará perda total de dados.
John
4
Isso muda substancialmente a questão, John, porque em sua forma atual afirma explicitamente o contrário: afirma que apenas 5% dos valores estão ausentes. Mesmo se entendermos que os 5% se aplicam a todas as entradas na matriz de dados, em vez de 5% dos casos, qualquer um que tome o exemplo como indicativo da natureza dos seus dados concluiria validamente que não mais que 10 * 5% = 50 % dos casos tem valores ausentes. As três coisas que são mais importantes para descrever em tais perguntas são (1) o objetivo da análise, (2) a natureza da falta e (3) a quantidade de falta.
whuber

Respostas:

8

Pode haver duas maneiras de lidar com grandes variáveis ​​e problemas com amostras pequenas (observação), dependendo da situação e do conjunto de dados.

(1) use apenas amostras (observações) como variável, desde que as pontuações nas variáveis ​​sejam iguais ou normalizadas.

(2) Use variáveis ​​como variáveis, mas faça algumas amostragens aleatórias enquanto imputa, para que a variável numérica seja menor que o número de amostras e, finalmente, mescle os dados.

A seguir, exercícios, você pode ajustar às suas necessidades. Eu suponho que a variável seja contínua, mas você faz exercícios semelhantes para variáveis ​​discretas. Aqui estou dando um pequeno exemplo para verificação rápida.

Primeiro, para exercícios que geram dados correlatos, aqui as observações (amostras) são correlacionadas, podem ser realistas em situações em que variáveis ​​são consideradas independentes enquanto observações são correlacionadas. Mas em outras situações em que observações e variáveis ​​estão correlacionadas.

# example correlated data, correlated by observations 
# number of observations 
nobs = 200
nvars = 100
# number of variables 
# covariance matrix matrixCR to create correlated data 
matrixCR <- matrix(NA, nrow = nobs, ncol = nobs)
diag(matrixCR) <- 1
matrixCR[upper.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[lower.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[1:10,1:10]
L = chol(matrixCR)# Cholesky decomposition
nvars = dim(L)[1]
set.seed(123)
rM = t(L) %*% matrix(rnorm(nvars*nobs), nrow=nvars, ncol=nobs)
rownames(rM) <- paste("V", 1:nvars, sep = "") 
colnames(rM) <- paste("O", 1:nobs, sep = "")
rM[1:10,1:10]



# introduce missing values in random places 
N <- round(nobs*nvars*0.05,0) # 5% random missing values 
set.seed(123)
inds <- round ( runif(N, 1, length(rM)) )
rM1 <- rM
rM1[inds] <- NA

Estou usando o missForestpacote para imputação, que depende darandomForest pacote para fazer isso. Você pode fazer computação paralela se tiver um número muito grande de pontos de dados para imputar.

# now use the rM1 matrix in imputation. 
require(missForest)
out.m <- missForest(rM1, maxiter = 10, ntree = 300)
# imputed 
imp.rM1 <- out.m$ximp

Como esse é um conjunto de dados simulados, temos o luxo de estimar a precisão da imputação comparando o original antes dos valores ausentes introduzidos com os imputados.

# actual values that were made missing 
aval <- rM[inds]
impv <- imp.rM1[inds]

# accuracy - defined as correlation between actual (before na introduction) and imputed values 
cor(aval,impv)
[1] 0.6759404

Você pode contornar para aumentar a precisão. Boa sorte !

Ram Sharma
fonte
5

Existem livros completos de imputação de dados, por isso é difícil dar uma resposta nessa estrutura.

yx .

y=f(x) é treinado e os valores ausentes são substituídos pelos valores previstos pelo nosso modelo. Seus dados parecem ser categóricos, portanto a floresta aleatória pode ser uma boa escolha.

Se seu conjunto de dados for muito grande, use um algoritmo rápido ou escalável.

Donbeo
fonte
obrigado, você tem alguma sugestão de livro?
John John
nada em particular. mas se você google imputação de dados que você pode encontrar um monte de coisas
Donbeo
De qualquer forma, se apenas alguns valores estiverem faltando, você poderá remover toda a linha. Dos seus conjuntos de dados
Donbeo
3
Embora você sempre possa excluir casos com valores ausentes, isso às vezes seria uma má escolha, dependendo do motivo da falta de dados.
whuber
@whuber Eu concordo totalmente com você, mas muitas vezes essa é apenas a escolha mais segura.
Donbeo 27/05
5

Esta é uma pergunta realmente interessante. Eu também estou procurando a mesma coisa. Na verdade, existem muitas maneiras diferentes de lidar com isso.

A primeira coisa, na minha opinião, será determinar que tipo de dados ausentes você possui - faltando completamente aleatoriamente (MCAR), faltando aleatoriamente (MAR) ou faltando não aleatoriamente (NMAR). É difícil e controverso provar, mas este artigo mostra uma maneira interessante de analisar os dados do MAR.

Para lidar com a imputação múltipla, o R possui alguns pacotes:

  • MICE (que parece muito usado),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

Estes são apenas alguns dos pacotes que encontrei até agora.

MICE também implementou floresta aleatória e alguns outros métodos, como correspondência preditiva média.

Isso não é muito, mas pode ajudá-lo a descobrir algumas coisas. Assim que tiver resultados ou decidir com qual método vou continuar, editarei a postagem.

Boa sorte!

psoares
fonte
Meus dados são MCAR.
John
1
Se seus dados forem MCAR, você poderá usar apenas análise de caso completa. Muitos artigos relatam que o uso de análise de caso completa com dados de MCAR é a melhor solução. Pelo menos, alguns dos papéis que encontrei relatar isso, mesmo comparando com outros métodos de imputação
psoares
3

Pergunta interessante. O truque para isso é que, para fazer imputação múltipla, você precisa mais do que apenas um modelo preditivo (o que poderia / seria fácil de obter, por exemplo, em uma abordagem de aprendizado de máquina). Vamos chamar esses modelos de modelos simulando, já que não são modelos de probabilidade.

O aspecto combinado da seleção de recursos (grande p) e treinar um modelo de simulação me faz pensar que uma abordagem bayesiana é a melhor. Isso também significa que não há uma abordagem clara para isso. Para mim, a melhor abordagem teria a seguinte abordagem:

  1. Identifique todos os padrões de falta
  2. Para cada padrão, use uma abordagem de seleção de recurso bayesiano para atribuir pesos posteriores para concluir casos nos dados.
  3. Amostra aleatória de casos completos iterativamente para gerar quadros de dados completos.
AdamO
fonte
3

Seu problema parece feito sob medida para algum tipo de conclusão da matriz de baixo escalão. Tente usar a impute.svd()função do bcvpacote . Eu sugeriria usar uma classificação pequena (o argumento k) - algo como 5.

Innuo
fonte