Calcule as chances recursivamente.
Seja a probabilidade de que exatamente valores , , sejam selecionados em todos os sorteios independentes de itens (sem substituição) de uma população de membros . (Vamos manter e fixados durante a análise, para que eles não precisem ser mencionados explicitamente.)x 0 ≤ x ≤ k s ≥ 1 k n ≥ k > 0 n kps(x)x0≤x≤ks≥1kn ≥ k > 0nk
Seja a probabilidade de que, se exatamente os valores de forem selecionados nos primeiros desenhos , então deles sejam selecionados no último desenho. Como existem subconjuntos de elementos desses elementos , e subconjuntos dos elementos restantes são selecionados separadamente dos outros membros da população,y s - 1 x ≤ yps( 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).
A lei da probabilidade total afirma
ps(x)=∑y=xkps(x∣y)ps−1(y).
Para , é certo que : esta é a distribuição inicial.x = ks=1x=k
O cálculo total necessário para obter a distribuição completa até repetições é . Não é apenas razoavelmente rápido, o algoritmo é fácil. Uma armadilha que espera o programador incauto é que essas probabilidades podem se tornar extremamente pequenas e causar cálculos de ponto flutuante insuficiente. A implementação a seguir evita isso calculando os valores de nas colunas de uma matriz.O ( k 2 s ) log ( p s ( x ) ) 1 , 2 , … , ssO(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(...)))
A resposta à questão é obtida por deixar , e . n = 10000 = 10 4 k = 100 = 10 2s=5, n=10000=104k=100=102 A saída é uma matriz , mas a maioria dos números é tão pequena que podemos focar em muito pequeno . Aqui estão as quatro primeiras linhas correspondentes a :x x = 0 , 1 , 2 , 3101×5xx=0,1,2,3
p(5, 1e4, 1e2)[1:4, ]
A saída é
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
Os valores de rotulam as linhas, enquanto os valores de rotulam as colunas. A coluna 5 mostra a chance de um elemento aparecer em todas as cinco amostras ser minúscula (cerca de uma em um milhão) e não há essencialmente nenhuma chance de que dois ou mais elementos apareçam nas cinco amostras.sxs
Se você gostaria de ver quão pequenas são essas chances, veja os logaritmos deles. A base 10 é conveniente e não precisamos de muitos dígitos:
u <- lp(5, 1e4, 1e2)[, 5]
signif(-u[-1] / log(10), 3)
A saída nos diz quantos zeros existem após o ponto decimal:
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
Os números na linha superior são valores de . Por exemplo, a chance de exatamente três valores aparecerem nas cinco amostras é encontrada pela computação , fornecendo e, na verdade, isso tem zeros antes do primeiro dígito significativo. Como verificação, o último valor é uma versão arredondada de . (que conta as chances de a primeira amostra reaparecer nas próximas quatro amostras) é igual a0,000xexp(u[4])
18 967,0 967,26 ( 100000.0000000000000000001434419…18967.0967.2610-967,26.(10000100)−410−967.26.