Como faço para calcular um PMF e CDF para uma distribuição binomial no MATLAB?

StackOverflow https://stackoverflow.com/questions/1889778

  •  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
Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top