Imputazione di valori mancanti per PCA


23

Ho usato la prcomp()funzione per eseguire un PCA (analisi del componente principale) in R. Tuttavia, c'è un bug in quella funzione in modo che il na.actionparametro non funzioni. Ho chiesto aiuto su stackoverflow ; due utenti hanno offerto due modi diversi di trattare i NAvalori. Tuttavia, il problema con entrambe le soluzioni è che quando esiste un NAvalore, quella riga viene eliminata e non considerata nell'analisi PCA. Il mio set di dati reali è una matrice di 100 x 100 e non voglio perdere un'intera riga solo perché contiene un singolo NAvalore.

L'esempio seguente mostra che la prcomp()funzione non restituisce alcun componente principale per la riga 5 poiché contiene un NAvalore.

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

Mi chiedevo se posso impostare i NAvalori su un valore numerico specifico quando centere scalesono impostati in TRUEmodo che la prcomp()funzione funzioni e non rimuova le righe contenenti quelle NA, ma non influenzi anche il risultato dell'analisi PCA.

Ho pensato di sostituire i NAvalori con il valore mediano attraverso una singola colonna o con un valore molto vicino a 0. Tuttavia, non sono sicuro di come ciò influenzi l'analisi PCA.

Qualcuno può pensare a un buon modo per risolvere quel problema?


8
Il tuo problema non è un problema di PCA ma un problema di trattamento dei valori mancanti più ampio . Se non lo conosci, ti preghiamo di leggere un po 'su di esso. Hai molte opportunità: (1) elimina i casi in modo elenco o (2) in coppia o (3) sostituisci i mancati con media o mediana. Oppure (4) sostituire con valori casuali scelti di valori validi (approccio hot-deck). O imputare mancanze con (5) approccio di regressione reciproca (con o senza aggiunta di rumore) o con un approccio EM (6) migliore.
ttnphns,

Come mostrano i commenti e le risposte, la chiave per ottenere una buona risposta è spiegare cosa significano i NAvalori : qual è la causa della "mancanza"?
whuber

2
Penso che il pacchetto "pcaMethods" possa risolvere il tuo problema ( qui )
ToNoY

Risposte:


22

Esiste in realtà un modo ben documentato per gestire le matrici gappy: puoi scomporre una matrice di covarianza derivata dai tuoi dati , che è ridimensionata dal numero di valori condivisi :X n C = 1CXn

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

e quindi espandere i coefficienti principali tramite un adattamento dei minimi quadrati (come cita @ user969113). Ecco un esempio .

Tuttavia, ci sono diversi problemi con questo metodo in relazione al fatto che la matrice di covarianza non è più definita semipositiva e che i valori di autigeni / singolari tendono ad essere gonfiati. Una bella rassegna di questi problemi può essere trovata in Beckers e Rixen (2003) , dove propongono anche un metodo per interpolare in modo ottimale le lacune mancanti - DINEOF (Data Interpolating Empirical Orthogonal Functions). Di recente ho scritto una funzione che esegue DINEOF e sembra davvero un modo molto migliore di procedere. È possibile eseguire DINEOF sul set di dati direttamente, quindi utilizzare il set di dati interpolato come input in .Xprcomp

Aggiornare

Un'altra opzione per condurre la PCA su un set di dati gappy è "Funzioni ortogonali empiriche sottratte ricorsivamente" (Taylor et al. 2013). Corregge anche alcuni dei problemi nell'approccio dei minimi quadrati ed è computazionalmente molto più veloce di DINEOF. Questo post mette a confronto tutti e tre gli approcci in termini di accuratezza della ricostruzione dei dati utilizzando i PC.

Riferimenti

Beckers, Jean-Marie e M. Rixen. "Calcoli EOF e riempimento di dati da set di dati oceanografici incompleti." Journal of Atmospher and Oceanic Technology 20.12 (2003): 1839-1856.

Taylor, M., Losch, M., Wenzel, M., & Schröter, J. (2013). Sulla sensibilità della ricostruzione e della predizione del campo usando le funzioni ortogonali empiriche derivate da dati gappy. Journal of Climate, 26 (22), 9194-9205.


(+1) Mi sembra un prezioso contributo, perché è un'idea nuova. Ho fatto una domanda simile molto tempo fa che è sorprendentemente simile: come stimare una matrice di covarianza quando i dati vengono censurati (invece che mancanti)? Se hai qualche idea su quella situazione, sarei felice di una risposta!
whuber

Grazie @whuber - Credo che anche questo metodo abbia molti meriti. Anche se non sei interessato ai valori interpolati, il metodo è molto meglio della descrizione di EOF / PC per il set di dati, ad esempio l'errore tra i dati ricostruiti e l'originale è minimizzato attraverso l'algoritmo.
Marc nella scatola del

