Unterschiedliche Ergebnisse beim Zeichnen von 95% CI-Ellipsen mit ggplot oder dem Ellipsenpaket

11

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 p1Implementierung ( ellipse()):

Geben Sie hier die Bildbeschreibung ein

Die Daten sind hier verfügbar: https://www.dropbox.com/sh/xa8xrisa4sfxyj0/l5zaGQmXJt

Josetanago
quelle
Dies spielt möglicherweise keine Rolle, aber wenn ich Ihren Code ausführe, wird eine Warnung angezeigt. Geschieht Warning message: In cov.trob(cbind(data$x, data$y)) : Probable convergence failuredies auch, wenn Sie den Code ausführen?
Atiretoo - Wiedereinstellung Monica
@atiretoo Ja, es passiert auch, wenn ich den Code ausführe. Ich weiß nicht warum. Vielleicht weiß es noch jemand? Jose
Josetanago

Antworten:

9

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:

#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

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 verwenden ellipse()und das Argument t verwenden, um die Skalierung gleich einer f-Verteilung zu setzen stat_ellipse().

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

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.

atiretoo - Monica wieder einsetzen
quelle
1
Vielen Dank, dass Sie sich die Zeit genommen haben, diese Frage zu lösen! Es ist mir jetzt klar. Jose
Josetanago
1
Ich mag Ellipsen in Plots, daher hat es Spaß gemacht, diese Funktionen in Aktion zu sehen.
Atiretoo - Wiedereinstellung Monica