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.
fonte
Respostas:
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.
Estou usando o
missForest
pacote 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.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.
Você pode contornar para aumentar a precisão. Boa sorte !
fonte
Existem livros completos de imputação de dados, por isso é difícil dar uma resposta nessa estrutura.
Se seu conjunto de dados for muito grande, use um algoritmo rápido ou escalável.
fonte
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!
fonte
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 (grandep ) 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:
fonte
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 dobcv
pacote . Eu sugeriria usar uma classificação pequena (o argumentok
) - algo como 5.fonte