2013-11-29 6 views
6

Ich versuche, eine ECDF einiger Daten mit einem "Konfidenzintervall" zu zeichnen, das durch einen schattierten Bereich dargestellt wird, indem ggplot2 verwendet wird. Ich habe Probleme, geom_ribbon() mit stat_ecdf() zu kombinieren, um den Effekt zu erzielen, nach dem ich bin.Wie kann stat_ecdf mit geom_ribbon kombiniert werden?

Betrachten Sie die folgenden Beispieldaten:

set.seed(1) 
dat <- data.frame(variable = rlnorm(100) + 2) 
dat <- transform(dat, lower = variable - 2, upper = variable + 2) 

> head(dat) 
    variable  lower upper 
1 2.534484 0.5344838 4.534484 
2 3.201587 1.2015872 5.201587 
3 2.433602 0.4336018 4.433602 
4 6.929713 4.9297132 8.929713 
5 3.390284 1.3902836 5.390284 
6 2.440225 0.4402254 4.440225 

Ich bin in der Lage eine ECDF von variable mit

library("ggplot2") 
ggplot(dat, aes(x = variable)) + 
    geom_step(stat = "ecdf") 

aber ich bin nicht in der Lage zu produzieren lower und upper wie die ymin und ymax Ästhetik zu verwenden, von geom_ribbon(), um das Konfidenzintervall auf dem Diagramm als eine andere Ebene zu überlagern. Ich habe versucht:

ggplot(dat, aes(x = variable)) + 
    geom_ribbon(aes(ymin = lower, ymax = upper), stat = "ecdf") + 
    geom_step(stat = "ecdf") 

aber stellt sich die folgende Fehler

Error: geom_ribbon requires the following missing aesthetics: ymin, ymax 

Gibt es eine Möglichkeit geom_ribbon() in Koax mit stat_ecdf() Arbeits einen schattigen Konfidenzintervall zu produzieren? Oder kann jemand ein alternatives Mittel vorschlagen, um ein schattiertes Polygon hinzuzufügen, das durch lower und upper als eine Ebene für das ECDF-Diagramm definiert ist?

Antwort

3

starten (ein wenig Schuss im Dunkeln):

ggplot(dat, aes(x = variable)) + 
    geom_ribbon(aes(x = variable,ymin = ..y..-2,ymax = ..y..+2), stat = "ecdf",alpha=0.2) + 
    geom_step(stat = "ecdf") 

Ok, das ist so nicht dasselbe wie das, was Sie zu tun versuchen, aber es sollte erklären, was los ist. Die stat gibt einen Datenrahmen mit nur dem ursprünglichen x und dem berechneten y zurück, also denke ich, dass das alles ist, mit dem Sie arbeiten müssen. d. h. stat_ecdf berechnet nur die kumulative Verteilungsfunktion für ein einziges x zu einem Zeitpunkt.

Die einzige andere Sache, die ich von der offensichtlich denken kann, die untere und obere Berechnung getrennt, so etwas wie:

l <- ecdf(dat$lower) 
u <- ecdf(dat$upper) 
v <- ecdf(dat$variable) 
dat$lower1 <- l(dat$variable) 
dat$upper1 <- u(dat$variable) 
dat$variable1 <- v(dat$variable) 

ggplot(dat,aes(x = variable)) + 
    geom_step(aes(y = variable1)) + 
    geom_ribbon(aes(ymin = upper1,ymax = lower1),alpha = 0.2) 
+0

Danke Joran. Könnten Sie Ihren letzten Satz erweitern? Ich bin mir nicht sicher, ob ich dem vollständig folge, aber soweit ich das aus deiner Antwort ersehen kann, kann ich das nicht über 'stat_ecdf 'tun, wenn' low' und 'upper' bereits existieren? Das +/- 2-Bit war nur Dummy-Daten; Die CI-Information, die ich habe, ist das Ergebnis der nachträglichen Simulation einer abgeleiteten Statistik, die aus einem angepassten Modell berechnet wurde. –

+1

@GavinSimpson Ja, ich denke, es ist nicht direkt in ggplot möglich (obwohl das wäre eine nette Funktion hinzuzufügen, denke ich). Alles, was ich mit dem letzten Bit meinte, war, dass Sie vielleicht alle ECDF-Werte manuell berechnen und dann plotten müssen. – joran

+0

Danke, ich verstehe, was Sie meinen, berechnen Sie den kumulativen Anteil direkt. Ich werde das tun. +1 –

2

nicht sicher, wie Sie die CI reflektieren wollen, aber ggplot_build() können Sie erhalten die generierten Daten aus der Handlung zurück, können Sie dann überplotten, was Sie mögen.

Diese Grafik zeigt:

  • rot = original ribbon
  • blau = nimmt die ursprüngliche CI Vektoren und gilt für die ECDF Kurve
  • grün = berechnet die ECDF der oberen und unteren Reihe und Plots

enter image description here

g<-ggplot(dat, aes(x = variable)) + 
     geom_step(stat = "ecdf") + 
     geom_ribbon(aes(ymin = lower, ymax = upper), alpha=0.5, fill="red") 

    inside<-ggplot_build(g) 
    matched<-merge(inside$data[[1]],data.frame(x=dat$variable,dat$lower,dat$upper),by=("x")) 

    g + 
     geom_ribbon(data=matched, aes(x = x, 
             ymin = y + dat.upper-x, 
             ymax = y - x + dat.lower), 
        alpha=0.5, fill="blue") + 
     geom_ribbon(data=matched, aes(x = x, 
             ymin = ecdf(dat.lower)(x), 
             ymax = ecdf(dat.upper)(x)), 
        alpha=0.5, fill="green") 
+0

Danke Troja; Ihre endgültige Idee, sobald ich realisiert habe, was die Handlung zeigte, ist ähnlich wie die Idee von @ joran, nämlich dass man mit 'ecdf()' die entsprechenden 'y' Daten für die unteren und oberen CIs berechnen kann. Das grüne Band ist im Wesentlichen das, was ich darstellen möchte. –

Verwandte Themen