2012-08-22 7 views
12

Sto utilizzando la funzione prcomp per calcolare i primi due componenti principali. Tuttavia, i miei dati hanno alcuni valori di NA e quindi la funzione genera un errore. Il na.action definita sembra non funzionare, anche se è menzionato nel file di aiuto ?prcompLa funzione R non funziona con i valori di NA anche se NA è consentito

Ecco il mio esempio:

d <- data.frame(V1 = sample(1:100, 10), V2 = sample(1:100, 10)) 

prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit) 

d$V1[5] <- NA 
d$V2[7] <- NA 

prcomp(d, center = TRUE, scale = TRUE, na.action = na.omit) 

sto usando la nuova R versione 2.15.1 per Mac OS X.

Qualcuno può vedere il motivo mentre prcomp non riesce?

Ecco il mio nuovo esempio:

d <- data.frame(V1 = sample(1:100, 10), V2 = 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 

è possibile conservare riga 5 nel PC1 e PC2? Nel mio vero set di dati ho ovviamente più di due colonne di variabili e solo alcune di esse sono mancanti e non voglio perdere le restanti informazioni nascoste negli altri valori!

risposta

12

Sì, sembra una "funzionalità" (bug) che na.action viene completamente ignorata a meno che non si utilizzi l'interfaccia formula. Questo è stato brought up before on the R Development list.

Penso che questo dovrebbe essere documentato o contrassegnato come un bug.

Giusto per essere chiari, questo dovrebbe funzionare perché accede all'interfaccia formula:

prcomp(~V1+V2, data=d, center = TRUE, scale = TRUE, na.action = na.omit) 
+0

Ok fantastico. Grazie per l'approccio formula! – user969113

+2

Sono d'accordo che dovrebbe essere documentato (sono l'autore della query sulla lista di sviluppo R); il modo migliore per spingere in avanti, se qualcuno volesse, sarebbe proporre una modifica alla documentazione e inviarla alla lista r-devel (e/o al bug tracker R). –

8

Un'altra soluzione se non siete disposti a usare l'interfaccia formula è

prcomp(na.omit(d), center = TRUE, scale = TRUE) 

che consistono di applicare na.omit direttamente al frame dati.

+0

Grazie anche per la soluzione. Mi sono appena reso conto che l'utilizzo di na.omit ha come risultato meno componenti principali. Ho appena modificato il mio esempio sopra. – user969113