@whuber - Riguardo ai dati censurati - Questo è fuori dalla mia area di competenza e, cosa interessante, ho fatto una domanda in questa direzione qualche settimana fa (di cui hai commentato!) . La mia impressione è che si dovrebbero riempire gli zeri con valori casuali al di sotto del limite di rilevazione, che approssimano la distribuzione dei valori osservati. Esaminerò alcune delle pubblicazioni citate dal tuo post: questo è davvero un argomento molto interessante.
Marc nella scatola del

@whuber - Potresti essere interessato al seguente documento che descrive una procedura di adattamento a matrice di covarianza simile a dati sparsi: Bien, Jacob e Robert J. Tibshirani. "Stima sparsa di una matrice di covarianza." Biometrika 98.4 (2011): 807-820.
Marc nella scatola

Grazie @Marc. Sfortunatamente la censura e la disparità sono due cose diverse con preoccupazioni diverse.
whuber

6

Il mio suggerimento dipende dalla quantità di dati mancanti e dal motivo per cui mancano. Ma questo non ha nulla a che fare con PCA, davvero. Se mancano pochissimi dati, non importa molto cosa fai. Sostituire con la mediana non è l'ideale, ma se non manca molto, non sarà molto diverso da una soluzione migliore. Potresti provare a fare PCA sia con la sostituzione mediana che con la cancellazione listwise e vedere se ci sono differenze importanti nei risultati.

Successivamente, se mancano più dati, è necessario considerare se mancano completamente a caso, mancano a caso o non mancano a caso. Suggerirei un'imputazione multipla nei primi due casi e qualche volta nel terzo caso - a meno che i dati non siano fortemente distorti dal suo stato NMAR, penso che un'imputazione multipla sia migliore della cancellazione listwise (Joe Schafer di Penn State ha fatto un molto lavoro sui dati mancanti - ricordo alcuni dei suoi lavori che dimostrano che l'imputazione multipla ha funzionato abbastanza bene anche in alcuni casi NMAR). Tuttavia, se i dati sono MCAR o MAR, è possibile provare le proprietà dell'imputazione multipla.

Se decidi di andare con MI, una nota è fare attenzione perché i segni dei componenti in PCA sono arbitrari e una piccola modifica dei dati può capovolgere un segno. Quindi quando esegui il PCA avrai delle sciocchezze. Molto tempo fa ho elaborato una soluzione in SAS: non è difficile, ma è qualcosa di cui prestare attenzione.


1

Non esiste una soluzione corretta al problema. Ogni coordinata nel vettore deve essere specificata per ottenere il set corretto di componenti principali. Se una coordinata manca e viene sostituita da un valore imputato, otterrai un risultato ma dipenderà dal valore imputato. quindi se ci sono due scelte ragionevoli per il valore imputato, le diverse scelte daranno risposte diverse.


3
Ho appena cercato su PCA e dati mancanti e ho scoperto che: 4.2 Come fa SIMCA a gestire i dati mancanti? In parole semplici, l'algoritmo NIPALS interpola il punto mancante usando un adattamento dei minimi quadrati, ma non dà ai dati mancanti alcuna influenza sul modello. Le iterazioni successive perfezionano il valore mancante semplicemente moltiplicando il punteggio e il caricamento per quel punto. Esistono molti metodi diversi per i dati mancanti, come la stima, ma generalmente convergono nella stessa soluzione. I dati mancanti sono accettabili se sono distribuiti in modo casuale. I blocchi sistematici di dati mancanti sono problematici.
user969113,

1
Non so cosa intendi per nessuna influenza sul modello. Qualsiasi scelta di valore mancante per la coordinata influenzerà i componenti principali.
Michael R. Chernick,

1

Un recente studio che esamina gli approcci per affrontare i valori mancanti nelle analisi PCA è "Analisi delle componenti principali con valori mancanti: un'indagine comparativa dei metodi" di Dray & Josse (2015) . Due dei metodi più noti di metodi PCA che consentono valori mancanti sono l'algoritmo NIPALS, implementato nella nipalsfunzione del ade4pacchetto, e l'iterativo PCA (Ipca o EM-PCA), implementato nella imputePCAfunzione del missMDApacchetto. Il documento ha concluso che il metodo Ipca ha funzionato meglio nelle condizioni più ampie.

Per il tuo esempio la sintassi è:

Per i NIPALI:

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

Per Ipca:

library(missMDA)
imputePCA(d[,c(1,2)],method="EM",ncp=1)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.