Calcola le possibilità in modo ricorsivo.
Sia la probabilità che siano selezionati esattamente valori , , in tutti i disegni indipendenti di elementi (senza sostituzione) da una popolazione di membri . (Teniamo e fissati per la durata dell'analisi in modo che non debbano essere menzionati esplicitamente.)x 0 ≤ x ≤ k s ≥ 1 k n ≥ k > 0 n kps(x)x0≤x≤ks≥1kn≥k>0nk
Sia la probabilità che se si selezionano esattamente valori nei primi disegni, allora di essi vengono selezionati nell'ultimo sorteggio. Quindi poiché ci sono di elementi di quegli elementi , e degli elementi rimanenti vengono selezionati separatamente dagli altri membri della popolazione,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 legge della probabilità totale afferma
ps(x)=∑y=xkps(x∣y)ps−1(y).
Per , è una certezza che : questa è la distribuzione iniziale.s=1x=k
Il calcolo complessivo necessario per ottenere la distribuzione completa attraverso ripetizioni è . Non solo è ragionevolmente veloce, ma l'algoritmo è semplice. Una trappola in attesa del programmatore inconsapevole è che queste probabilità possono diventare calcoli in virgola mobile estremamente piccoli e underflow. La seguente implementazione evita ciò calcolando i valori di nelle colonne di un array.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 risposta alla domanda si ottiene lasciando e . s=5, n=10000=104k=100=102 L'output è un array , ma la maggior parte dei numeri è così piccola che possiamo concentrarci su molto piccola . Ecco le prime quattro righe corrispondenti a :101×5xx=0,1,2,3
p(5, 1e4, 1e2)[1:4, ]
L'output è
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
I valori di indicano le righe mentre i valori di indicano le colonne. La colonna 5 mostra la possibilità che un elemento venga visualizzato in tutti e cinque i campioni sia minuscolo (circa uno su un milione) e sostanzialmente non vi è alcuna possibilità che due o più elementi compaiano in tutti e cinque i campioni.xs
Se vuoi vedere quanto sono piccole queste possibilità, guarda i loro logaritmi. La base 10 è comoda e non abbiamo bisogno di molte cifre:
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
L'output ci dice quanti zeri ci sono dopo il punto decimale:
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
I numeri nella riga superiore sono valori di . Ad esempio, la possibilità di visualizzare esattamente tre valori in tutti e cinque i campioni si ottiene calcolando , dando e in effetti questo ha zeri prima del prima cifra significativa. Come controllo, l'ultimo valore è una versione arrotondata di . (che conta le probabilità che il primo campione ricompaia nei prossimi quattro campioni) è uguale axexp(u[4])
0.0000000000000000001434419…18967.0967.26(10000100)−410−967.26.