Calculez les chances de manière récursive.
Soit la probabilité que exactement valeurs, , soient sélectionnées dans tous les tirages indépendants de éléments (sans remplacement) à partir d'une population de membres . (Gardons et fixes pour la durée de l'analyse afin qu'ils n'aient pas à être mentionnés explicitement.)x 0 ≤ x ≤ k s ≥ 1 k n ≥ k > 0 n kps(x)x0≤x≤ks≥1kn≥k>0nk
Soit la probabilité que si exactement les valeurs sont sélectionnées dans les premiers tirages , alors sont sélectionnées dans le dernier tirage. Ensuite, parce qu'il y a sous-ensembles de éléments de ces éléments, et sous-ensembles des éléments restants sont sélectionnés séparément parmi les autres membres de la population,y s - 1 x ≤ yps(x∣y)ys−1x≤y(yx)xy(n−yk−x)k−xn−y
ps(x∣y)=(yx)(n−yk−x)(nk).
La loi de la probabilité totale affirme
ps(x)=∑y=xkps(x∣y)ps−1(y).
Pour , c'est une certitude que : c'est la distribution de départ.s=1x=k
Le calcul total nécessaire pour obtenir la distribution complète jusqu'à répétitions est . Non seulement c'est assez rapide, l'algorithme est facile. Un écueil qui attend le programmeur imprudent est que ces probabilités peuvent devenir extrêmement petites et dépasser les calculs à virgule flottante. L' implémentation suivante évite cela en calculant les valeurs de dans les colonnes d'un tableau.sO(k2s)R
log(ps(x))1,2,…,s
lp <- function(s, n, k) {
P <- matrix(NA, nrow=k+1, ncol=s, dimnames=list(0:k, 1:s))
P[, 1] <- c(rep(-Inf, k), 0)
for (u in 2:s)
for (i in 0:k) {
q <- P[i:k+1, u-1] + lchoose(i:k, i) + lchoose(n-(i:k), k-i) - lchoose(n, k)
q.0 <- max(q, na.rm=TRUE)
P[i+1, u] <- q.0 + log(sum(exp(q - q.0)))
}
return(P)
}
p <- function(...) zapsmall(exp(lp(...)))
La réponse à la question est obtenue en laissant et . s=5, n=10000=104k=100=102 La sortie est un tableau , mais la plupart des nombres sont si petits que nous pouvons nous concentrer sur un très petit . Voici les quatre premières lignes correspondant à :101×5xx=0,1,2,3
p(5, 1e4, 1e2)[1:4, ]
La sortie est
1 2 3 4 5
0 0 0.3641945 0.9900484 0.9999 0.999999
1 0 0.3715891 0.0099034 0.0001 0.000001
2 0 0.1857756 0.0000481 0.0000 0.000000
3 0 0.0606681 0.0000002 0.0000 0.000000
Les valeurs de étiquettent les lignes tandis que les valeurs de étiquettent les colonnes. La colonne 5 montre la probabilité qu'un élément apparaisse dans les cinq échantillons est minuscule (environ un sur un million) et il n'y a pratiquement aucune chance que deux éléments ou plus apparaissent dans les cinq échantillons.xs
Si vous souhaitez voir à quel point ces chances sont faibles, regardez leurs logarithmes. La base 10 est pratique et nous n'avons pas besoin de beaucoup de chiffres:
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
La sortie nous indique combien de zéros il y a après le point décimal:
1 2 3 4 5 6 7 8 9 10 ... 97 98 99 100
6.0 12.3 18.8 25.5 32.3 39.2 46.2 53.2 60.4 67.6 ... 917.0 933.0 949.0 967.0
Les nombres dans la ligne supérieure sont des valeurs de . Par exemple, la probabilité d'exactement trois valeurs apparaissant dans les cinq échantillons est trouvée en calculant , donnant et en effet cela a zéros avant le premier chiffre significatif. À titre de vérification, la dernière valeur est une version arrondie de . (qui compte les chances que le premier échantillon réapparaisse dans les quatre échantillons suivants) est égal àxexp(u[4])
0.0000000000000000001434419…18967.0967.26(10000100)−410−967.26.