2013-06-11 31 views
8

Ho una serie di osservazioni con 23 variabili.R - come rendere più leggibile il biplot PCA

Quando uso prcomp e biplot per tracciare i risultati che incorrere in diversi problemi:

  1. trama attuale occupa solo metà del telaio (x < 0), ma la trama è centrato su 0, quindi la metà dello spazio viene sprecato

  2. due variabili clearily dominano i risultati, in modo che tutti gli altri frecce sono raggruppate insieme e non può leggere una cosa

ad 1. Ho provato a impostare xlim e/o ylim, ma ovviamente sto facendo qualcosa di sbagliato visto che la trama è tutta incasinata quando faccio

ad 2. Posso solo in qualche modo rendere le etichette delle frecce posizionate più distanti così che posso leggerli? O forse potrei solo tracciare le frecce senza le due più lunghe (tipo zoom-in)?

My PCA plot

Addendum: è possibile avere biplot disegnare le etichette in un colore diverso da quello delle frecce?

Inoltre: è problematico se gli assi xey non sono proporzionali (il grafico mostra intervalli di lunghezza diversa su xey). Penso che questo potrebbe distorcere gli angeli tra le frecce, e quel tipo di ridimensionamento non è una trasformazione di somiglianza. È possibile forzare il biplot per mantenere un rapporto 1: 1, o per tracciare il grafico come un rettangolo e non un quadrato?

risposta

19

Penso che sia possibile utilizzare xlim e ylim. Inoltre, dai un'occhiata all'argomento expand per ?biplot. Purtroppo, non ha fornito alcun dato, quindi cerchiamo di prendere un po 'di dati di esempio:

a <- princomp(USArrests) 

Di seguito il risultato di appena chiamare biplot:

biplot(a) 

enter image description here

E ora si può "zoomare "per dare un'occhiata più da vicino a" Omicidio "e" Stupro "utilizzando xlim e ylim e utilizzare anche l'argomento di ridimensionamento da ?biplot:

biplot(a, expand=10, xlim=c(-0.30, 0.0), ylim=c(-0.1, 0.1)) 

enter image description here

Si prega di notare la diversa scala sull'asse alto ea destra a causa del fattore expand.

Questo aiuta a rendere leggibile la trama?

EDIT

È inoltre chiesto se è possibile avere colori diversi per le etichette e frecce.biplot non supporta ciò, è possibile copiare il codice di stats:::biplot.default e modificarlo in base alle proprie esigenze (modificare l'argomento col quando si utilizza plot, axis e text).

In alternativa, è possibile utilizzare ggplot per il biplot. Nel post here, viene implementata una semplice funzione biplot. Si potrebbe cambiare il codice come segue:

PCbiplot <- function(PC, x="PC1", y="PC2", colors=c('black', 'black', 'red', 'red')) { 
    # PC being a prcomp object 
    data <- data.frame(obsnames=row.names(PC$x), PC$x) 
    plot <- ggplot(data, aes_string(x=x, y=y)) + geom_text(alpha=.4, size=3, aes(label=obsnames), color=colors[1]) 
    plot <- plot + geom_hline(aes(0), size=.2) + geom_vline(aes(0), size=.2, color=colors[2]) 
    datapc <- data.frame(varnames=rownames(PC$rotation), PC$rotation) 
    mult <- min(
     (max(data[,y]) - min(data[,y])/(max(datapc[,y])-min(datapc[,y]))), 
     (max(data[,x]) - min(data[,x])/(max(datapc[,x])-min(datapc[,x]))) 
     ) 
    datapc <- transform(datapc, 
      v1 = .7 * mult * (get(x)), 
      v2 = .7 * mult * (get(y)) 
      ) 
    plot <- plot + coord_equal() + geom_text(data=datapc, aes(x=v1, y=v2, label=varnames), size = 5, vjust=1, color=colors[3]) 
    plot <- plot + geom_segment(data=datapc, aes(x=0, y=0, xend=v1, yend=v2), arrow=arrow(length=unit(0.2,"cm")), alpha=0.75, color=colors[4]) 
    plot 
} 

Trama come segue:

fit <- prcomp(USArrests, scale=T) 
PCbiplot(fit, colors=c("black", "black", "red", "yellow")) 

enter image description here

Se si gioca un po 'con questa funzione, sono sicuro che si può capire come imposta valori xlim e ylim, ecc.

+0

Grazie, prima ho ricevuto molti avvisi nella console, ma ora funziona. Forse potresti anche aggiungere una nuova domanda sui colori. –

+0

@Colors - questo è quello che mi aspettavo, grazie per il codice ready-made BTW che cosa è che "copia il codice sorgente e lo modifica" in R? Non sto mettendo in discussione la validità del vostro anser, tuttavia è una pratica piuttosto discutibile dal punto di vista dell'ingegneria del software. –

+0

In una nota finale non mi aspetto che sia possibile avere un grafico rettangolare con biplot. Sono le chiamate geom_hline e geom_vline nel tuo esempio che devo cambiare per questo? –

Problemi correlati