Como faço para calcular um PMF e CDF para uma distribuição binomial no MATLAB?
-
19-09-2019 - |
Pergunta
Preciso calcular a função de massa de probabilidade e função de distribuição cumulativa, do distribuição binomial. Eu gostaria de usar o MATLAB para fazer isso (matlab bruto, sem caixas de ferramentas). Eu posso calculá -los eu mesmo, mas esperava usar uma função predefinida e não consigo encontrar nenhum. Há algo lá fora?
function x = homebrew_binomial_pmf(N,p)
x = [1];
for i = 1:N
x = [0 x]*p + [x 0]*(1-p);
end
Solução
Você pode usar a função Nchoosek Para calcular o coeficiente binomial. Com isso, você pode criar uma função que calcule o valor da função de massa de probabilidade para um conjunto de k
valores para um dado N
e p
:
function pmf = binom_dist(N,p,k)
nValues = numel(k);
pmf = zeros(1,nValues);
for i = 1:nValues
pmf(i) = nchoosek(N,k(i))*p^k(i)*(1-p)^(N-k(i));
end
end
Para plotar a função de massa de probabilidade, você faria o seguinte:
k = 0:40;
pmf = binom_dist(40,0.5,k);
plot(k,pmf,'r.');
e a função de distribuição cumulativa pode ser encontrada a partir da função de massa de probabilidade usando Cumsum:
cummDist = cumsum(pmf);
plot(k,cummDist,'r.');
NOTA: Quando o coeficiente binomial retornou de Nchoosek é grande, você pode acabar perdendo precisão. Uma alternativa muito boa é usar o envio Aritmética inteira de precisão variável a partir de John D'Errico no Mathworks File Exchange. Convertendo seus números para o dele vpi
Tipo, você pode evitar a perda de precisão.
Outras dicas
O Octave fornece uma boa coleção de PDF de distribuição, CDF, Quantil; Eles precisam ser traduzidos da oitava, mas isso é relativamente trivial (convertido endif
para end
, converta !=
para ~=
, etc;) ver por exemplo Octave binocdf Para a função binomial do CDF.
parece para o CDF da distribuição binomial, minha melhor aposta é o Função beta incompleta betainc.
Para pdf
x=1:15
p=.45
c=binopdf(x,15,p)
plot(x,c)
Da mesma forma, CDF
D=binocdf(x,15,p)
plot(x,D)