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.βαβ

Dave Kincaid
fonte
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)
assumido normal
fonte
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.

Erik P.
fonte
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)

ocram
fonte
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)
Nick Sabbe
fonte
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
becko
fonte
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α+μ
α

Deriving bêbado
fonte
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

mythicalcoder
fonte