terça-feira, 3 de abril de 2012

A função sample() e probabilidades que não somam 1

Observamos em sala hoje que a função sample() não reclama se for designado ao seu argumento prob um vetor de probabilidades que não somam 1. Especificamente, o comando
sample(1:3, 20, replace = TRUE,
prob = c(0.1, 0.1, 0.9))
produziu uma amostra de vinte números sorteados do conjunto {1, 2, 3}, sem reclamar de termos pedido que, no sorteio, o número 1 tivesse probabilidade 10%; o número 2, probabilidade 10%; e o número 3, probabilidade 90%. O que está acontecendo? Vamos descobrir apelando para a lei dos grandes números:
amostra <- sample(1:3, 1000000,
replace = TRUE,
prob = c(0.1, 0.1, 0.9))
O vetor amostra criado acima contém um milhão de sorteios do conjunto {1, 2, 3}, com as mesmas probabilidades impróprias de antes. Depois de criar essa grande amostra, verifique quantos números 1, 2 e 3 foram produzidos, usando este comando:
for (n in 1:3)
print(length(amostra[amostra == n]))
Você verá que há aproximadamente 91 mil números 1; 91 mil números 2; e 818 mil números 3. De onde saíram essas frequências? Daqui:

91.000 ÷ 1.000.000  0,1 ÷ 1,1 = 0,1 ÷ (0,1+0,1+0,9)
818.000 ÷ 1.000.000  0,9 ÷ 1,1 = 0,9 ÷ (0,1+0,1+0,9)

Conclusão: quando a função sample() recebe um vetor de "probabilidades" cuja soma é diferente de 1, ela normaliza esses números, isto é, divide-os pela soma deles, e usa as probabilidades normalizadas para sortear elementos do espaço amostral representado no primeiro argumento.

PS: No último comando acima, usei pela primeira vez a estrutura de controle for, que ainda não estudamos. O que ela faz é simplesmente cumprir o comando print(length(amostra[amostra ==n])) três vezes, variando "n" de 1 a 3. O comando repetido, por sua vez, conta quantos números "n" são encontrados no vetor amostra.

Nenhum comentário:

Postar um comentário