2016-05-15 15 views
14

Ich versuche, eine Verteilung CDF mit R und ggplot2 plotten. Ich finde jedoch Schwierigkeiten beim Zeichnen der CDF-Funktion, nachdem ich die Y-Achse transformiert habe, um eine gerade Linie zu erhalten. Diese Art von Plot wird häufig in Gumbel Papier Plots verwendet, aber hier werde ich als Beispiel die Normalverteilung verwenden.ggplot Maßstab Transformation wirkt sich auf Punkte und Funktionen unterschiedlich

Ich erzeuge die Daten und plotten die kumulative Dichtefunktion der Daten zusammen mit der Funktion. Sie passen gut. Wenn ich jedoch eine Y-Achsen-Transformation anwende, passen sie nicht mehr.

sim <- rnorm(100) #Simulate some data 
sim <- sort(sim) #Sort it 

cdf <- seq(0,1,length.out=length(sim)) #Compute data CDF 

df <- data.frame(x=sim, y=cdf) #Build data.frame 

library(scales) 
library(ggplot2) 

#Now plot! 
gg <- ggplot(df, aes(x=x, y=y)) + 
     geom_point() + 
     stat_function(fun = pnorm, colour="red") 
gg 

Und die Ausgabe etwas auf den Linien sein sollte: enter image description here gut!

Jetzt versuche ich die Y-Achse entsprechend der verwendeten Verteilung zu transformieren.

#Apply transformation 
gg + scale_y_continuous(trans=probability_trans("norm")) 

Und das Ergebnis ist: enter image description here

Die Punkte korrekt umgewandelt werden (sie auf einer Geraden liegen), aber die Funktion ist es nicht!

Allerdings scheint alles in Ordnung zu arbeiten, wenn ich so tun, die CDF mit ggplot Berechnung:

ggplot(data.frame(x=sim), aes(x=x)) + 
    stat_ecdf(geom = "point") + 
    stat_function(fun="pnorm", colour="red") + 
    scale_y_continuous(trans=probability_trans("norm")) 

Das Ergebnis OK ist: This wokrs OK

Warum ist das passiert? Warum funktioniert die Berechnung der CDF nicht manuell mit Skalierungstransformationen?

Antwort

8

Dies funktioniert:

gg <- ggplot(df, aes(x=x, y=y)) + 
    geom_point() + 
    stat_function(fun ="pnorm", colour="red", inherit.aes = FALSE) + 
    scale_y_continuous(trans=probability_trans("norm")) 
gg 

enter image description here

Mögliche Erklärung:

Dokumentation Staaten: inherit.aes Wenn FALSCH, überschreibt die Standard-Ästhetik, anstatt mit ihnen kombiniert . Dies ist besonders nützlich für Hilfsfunktionen, die sowohl Daten als auch Ästhetik definieren und das Verhalten nicht von der Standard-Plot-Spezifikation erben sollen, z. Grenzen.

Meine Vermutung: Wie scale_y_continuous die Ästhetik der Haupthandlung ändert, müssen wir den Standard inherit.aes=TRUE auszuschalten. Es scheint inherit.aes=TRUE in stat_function wählt seine Ästhetik aus der ersten Schicht der Handlung, und so die Skala Umwandlung wirkt sich nicht aus, wenn nicht speziell gewählt.

+0

Vielen Dank. Haben Sie eine Hypothese, warum die Verwendung von 'geom_ecdf()' auch ohne 'inherit.aes' funktioniert? – AF7

+1

'stat_ecdf' hat keine ästhetische Vererbungsstruktur, die einzige Option ist das Überschreiben der Ebenenästhetik durch Überschreiben dieser Ebene. 'stat_function' hingegen _überlagert_ eine Funktion auf der Plot-Ebene und' inherit.aes = TRUE' (der Standardwert) wählt ästhetische Zuordnungen von der obersten Ebene des Plots aus. Was mir das eigentliche Problem verraten hat, war der _superimpose_ in 'stat_function'.Es scheint mir, dass "stat_function" entworfen wurde, um den Mappings des tatsächlichen Plots zu folgen, den Sie konstruieren (obere Schicht), ohne von allen niedrigeren Schichtänderungen zu den ästhetischen Abbildungen betroffen zu werden. – Divi