2011-08-07 25 views
17

Tengo conjunto de datos y quiero analizar estos datos por función de densidad de probabilidad o función de masa de probabilidad en R, utilicé la función de densidad pero no me dio una probabilidad.Densidad de probabilidad de trazado/función de masa del conjunto de datos en R

mis datos como estos:

"step","Time","energy" 
1, 22469 , 392.96E-03 
2, 22547 , 394.82E-03 
3, 22828,400.72E-03 
4, 21765, 383.51E-03 
5, 21516, 379.85E-03 
6, 21453, 379.89E-03 
7, 22156, 387.47E-03 
8, 21844, 384.09E-03 
9 , 21250, 376.14E-03 
10, 21703, 380.83E-03 

quiero llegar PDF/PMF a vector energético, los datos se tienen en cuenta son discreto por naturaleza, así que no tengo tipo especial para la distribución de los datos.

+1

No "la función de densidad de probabilidad" haría solo sea una probabilidad con datos discretos que no es lo que asumen las funciones de densidad. –

+0

Entonces, ¿quieres la CDF empírica? – Iterator

Respuesta

28

Sus datos no parecen discretos para mí. Esperar una probabilidad cuando se trabaja con datos continuos es completamente erróneo. density() le da una función de densidad empírica, que se aproxima a la función de densidad real. Para demostrar que es una densidad correcta, se calcula el área bajo la curva:

energy <- rnorm(100) 
dens <- density(energy) 
sum(dens$y)*diff(dens$x[1:2]) 
[1] 1.000952 

Teniendo en cuenta algunos errores de redondeo. el área bajo la curva resume hasta uno, y por lo tanto el resultado de density() cumple con los requisitos de un PDF.

Utilice la opción probability=TRUE de hist o la función density() (o ambos)

por ejemplo:

hist(energy,probability=TRUE) 
lines(density(energy),col="red") 

da

enter image description here

Si realmente necesita una probabilidad para una discreta variable, usted usa:

x <- sample(letters[1:4],1000,replace=TRUE) 
prop.table(table(x)) 
x 
    a  b  c  d 
0.244 0.262 0.275 0.219 

Editar: Ilustración por qué los ingenuos count(x)/sum(count(x)) No es una solución. De hecho, no es porque los valores de los contenedores sean iguales a uno, sino por el área bajo la curva. Para eso, tienes que multiplicar con el ancho de los 'bins'. Tome la distribución normal, para lo cual podemos calcular el PDF usando dnorm(). Siguiendo código construye una distribución normal, calcula la densidad, y la compara con la solución ingenua:

x <- sort(rnorm(100,0,0.5)) 
h <- hist(x,plot=FALSE) 
dens1 <- h$counts/sum(h$counts) 
dens2 <- dnorm(x,0,0.5) 

hist(x,probability=TRUE,breaks="fd",ylim=c(0,1)) 
lines(h$mids,dens1,col="red") 
lines(x,dens2,col="darkgreen") 

Da:

enter image description here


La función de distribución acumulativa

En case @Iterator tenía razón, es bastante fácil construir el dist acumulado función de distribución de la densidad. La CDF es la integral del PDF. En el caso de los valores discretos, simplemente la suma de las probabilidades.Para los valores continuos, podemos utilizar el hecho de que los intervalos para la estimación de la densidad empírica son iguales, y calcular:

cdf <- cumsum(dens$y * diff(dens$x[1:2])) 
cdf <- cdf/max(cdf) # to correct for the rounding errors 
plot(dens$x,cdf,type="l") 

Da:

enter image description here

+0

Buena explicación. Usar 'type =" s "' es, creo, una forma más intuitiva de mostrar un cdf empírico (no a partir de una estimación de densidad), ya que da una sensación de muestreo en el intervalo mostrado. –

Cuestiones relacionadas