Berechnen Sie die Chancen rekursiv.
Sei die Wahrscheinlichkeit, dass genau x- Werte, 0 ≤ x ≤ k , in allen s ≥ 1 unabhängigen Ziehungen von k Elementen (ohne Ersatz) aus einer Population von n ≥ k > 0 Mitgliedern ausgewählt werden. (Lassen Sie uns n und k für die Dauer der Analyse festhalten, damit sie nicht explizit erwähnt werden müssen.)ps(x)x0≤x≤ks≥1kn≥k>0nk
Sei die Wahrscheinlichkeit, dass, wenn in den ersten s - 1 Ziehungen genau y Werte ausgewählt werden, in der letzten Ziehung x ≤ y von ihnen ausgewählt werden. Dann, weil es Teilmengen von Elementen dieser Elemente gibt und Teilmengen der verbleibenden Elemente getrennt aus den anderen Mitgliedern der Population ausgewählt werden,ps(x∣y)ys−1x≤y(yx)y ( n - yxy k-xn-y(n−yk−x)k−xn−y
ps(x∣y)=(yx)(n−yk−x)(nk).
Das Gesetz der Gesamtwahrscheinlichkeit behauptet
ps(x)=∑y=xkps(x∣y)ps−1(y).
Für ist es eine Gewissheit, dass : Dies ist die Startverteilung.s=1x=k
Die Gesamtberechnung, die erforderlich ist, um die vollständige Verteilung durch Wiederholungen zu erhalten, beträgt . Das ist nicht nur ziemlich schnell, der Algorithmus ist auch einfach. Eine Gefahr für den unachtsamen Programmierer besteht darin, dass diese Wahrscheinlichkeiten extrem klein werden und Gleitkommaberechnungen unterlaufen können. Die folgende Implementierung vermeidet dies, indem die Werte von in den Spalten eines Arrays .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(...)))
Die Antwort auf die Frage erhält man, indem man und . s=5, n=10000=104k=100=102 Die Ausgabe ist ein Array, aber die meisten Zahlen sind so klein, dass wir uns auf sehr kleine . Hier sind die ersten vier Zeilen, die :101×5xx=0,1,2,3
p(5, 1e4, 1e2)[1:4, ]
Die Ausgabe ist
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
Die Werte von kennzeichnen die Zeilen, während die Werte von die Spalten kennzeichnen. Spalte 5 zeigt, dass die Wahrscheinlichkeit, dass ein Element in allen fünf Stichproben erscheint, winzig ist (ungefähr eins zu einer Million), und es besteht im Wesentlichen keine Chance, dass zwei oder mehr Elemente in allen fünf Stichproben auftreten.xs
Wenn Sie sehen möchten, wie gering diese Chancen sind, schauen Sie sich ihre Logarithmen an. Basis 10 ist praktisch und wir brauchen nicht viele Ziffern:
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
Die Ausgabe gibt an, wie viele Nullen nach dem Dezimalpunkt stehen:
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
Die Zahlen in der oberen Reihe sind Werte von . Zum Beispiel wird die Wahrscheinlichkeit, dass genau drei Werte in allen fünf Stichproben , durch Berechnen ermittelt , wobei und tatsächlich hat dies Nullen vor dem erste signifikante Ziffer. Zur Überprüfung ist der letzte Wert eine gerundete Version von . (was die Wahrscheinlichkeit zählt, dass das erste Sample in den nächsten vier Samples wieder erscheint) entsprichtxexp(u[4])
0.0000000000000000001434419…18967.0967.26(10000100)−410−967.26.