2014-11-19 6 views
5

Sto cercando di eseguire un'analisi PCA dei miei dati utilizzando R e ho trovato this nice guide, utilizzando prcomp e . I miei dati sono due tipi di campioni con tre repliche biologiche ciascuno (cioè 6 righe) e circa 20000 geni (cioè variabili). In primo luogo, ottenendo il modello APC con il codice descritto nella guida non funziona:prcomp e ggbiplot: valore "rot" non valido

>pca=prcomp(data,center=T,scale.=T) 
Error in prcomp.default(data, center = T, scale. = T) : 
cannot rescale a constant/zero column to unit variance 

Tuttavia, se mi tolgo la parte scale. = T, funziona bene e ottengo un modello. Perché è questo, ed è questa la causa dell'errore qui sotto?

> summary(pca) 
Importance of components: 
          PC1  PC2  PC3  PC4  PC5 
Standard deviation  4662.8657 3570.7164 2717.8351 1419.3137 819.15844 
Proportion of Variance 0.4879 0.2861 0.1658 0.0452 0.01506 
Cumulative Proportion  0.4879 0.7740 0.9397 0.9849 1.00000 

In secondo luogo, tracciare il PCA. Anche solo utilizzando il codice di base, ottengo un un'immagine trama vuoto di errore e:

> ggbiplot(pca) 
Error: invalid 'rot' value 

Cosa significa e come posso risolvere il problema? Ha qualcosa a che fare con la (non) scala nel rendere il PCA, o è qualcosa di diverso? Deve essere qualcosa con i miei dati, penso, dal momento che se uso un codice di esempio standard (sotto) ottengo una trama PCA davvero bella.

> data(wine) 
> wine.pca=prcomp(wine,scale.=T) 
> print(ggbiplot(wine.pca, obs.scale = 1, var.scale = 1, groups = wine.class, 
    ellipse = TRUE, circle = TRUE)) 

[EDIT 1] Ho cercato sottoinsiemi i miei dati in due modi: 1) eliminare tutte le colonne sono state tutte le righe sono 0 e 2) Rimuovere tutte le colonne sono state tutte le righe sono 0. Il primo subsetting mi dà ancora l'errore scale, ma non quelli che hanno rimosso le colonne con 0. Perchè è questo? In che modo ciò influenza la mia PCA?

Inoltre, ho provato a utilizzare il normale comando biplot per entrambi i dati originali (non ridimensionati) e quelli sottostanti sopra, e funziona in entrambi i casi. Quindi ha qualcosa a che fare con ggbiplot?

[EDIT 2] Ho caricato un sottoinsieme dei miei dati che mi dà l'errore quando non rimuovo tutti gli zeri e funziona quando lo faccio. Non ho usato Gist prima, ma penso che sia lo this. O this ...

+1

Esiste un modo per fornire i tuoi dati come ad esempio un 'dput' del set di dati su [gist] (https://gist.github.com/)? O se è grande, un sottoinsieme che produce ancora l'errore? È difficile provare e diagnosticare un problema che non possiamo riprodurre. – cdeterman

+0

Ora ho aggiunto alcuni dati, qualsiasi aiuto è apprezzato! – Sajber

+0

I dati forniti su gist non riproducono l'errore. Ho scaricato il file e 'prcomp' e' ggbiplot' sono stati eseguiti senza errori. – cdeterman

risposta

6

Dopo aver trasposto i tuoi dati, sono riuscito a replicare il tuo errore. Il primo errore è il problema principale. PCA cerca di massimizzare la varianza di ciascun componente, quindi è importante che non si concentri su una sola variabile che potrebbe avere una varianza molto alta. Il primo errore:

Error in prcomp.default(tdf, center = T, scale. = T) : 
    cannot rescale a constant/zero column to unit variance 

Questo vi sta dicendo che alcuni dei vostri variabili avere zero varianza (vale a dire senza la variabilità). Vedendo come PCA sta cercando di raggruppare le cose massimizzando la varianza non ha senso mantenere queste variabili. Possono essere facilmente rimossi con il seguente invito:

df_f <- data[,apply(data, 2, var, na.rm=TRUE) != 0] 

Una volta fatto questo filtro, le restanti chiamate di lavoro in modo appropriato

pca=prcomp(df_f,center=T,scale.=T) 
ggbiplot(pca) 
+0

Ok, è grandioso! Non capisco appieno il tuo codice, però ... rimuovi le colonne dove non c'è alcuna varianza ('var')? In che modo è diverso rispetto alla rimozione di tutte le colonne se c'è uno zero? (Capisco che c'è una differenza ovviamente, ma non esattamente come). Il mio codice che rimuove gli zeri assomiglia a questo: 'nonzero = dati [, applica (dati, 2, funzione (x) tutti (x> 0))]' – Sajber

+0

La differenza è che io rimuovo le colonne con 0 ** varianza ** non quelli che contengono uno 0. Uno zero potrebbe essere importante ma una variabile senza varianza non ha valore in PCA. – cdeterman

+0

Ok, grazie mille! – Sajber