2016-04-21 22 views
6

Warum sehen die folgenden Plots anders aus? Beide Methoden scheinen Gaußsche Kernel zu verwenden.Wie unterscheidet sich die Dichte von ggplot2 von der Dichtefunktion?

Wie berechnet ggplot2 eine Dichte?

library(fueleconomy) 

d <- density(vehicles$cty, n=2000) 
ggplot(NULL, aes(x=d$x, y=d$y)) + geom_line() + scale_x_log10() 

enter image description here

ggplot(vehicles, aes(x=cty)) + geom_density() + scale_x_log10() 

enter image description here


UPDATE:

Eine Lösung dieser Frage erscheint bereits auf SO here jedoch die spezifische paramet ers ggplot2 wird an die R-Statistik übergeben, die Dichtefunktion bleibt unklar.

Eine alternative Lösung ist, die Dichtedaten direkt aus dem ggplot2 Plot zu extrahieren, wie here

+0

Danke für den Hinweis. Die Lösung scheint jedoch die expliziten Parameterunterschiede nicht zu identifizieren. Ich frage mich, wie ich die genauen Dichtedaten von der ggplot Dichte erzeugen/extrahieren kann. – Megatron

+1

Dies scheint die genauen Werte geom_density plots zu extrahieren: http://stackoverflow.com/questions/12394321/r-what-algorithm-does-geom-density-use-and-how-to-extract-points-equation-of – fanli

+0

Ich denke nicht, dass dies mit der Dichte zu tun hat, sondern wie Sie die Protokolltranformierung anwenden – user20650

Antwort

3

In diesem Fall gezeigt ist, ist es nicht die Dichteberechnung, die anders ist aber wie die log10-Transformation angewandt wird.

Überprüfen Sie zuerst die Dichten ähnlich ohne Transformation

library(ggplot2) 
library(fueleconomy) 

d <- density(vehicles$cty, from=min(vehicles$cty), to=max(vehicles$cty)) 
ggplot(data.frame(x=d$x, y=d$y), aes(x=x, y=y)) + geom_line() 
ggplot(vehicles, aes(x=cty)) + stat_density(geom="line") 

So ist die Frage der Transformation zu sein scheint. In der folgenden stat_density scheint es als , wenn die Log10-Transformation auf die x-Variable vor der Dichteberechnung angewendet wird. Um also die Ergebnisse manuell zu reproduzieren, müssen Sie die Variable vor der Berechnung der Dichte transformieren.

zB
d2 <- density(log10(vehicles$cty), from=min(log10(vehicles$cty)), 
               to=max(log10(vehicles$cty))) 
ggplot(data.frame(x=d2$x, y=d2$y), aes(x=x, y=y)) + geom_line() 
ggplot(vehicles, aes(x=cty)) + stat_density(geom="line") + scale_x_log10() 

PS: Um zu sehen, wie ggplot die Daten für die Dichte bereitstellt, können Sie den Code anschauen as.list(StatDensity)-StatDensity$compute_group führt zu ggplot2:::compute_density