Ich möchte die Ergebnisse eines Clusters (erstellt mit protoclust{protoclust}
) visualisieren, indem ich Scater-Diagramme für jedes Variablenpaar erstelle, das zum Klassifizieren meiner Daten verwendet wird, nach Klassen färbt und die Ellipsen für das 95% -Konfidenzintervall für jede der Klassen überlappt (um zu überprüfen, welche elipses-Klassen überlappen sich unter jedem Variablenpaar.
Ich habe das Zeichnen der Ellipsen auf zwei verschiedene Arten implementiert und die resultierenden Ellipsen sind unterschiedlich! (größere Ellipsen für die erste Implementierung!) A priori unterscheiden sie sich nur in der Größe (einige unterschiedliche Skalierungen?), da die Mittelpunkte und der Winkel der Achsen in beiden Fällen ähnlich zu sein scheinen. Ich denke, ich muss etwas falsch machen, indem ich einen von ihnen (hoffe nicht mit beiden!) Oder mit den Argumenten benutze.
Kann mir jemand sagen, was ich falsch mache?
Hier der Code für die beiden Implementierungen; beide basieren auf den Antworten auf Wie kann eine Datenellipse einem ggplot2-Streudiagramm überlagert werden?
### 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)
Hier sind die beiden Diagramme zusammen (linkes Diagramm ist p1
Implementierung ( ellipse()
):
Die Daten sind hier verfügbar: https://www.dropbox.com/sh/xa8xrisa4sfxyj0/l5zaGQmXJt
quelle
Warning message: In cov.trob(cbind(data$x, data$y)) : Probable convergence failure
dies auch, wenn Sie den Code ausführen?Antworten:
Sie machen nichts falsch, die beiden Funktionen machen unterschiedliche zugrunde liegende Annahmen über die Verteilung der Daten. Ihre erste Implementierung setzt eine multivariate Normalverteilung voraus und die zweite eine multivariate t-Verteilung (siehe? Cov.trob im Paket MASS). Der Effekt ist leichter zu erkennen, wenn Sie eine Gruppe herausziehen:
Obwohl es nahe am selben Zentrum und an derselben Ausrichtung liegt, sind sie nicht dasselbe. Sie können sich der Ellipse derselben Größe annähern, indem
cov.trob()
Sie die Korrelation und die Skalierung für die Übergabe verwendenellipse()
und das Argument t verwenden, um die Skalierung gleich einer f-Verteilung zu setzenstat_ellipse()
.aber die Korrespondenz ist immer noch nicht genau. Der Unterschied muss zwischen der Verwendung der Cholesky-Zerlegung der Kovarianzmatrix und der Erstellung der Skalierung aus der Korrelation und den Standardabweichungen bestehen. Ich bin nicht genug Mathematiker, um genau zu sehen, wo der Unterschied liegt.
Was ist richtig? Die Entscheidung liegt bei Ihnen! Die
stat_ellipse()
Implementierung wird weniger empfindlich gegenüber abgelegenen Punkten sein, während die erste konservativer sein wird.quelle