Obtention de résultats différents lors du traçage d'ellipses à 95% CI avec ggplot ou le package ellipse

11

Je souhaite visualiser les résultats d'un clustering (produit avec protoclust{protoclust}) en créant des graphiques de scater pour chaque paire de variables utilisées pour classer mes données, en coloriant par classes et en chevauchant les ellipses pour l'intervalle de confiance à 95% pour chacune des classes (pour vérifier qui elipses-classes se chevauchent sous chaque paire de variables).

J'ai implémenté le dessin des ellipses de deux manières différentes et les ellipses résultantes sont différentes! (ellipses plus grosses pour la première implémentation!) A priori, elles ne diffèrent que par leur taille (une mise à l'échelle différente?), car les centres et l'angle des axes semblent être similaires dans les deux. Je suppose que je dois faire quelque chose de mal en utilisant l'un d'eux (j'espère pas avec les deux!), Ou avec les arguments.

Quelqu'un peut-il me dire ce que je fais mal?

Voici le code des deux implémentations; les deux sont basés sur les réponses à Comment une ellipse de données peut-elle être superposée à un nuage de points 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)

Voici les deux tracés ensemble (le graphique de gauche représente l' p1implémentation ( ellipse()):

entrez la description de l'image ici

Les données sont disponibles ici: https://www.dropbox.com/sh/xa8xrisa4sfxyj0/l5zaGQmXJt

josetanago
la source
Cela n'a peut-être pas d'importance, mais lorsque j'exécute votre code, je reçois un avertissement. Warning message: In cov.trob(cbind(data$x, data$y)) : Probable convergence failureCela se produit-il également lorsque vous exécutez le code?
atiretoo - réintègre monica
@atiretoo Oui, cela se produit également lorsque j'exécute le code. Je ne sais pas pourquoi. Peut-être que quelqu'un d'autre le sait? jose
josetanago

Réponses:

9

Vous ne faites rien de mal, les deux fonctions font des hypothèses sous-jacentes différentes sur la distribution des données. Votre première implémentation suppose une distribution multivariée normale et la seconde une distribution t multivariée (voir? Cov.trob dans le package MASS). L'effet est plus facile à voir si vous retirez un groupe:

#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

Ainsi, bien qu'ils soient proches du même centre et de la même orientation, ils ne sont pas les mêmes. Vous pouvez vous rapprocher de l'ellipse de même taille en utilisant cov.trob()pour obtenir la corrélation et l'échelle pour le passage à ellipse(), et en utilisant l'argument t pour définir l'échelle comme une distribution f comme stat_ellipse()cela.

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

mais la correspondance n'est toujours pas exacte. La différence doit apparaître entre l'utilisation de la décomposition cholesky de la matrice de covariance et la création de l'échelle à partir de la corrélation et des écarts-types. Je ne suis pas assez mathématicien pour voir exactement où est la différence.

Laquelle est correcte? C'est à vous de décider! La stat_ellipse()mise en œuvre sera moins sensible aux points périphériques, tandis que la première sera plus conservatrice.

atiretoo - réintégrer monica
la source
1
Merci beaucoup d'avoir pris le temps de résoudre cette question! C'est clair pour moi maintenant. jose
josetanago
1
J'aime les ellipses dans les tracés, donc c'était amusant de voir ces fonctions en action.
atiretoo - réintègre monica