Ottenere risultati diversi quando si tracciano ellissi IC al 95% con ggplot o il pacchetto ellisse


11

Voglio visualizzare i risultati di un clustering (prodotto con protoclust{protoclust}) creando grafici di scater per ogni coppia di variabili utilizzate per classificare i miei dati, colorare per classi e sovrapporre le ellissi per l'intervallo di confidenza al 95% per ciascuna delle classi (per verificare quale le classi di ellissi si sovrappongono sotto ogni coppia di variabili).

Ho implementato il disegno delle ellissi in due modi diversi e le ellissi risultanti sono diverse! (ellissi più grandi per la prima implementazione!) A priori differiscono solo per dimensioni (un diverso ridimensionamento?), poiché i centri e l'angolo degli assi sembrano essere simili in entrambi. Immagino di dover fare qualcosa di sbagliato usandone uno (spero non con entrambi!) O con gli argomenti.

Qualcuno può dirmi cosa sto facendo di sbagliato?

Qui il codice per le due implementazioni; entrambi si basano sulle risposte a Come si può sovrapporre un'ellisse di dati su un diagramma a dispersione ggplot2?

### 1st implementation 
### using ellipse{ellipse}
library(ellipse)
library(ggplot2) 
library(RColorBrewer)
colorpal <- brewer.pal(10, "Paired")

x <- data$x
y <- data$y
group <- data$group
df <- data.frame(x=x, y=y, group=factor(group))

df_ell <- data.frame() 
for(g in levels(df$group)){df_ell <- rbind(df_ell, cbind(as.data.frame(with(df[df$group==g,], ellipse(cor(x, y),scale=c(sd(x),sd(y)),centre=c(mean(x),mean(y))))),group=g))} 

p1 <- ggplot(data=df, aes(x=x, y=y,colour=group)) + geom_point() + 
  geom_path(data=df_ell, aes(x=x, y=y,colour=group))+scale_colour_manual(values=colorpal)

### 2nd implementation 
###using function ellipse_stat() 
###code by Josef Fruehwald available in: https://github.com/JoFrhwld/FAAV/blob/master/r/stat-ellipse.R

p2 <-qplot(data=df, x=x,y=y,colour=group)+stat_ellipse(level=0.95)+scale_colour_manual(values=colorpal)

Ecco i due grafici insieme (il grafico a sinistra è p1implementazione ( ellipse()):

inserisci qui la descrizione dell'immagine

I dati sono disponibili qui: https://www.dropbox.com/sh/xa8xrisa4sfxyj0/l5zaGQmXJt


Questo potrebbe non avere importanza, ma quando eseguo il tuo codice ricevo un avviso, Warning message: In cov.trob(cbind(data$x, data$y)) : Probable convergence failureciò accade anche quando esegui il codice?
Atiretoo - Ripristina Monica

@atiretoo Sì, succede anche quando eseguo il codice. Non so perché. Forse qualcun altro lo sa? jose
josetanago,

Risposte:


9

Non stai facendo nulla di male, le due funzioni stanno facendo ipotesi di base diverse sulla distribuzione dei dati. La tua prima implementazione sta assumendo multivariata normale, e la seconda una distribuzione t multivariata (vedi? Cov.trob nel pacchetto MASS). L'effetto è più facile da vedere se si estrae un gruppo:

#pull out group 1
pick = group ==1
p3 <- qplot(data=df[pick,], x=x, y=y)
tl = with(df[pick,], 
     ellipse(cor(x, y),scale=c(sd(x),sd(y)),
             centre=c(mean(x),mean(y))))
p3 <- p3 + geom_path(data=as.data.frame(tl), aes(x=x, y=y))
p3 <- p3 + stat_ellipse(level=0.95)
p3 # looks off center
p3 <- p3 + geom_point(aes(x=mean(x),y=mean(y),size=2,color="red"))
p3

Quindi, sebbene sia vicino allo stesso centro e orientamento, non sono gli stessi. Puoi avvicinarti all'ellisse della stessa dimensione usando cov.trob()per ottenere la correlazione e la scala per il passaggio ellipse(), e usando l'argomento t per impostare il ridimensionamento uguale a una distribuzione f come stat_ellipse()fa.

tcv = cov.trob(data[pick,2:3],cor=TRUE)
tl = with(df[pick,], 
          ellipse(tcv$cor[2,1],scale=sqrt(diag(tcv$cov)),
                  t=qf(0.95,2,length(x)-1),
                  centre=tcv$center))
p3 <- p3 + geom_path(data=as.data.frame(tl), aes(x=x, y=y,color="red"))
p3

ma la corrispondenza non è ancora esatta. La differenza deve sorgere tra l'uso della scomposizione cholesky della matrice di covarianza e la creazione del ridimensionamento dalla correlazione e dalle deviazioni standard. Non sono abbastanza matematico per vedere esattamente dove sia la differenza.

Quale è corretto? Sta a te decidere! L' stat_ellipse()implementazione sarà meno sensibile ai punti periferici, mentre il primo sarà più conservativo.


1
Grazie mille per aver dedicato del tempo a risolvere questa domanda! Adesso è chiaro. jose
josetanago,

1
Mi piacciono le ellissi nelle trame, quindi è stato divertente vedere queste funzioni in azione.
atiretoo - reinstalla monica il
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.