Cálculo dos parâmetros de uma distribuição Beta usando a média e a variância


66

Como posso calcular os parâmetros e para uma distribuição Beta, se eu souber a média e a variação que quero que a distribuição tenha? Exemplos de um comando R para fazer isso seriam mais úteis.βαβ


4
Observe que o pacote betareg em R usa uma parametrização alternativa (com a média, , e a precisão, e, portanto, a variação é ), o que evita a necessidade desses cálculos. μ=α/α+βϕ=α+βμ(1μ)/(1+ϕ)
gung - Restabelece Monica

Respostas:


90

I definida e e resolvido para e . Meus resultados mostram que e

μ=αα+β
σ2=αβ(α+β)2(α+β+1)
αβ
α=(1μσ21μ)μ2
β=α(1μ1)

Eu escrevi um código R para estimar os parâmetros da distribuição Beta de uma determinada média, mu e variância, var:

estBetaParams <- function(mu, var) {
  alpha <- ((1 - mu) / var - 1 / mu) * mu ^ 2
  beta <- alpha * (1 / mu - 1)
  return(params = list(alpha = alpha, beta = beta))
}

Houve alguma confusão em torno dos limites de e para qualquer distribuição Beta, então vamos deixar isso claro aqui.μσ2

  1. μ=αα+β(0,1)
  2. σ2=αβ(α+β)2(α+β+1)=μ(1μ)α+β+1<μ(1μ)1=μ(1μ)(0,0.52)

2
@stan Isso fornecerá a distribuição Beta, que tem a mesma média e variação dos seus dados. Não lhe dirá quão bem a distribuição se ajusta aos dados. Faça o teste de Kolmogorov-Smirnov .
usar o seguinte código

4
Quando eu chamo essa função , estBetaParams(0.06657, 0.1)recebo . Como isso é possível? alpha=-0.025beta=-0.35
Amelio Vazquez-Reina

11
Esses cálculos funcionarão apenas se a variação for menor que a média * (1 média).
Danno

2
@danno - É sempre o caso . Para ver isso, reescreva a variação como . Como , . σ2μ(1μ)σ2=μ(1μ)α+β+1α+β+11σ2μ(1μ)
assumednormal

11
@ AmelioVazquez-Reina Se você fornecer seus dados originais, espero que rapidamente seja óbvio por que uma distribuição beta não é adequada.
Glen_b

21

Aqui está uma maneira genérica de resolver esses tipos de problemas, usando o Maple em vez de R. Isso também funciona para outras distribuições:

with(Statistics):
eq1 := mu = Mean(BetaDistribution(alpha, beta)):
eq2 := sigma^2 = Variance(BetaDistribution(alpha, beta)):
solve([eq1, eq2], [alpha, beta]);

o que leva à solução

α=μ(σ2+μ2μ)σ2β=(σ2+μ2μ)(μ1)σ2.

Isso é equivalente à solução de Max.


5

Em R, a distribuição beta com parâmetros e tem densidadeshape1=ashape2=b

f(x)=Γ(a+b)Γ(a)Γ(b)xa1(1x)b1 ,

para , e .a>0b>00<x<1

Em R, você pode calculá-lo

dbeta (x, forma1 = a, forma2 = b)

Nessa parametrização, a média é e a variação é . Então, agora você pode seguir a resposta de Nick Sabbe.E(X)=aa+bV(X)=ab(a+b)2(a+b+1)

Bom trabalho!

Editar

Eu acho:

a=(1μV1μ)μ2 ,

e

b=(1μV1μ)μ(1μ) ,

onde e .μ=E(X)V=V(X)


Sei que minha resposta é muito parecida com as outras. No entanto, eu acredito que é sempre um bom ponto para verificar primeiro o que parametrização R usa ....
Ocram

2

Na Wikipedia, por exemplo, você pode encontrar as seguintes fórmulas para média e variância de uma distribuição beta dada alfa e beta: e Invertendo-os (preencha na equação inferior) deve dê o resultado que você deseja (embora possa levar algum trabalho).

μ=αα+β
σ2=αβ(α+β)2(α+β+1)
β=α(1μ1)

11
Wikipedia tem uma seção sobre estimativa de parâmetros que lhe permite evitar muito trabalho :)
rm999

1

Para uma distribuição Beta generalizada definida no intervalo , você tem as relações:[a,b]

μ=aβ+bαα+β,σ2=αβ(ba)2(α+β)2(1+α+β)

que pode ser invertido para fornecer:

α=λμaba,β=λbμba

Onde

λ=(μa)(bμ)σ21

Um usuário tentou deixar o seguinte comentário: "há um erro em algum lugar aqui. A formulação atual não retorna a variação correta".
quer

1

Resolva a equação para ou , resolvendo para , você obtém Em seguida, conecte-o à segunda equação e resolva . Então você obtém que simplifica to Depois termine de resolver para .μαββ

β=α(1μ)μ
α
σ2=α2(1μ)μ(α+α(1μ)μ)2(α+α(1μ)μ+1)
σ2=α2(1μ)μ(αμ)2α+μμ
σ2=(1μ)μ2α+μ
α


0

Eu estava procurando por python, mas me deparei com isso. Portanto, isso seria útil para outras pessoas como eu.

Aqui está um código python para estimar os parâmetros beta (de acordo com as equações fornecidas acima):

# estimate parameters of beta dist.
def getAlphaBeta(mu, sigma):
    alpha = mu**2 * ((1 - mu) / sigma**2 - 1 / mu)

    beta = alpha * (1 / mu - 1)

    return {"alpha": 0.5, "beta": 0.1}


print(getAlphaBeta(0.5, 0.1)  # {alpha: 12, beta: 12}

Você pode verificar os parâmetros e importando o pacote.αβscipy.stats.beta

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.