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' p1
implémentation ( ellipse()
):
Les données sont disponibles ici: https://www.dropbox.com/sh/xa8xrisa4sfxyj0/l5zaGQmXJt
la source
Warning message: In cov.trob(cbind(data$x, data$y)) : Probable convergence failure
Cela se produit-il également lorsque vous exécutez le code?Réponses:
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:
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 commestat_ellipse()
cela.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.la source