Encuentra intervalos de densidad de probabilidad

9

Tengo el vector

x <- c(1,2,3,4,5,5,5,6,6,6,6,
       7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
       7,7,7,7,7,7,7,7,8,8,8,8,9,9,9,10)

(mi vector real tiene una longitud de> 10,000) y me gustaría encontrar los intervalos donde se encuentra el 90% de la densidad. ¿Es quantile(x, probs=c(0.05,0.95), type=5)el más apropiado o hay alguna otra manera?

ECII
fuente
Su pregunta es un poco vaga acerca de "los intervalos donde ...", podría haber múltiples intervalos. ¿Está interesado únicamente en el 90% interno, es decir, recorte simétrico en cada lado? Después de todo, del mínimo al 90% de ile, se captura el 90% de los datos, de manera similar para el 10% de ile al valor máximo.
Iterator
¿Está buscando un intervalo más corto, un intervalo simétrico (igual probabilidad en cada extremo) o algo más?
Glen_b: reinstala a Monica el

Respuestas:

19

Como se señaló anteriormente, hay muchas formas diferentes de definir un intervalo que incluye el 90% de la densidad. Uno que aún no se ha señalado es el intervalo de densidad [posterior] más alto ( wikipedia ), que se define como "el intervalo más corto para el cual la diferencia en los valores empíricos de la función de densidad acumulativa de los puntos finales es la probabilidad nominal".

library(coda)
HPDinterval(as.mcmc(x), prob=0.9)
Ben Bolker
fuente
3

Ciertamente parece el enfoque más directo. La función es bastante rápida. Lo uso todo el tiempo en muestras que son cientos de veces más grandes que la que está utilizando, y la estabilidad de las estimaciones debería ser buena para el tamaño de su muestra.

Hay funciones en otros paquetes que proporcionan conjuntos más completos de estadísticas descriptivas. El que uso es Hmisc::describe, pero hay varios otros paquetes con describefunciones.

DWin
fuente
3

Su manera parece sensata, especialmente con los datos discretos en el ejemplo,

quantile(x,probs=c(0.05,0.95), type=5)
 5% 95% 
2.8 9.0

pero otra forma sería usar un núcleo de densidad calculada:

dx <- density(x)
dn <- cumsum(dx$y)/sum(dx$y)
li <- which(dn>=0.05)[1]
ui <- which(dn>=0.95)[1]
dx$x[c(li,ui)]
[1] 2.787912 9.163246
James
fuente
-1

Si. :-). Es posible que la salida de stats::densitysea ​​más útil.

Carl Witthoft
fuente