2016-04-21 8 views
6

Perché i seguenti grafici sono diversi? Entrambi i metodi sembrano utilizzare i kernel gaussiani.In che modo la densità di ggplot2 differisce dalla funzione di densità?

In che modo ggplot2 calcola una densità?

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:

Una soluzione a questo problema appare già su SO here, tuttavia la PARAMETRI specifica ers ggplot2 sta passando alla funzione di densità delle statistiche R non è chiaro.

Una soluzione alternativa è quella di estrarre i dati di densità direttamente dal terreno ggplot2, come mostrato here

+0

Grazie per il riferimento. Tuttavia, la soluzione non sembra identificare le differenze esplicite dei parametri. Mi chiedo come posso generare/estrarre i dati di densità precisi dalla densità di ggplot. – Megatron

+1

Questo sembra estrarre i valori esatti grafici geom_density: http://stackoverflow.com/questions/12394321/r-what-algorithm-does-geom-density-use-and-how-to-extract-points-equation-of – fanli

+0

Non penso che questo abbia a che fare con la densità ma come si sta applicando la tranform di registro – user20650

risposta

3

In questo caso, non è il calcolo della densità che è diversa ma come il log10 trasformata viene applicata.

primo controllo le densità sono simili senza trasformare

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") 

Quindi il problema sembra essere la trasformazione. Nel stat_density di seguito, sembra che sia se la trasformazione log10 viene applicata alla variabile x prima del calcolo della densità. Quindi per riprodurre manualmente i risultati è necessario trasformare la variabile prima del calcolando la densità. Ad esempio

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: Per vedere come ggplot prepara i dati per la densità, è possibile guardare il codice as.list(StatDensity) porta a StatDensity$compute_group a ggplot2:::compute_density