Imputação de valores ausentes para PCA

23

Eu usei a prcomp()função para executar um PCA (análise de componentes principais) em R. No entanto, há um erro nessa função, de modo que o na.actionparâmetro não funciona. Eu pedi ajuda no stackoverflow ; dois usuários ofereceram duas maneiras diferentes de lidar com NAvalores. No entanto, o problema com as duas soluções é que, quando existe um NAvalor, essa linha é descartada e não é considerada na análise do PCA. Meu conjunto de dados real é uma matriz de 100 x 100 e não quero perder uma linha inteira apenas porque contém um único NAvalor.

O exemplo a seguir mostra que a prcomp()função não retorna nenhum componente principal para a linha 5, pois contém um NAvalor.

d       <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10), 
                      V3 = sample(1:100, 10))
result  <- prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x                                # $
d$V1[5] <- NA                           # $
result  <- prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit)
result$x

Eu queria saber se posso definir os NAvalores para um valor numérico específico quando centere scalesão definidos para TRUEque a prcomp()função funcione e não remova linhas contendo NAs, mas também não influencie o resultado da análise do PCA.

Pensei em substituir NAvalores pelo valor mediano em uma única coluna ou com um valor muito próximo de 0. No entanto, não tenho certeza de como isso influencia a análise do PCA.

Alguém pode pensar em uma boa maneira de resolver esse problema?

user969113
fonte
8
Seu problema não é um problema de PCA, mas um problema de tratamento de valores ausentes mais amplo . Se você não estiver familiarizado, leia um pouco sobre ele. Você tem muitas oportunidades: (1) excluir casos em lista ou (2) em pares ou (3) substituir as missas por média ou mediana. Ou (4) substitua por valores válidos escolhidos aleatoriamente (abordagem hot-deck). Ou imputar as falhas por (5) abordagem de regressão mútua (com ou sem adição de ruído) ou por uma melhor abordagem (6) EM.
ttnphns
Enquanto os comentários e as respostas são mostrados, a chave para obter uma boa resposta é explicar o que os NAvalores significam : qual é a causa da "falta"?
whuber
2
Eu acho que o pacote "pcaMethods" pode resolver seu problema ( aqui )
ToNoY

Respostas:

22

De fato, existe uma maneira bem documentada de lidar com matrizes gappy - você pode decompor uma matriz de covariância calculada a partir dos dados X , que é dimensionada pelo número de valores compartilhados n : C = 1CXn

C=1nXTX,                Cjl=X.jY.l¯

e expanda os coeficientes principais por meio de um ajuste de mínimos quadrados (como menciona @ user969113). Aqui está um exemplo .

Xprcomp

Atualizar

Outra opção para a condução do PCA em um conjunto de dados vazio é "Funções ortogonais empíricas subtraídas recursivamente" (Taylor et al. 2013). Ele também corrige alguns dos problemas na abordagem dos mínimos quadrados e é computacionalmente muito mais rápido que o DINEOF. Este post compara as três abordagens em termos de precisão da reconstrução de dados usando os PCs.

Referências

Beckers, Jean-Marie e M. Rixen. "Cálculos EOF e preenchimento de dados de conjuntos de dados oceanográficos incompletos." Jornal da tecnologia atmosférica e oceânica 20.12 (2003): 1839-1856.

Taylor, M., Losch, M., Wenzel, M., & Schröter, J. (2013). Sobre a sensibilidade da reconstrução e previsão de campo usando Funções Ortogonais Empíricas derivadas de dados lacrimejantes. Jornal do Clima, 26 (22), 9194-9205.

Marc na caixa
fonte
(+1) Isso parece uma contribuição valiosa para mim, porque é uma ideia nova. Há muito tempo fiz uma pergunta semelhante que é surpreendentemente semelhante: como você estima uma matriz de covariância quando os dados são censurados (em vez de ausentes)? Se você tem alguma opinião sobre essa situação, ficaria feliz em responder!
whuber
Obrigado @whuber - acredito que esse método também tem muito mérito. Mesmo que você não esteja interessado nos valores interpolados, o método é muito melhor do que descrever EOFs / PCs para o conjunto de dados - por exemplo, o erro entre os dados reconstruídos e o original é minimizado pelo algoritmo.
Marc na caixa
@whuber - Em relação aos dados censurados - Isso está fora da minha área de especialização e, curiosamente, fiz uma pergunta nessa direção há algumas semanas (sobre o que você comentou!) . Meu palpite é que se deve preencher os zeros com valores aleatórios abaixo do limite de detecção, que aproximam a distribuição dos valores observados. Vou examinar algumas das publicações citadas em seu post - esse é realmente um tópico muito interessante.
Marc na caixa
@whuber - Você pode estar interessado no artigo a seguir descrevendo um procedimento de ajuste de matriz de covariância iterativa semelhante para poupar dados: Bien, Jacob e Robert J. Tibshirani. "Estimativa esparsa de uma matriz de covariância." Biometrika 98.4 (2011): 807-820.
Marc na caixa
Obrigado @Marc. Infelizmente, censurar e poupar são duas coisas diferentes, com preocupações diferentes.
whuber
6

