2011-02-17 29 views
5

Me gustaría graficar datos de modo que en el eje y haya una probabilidad (en el rango [0,1]) y en el eje x tenga los valores de los datos. Los datos son contiguos (también en el rango [0,1]), por lo tanto, me gustaría usar alguna función de estimación de la densidad del kernel y normalizarla de modo que el valor y en algún punto x signifique la probabilidad de ver el valor x en la entrada datos.Probabilidad de trazado con ggplot2 (no densidad)

lo tanto, me gustaría preguntar:

a) ¿Es razonable en absoluto? Entiendo que no puedo tener la probabilidad de ver valores que no tengo en los datos, pero me gustaría interpolar entre los puntos que tengo usando una función de estimación de la densidad del kernel y luego normalizarla.

b) ¿Hay alguna opción incorporada en ggplot que pueda usar, que anularía el comportamiento predeterminado de geom_density() por ejemplo para hacer esto?

Gracias de antemano,

Timo

EDIT: cuando dije "normalizar" antes, yo en realidad quería decir "escala". Pero obtuve la respuesta, así que gracias chicos por aclarar mi opinión sobre esto.

+3

No estoy seguro de lo que quiere decir trazando la probabilidad, pero "no densidad", sin embargo, menciona que desea kernel suavizar los datos. Lo que hace el kernel es convertir una distribución empírica (es decir, el histograma) en una función de densidad suavizada (es decir, el PDF). Creo que tienes que dejar de lado el requisito más suave del kernel o el deseo de no graficar la densidad. Aunque puede estar abordando esto cuando dice "normalizarlo después". –

+0

Gracias por aclarar mi mente. Creo que usar un histograma es más apropiado en este caso. Si traté de trazar la probabilidad con el suavizado, creo que confundiría a cualquiera que intente interpretar las tramas. – Timo

Respuesta

9

Esto no es una respuesta ggplot, pero si desea unir las ideas del suavizado del kernel y los histogramas, puede hacer un enfoque de arranque + suavizado. Vas a ser derrotado en la cabeza y los hombros por Estadísticas gente para hacer las cosas feas de este tipo, a fin de utilizar a su propio riesgo;)

comienzo con algunos datos sintéticos:

set.seed(1) 
randomData <- c(rnorm(100, 5, 3), rnorm(100, 20, 3)) 
hist(randomData, freq=FALSE) 
lines(density(randomData), col="red") 

enter image description here

la función de densidad tiene una calculadora de ancho de banda razonablemente inteligente que puede tomar prestado de:

bw <- density(randomData)$bw 
resample <- sample(randomData, 10000, replace=TRUE) 

continuación, utilizar el ancho de banda como el calco SD para m aga algo de ruido aleatorio

noise <- rnorm(10000, 0, bw) 
hist(resample + noise, freq=FALSE) 
lines(density(randomData), col="red") 

enter image description here

Oye mira! ¡Un núcleo suavizó el histograma!

Sé que esta respuesta larga no es realmente una respuesta a su pregunta, pero tal vez proporcionará algunas ideas creativas sobre cómo abusar de sus datos.

+0

¡Impresionante! ¡Es un hack muy limpio que usaste para lograr esto! Gracias por el tiempo y el esfuerzo para compartirlo. Ciertamente lo probaré más en profundidad mañana. Mientras tanto, tomo tus precauciones sobre ser golpeado seriamente por la gente de las estadísticas :) – Timo

7

Puede controlar el comportamiento de la densidad/estimación del núcleo en ggplot llamando a stat_density() en lugar de a geom_density().

Consulte el manual del usuario en línea: http://had.co.nz/ggplot2/stat_density.html Puede especificar cualquiera de las funciones de estimación del kernel que son compatibles con las estadísticas por :: densidad()

library(ggplot2) 
df <- data.frame(x = rnorm(1000)) 
ggplot(df, aes(x=x)) + stat_density(kernel="biweight") 

enter image description here

+0

Gracias, aunque mi problema principal era cómo escalar la ... densidad, de modo que después correspondería a la probabilidad de que el valor en la posición x ocurra. Pero como @JDLong comentó anteriormente, este enfoque no tiene mucho sentido en la mayoría de los casos. – Timo

9

sólo que componen una fusión rápida de las respuestas de @JD largo y @ ayer:

ggplot(df, aes(x=x)) + 
    geom_histogram(aes(y = ..density..), binwidth=density(df$x)$bw) + 
    geom_density(fill="red", alpha = 0.2) + 
    theme_bw() + 
    xlab('') + 
    ylab('') 

enter image description here

De esta manera el binwidth para ggplot2 fue calculado por la función density, y también el último está dibujado en la parte superior de un histograma con una buena transparencia. Pero definitivamente debe mirar stat_densitiy como se sugirió ayer para mayor personalización.

Cuestiones relacionadas