Trouver des intervalles de densité de probabilité

9

J'ai le vecteur

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)

(mon vecteur réel a une longueur> 10 000) et je voudrais trouver les intervalles où se trouvent les 90% de la densité. Est-ce quantile(x, probs=c(0.05,0.95), type=5)le plus approprié ou existe-t-il une autre manière?

ECII
la source
Votre question est un peu vague sur "les intervalles où ..." - il pourrait y avoir plusieurs intervalles. Êtes-vous intéressé uniquement par les 90% intérieurs, c'est-à-dire par une coupe symétrique de chaque côté? Après tout, du minimum à 90% ile, 90% des données sont capturées, de même pour 10% ile à la valeur max.
Iterator
Recherchez-vous un intervalle le plus court, un intervalle symétrique (probabilité égale à chaque extrémité) ou autre chose?
Glen_b -Reinstate Monica

Réponses:

19

Comme indiqué ci-dessus, il existe de nombreuses façons différentes de définir un intervalle qui comprend 90% de la densité. Celui qui n'a pas encore été souligné est l' intervalle de densité [postérieure] le plus élevé ( wikipedia ), qui est défini comme "l'intervalle le plus court pour lequel la différence dans les valeurs empiriques de la fonction de densité cumulative des points terminaux est la probabilité nominale".

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

Cela semble certainement l'approche la plus simple. La fonction est assez rapide. Je l'utilise tout le temps sur des échantillons qui sont des centaines de fois plus gros que celui que vous utilisez, et la stabilité des estimations devrait être bonne à la taille de votre échantillon.

Il existe des fonctions dans d'autres packages qui fournissent des ensembles plus complets de statistiques descriptives. Celui que j'utilise est Hmisc::describe, mais il existe plusieurs autres packages avec des describefonctions.

DWin
la source
3

Votre chemin semble sensé, surtout avec les données discrètes de l'exemple,

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

mais une autre façon serait d'utiliser un noyau de densité calculé:

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
la source
-1

Oui. :-). Vous pouvez trouver la sortie de stats::densityplus utile.

Carl Witthoft
la source