Minha sugestão depende de quantos dados estão faltando e por que estão faltando. Mas isso não tem nada a ver com PCA, realmente. Se houver muito poucos dados ausentes, não importará muito o que você faz. Substituir pela mediana não é o ideal, mas se não houver muita falta, não será muito diferente de uma solução melhor. Você pode tentar executar o PCA com substituição mediana e exclusão listwise e ver se há grandes diferenças nos resultados.

Em seguida, se houver mais dados ausentes, considere se eles estão faltando completamente aleatoriamente, ausentes aleatoriamente ou não ausentes aleatoriamente. Eu sugeriria a imputação múltipla nos dois primeiros casos e algumas vezes no terceiro caso - a menos que os dados sejam altamente distorcidos por seu status NMAR, acho que a imputação múltipla será melhor do que a exclusão listwise (Joe Schafer, da Penn State, fez uma muito trabalho com dados ausentes - lembro-me de alguns trabalhos dele mostrando que a imputação múltipla funcionou muito bem mesmo em alguns casos NMAR). No entanto, se os dados forem MCAR ou MAR, as propriedades da imputação múltipla podem ser comprovadas.

Se você optar por usar o MI, uma observação deve ser cuidadosa, pois os sinais dos componentes no PCA são arbitrários e uma pequena alteração nos dados pode virar um sinal. Então, quando você faz o PCA, obtém um disparate. Há muito tempo, trabalhei em uma solução no SAS - não é difícil, mas é algo para ter cuidado.

Peter Flom - Restabelece Monica
fonte
1

Não há solução correta para o problema. Todas as coordenadas do vetor devem ser especificadas para obter o conjunto correto de componentes principais. Se uma coordenada estiver ausente e substituída por algum valor imputado, você obterá um resultado, mas isso dependerá do valor imputado. portanto, se houver duas opções razoáveis ​​para o valor imputado, as diferentes opções fornecerão respostas diferentes.

Michael R. Chernick
fonte
3
Acabei de pesquisar no PCA e nos dados ausentes e descobri que: 4.2 Como o SIMCA lida com os dados ausentes? Simplificando, o algoritmo NIPALS interpola o ponto ausente usando um ajuste de mínimos quadrados, mas não dá aos dados ausentes nenhuma influência no modelo. As iterações sucessivas refinam o valor ausente simplesmente multiplicando a pontuação e o carregamento para esse ponto. Existem muitos métodos diferentes para a falta de dados, como estimativa, mas geralmente convergem para a mesma solução. Dados ausentes são aceitáveis ​​se forem distribuídos aleatoriamente. Blocos sistemáticos de dados ausentes são problemáticos.
User969113
1
Não sei o que você quer dizer com nenhuma influência no modelo. Qualquer escolha de valor ausente para a coordenada afetará os componentes principais.
Michael R. Chernick 02/09/12
1

Um artigo recente que analisa abordagens para lidar com valores ausentes nas análises de PCA é "Análise de componentes principais com valores ausentes: uma pesquisa comparativa de métodos" por Dray & Josse (2015) . Dois dos métodos mais conhecidos dos métodos PCA que permitem valores ausentes são o algoritmo NIPALS, implementado na nipalsfunção do ade4pacote, e o PCA iterativo (Ipca ou EM-PCA), implementado na imputePCAfunção do missMDApacote. O artigo concluiu que o método Ipca teve melhor desempenho sob a mais ampla gama de condições.

Para o seu exemplo, a sintaxe é:

Para NIPALS:

library(ade4)
nipals(d[,c(1,2)])

Para Ipca:

library(missMDA)
imputePCA(d[,c(1,2)],method="EM",ncp=1)
Tom Wenseleers
fonte