Obliczanie parametrów rozkładu Beta przy użyciu średniej i wariancji

66

Jak obliczyć parametry i dla rozkładu Beta, jeśli znam średnią i wariancję, którą chcę mieć dla tego rozkładu? Najbardziej pomocne byłyby przykłady polecenia R do wykonania tej czynności.αβ

Dave Kincaid
źródło
4
Zauważ, że pakiet betareg w R używa alternatywnej parametryzacji (ze średnią, , i precyzją, a zatem wariancja wynosi ), co eliminuje potrzebę tych obliczeń. μ=α/α+βϕ=α+βμ(1μ)/(1+ϕ)
gung - Przywróć Monikę

Odpowiedzi:

90

Ustawiam i i rozwiązany dla i . Moje wyniki pokazują, że i σ2=αβ

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

Napisałem trochę kodu R, aby oszacować parametry rozkładu Beta na podstawie podanej średniej, mu i wariancji, 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))
}

Wystąpiło pewne zamieszanie wokół granic i dla dowolnej dystrybucji Beta, więc wyjaśnijmy to tutaj.σ 2μσ2

  1. μ=αα+β(0,1)
  2. σ2=αβ(α+β)2(α+β+1)=μ(1μ)α+β+1<μ(1μ)1=μ(1μ)(0,0.52)
przyjęty jako normalny
źródło
2
@stan To da ci rozkład Beta, który ma taką samą średnią i wariancję jak twoje dane. Nie powie ci, jak dobrze dystrybucja pasuje do danych. Wypróbuj test Kołmogorowa-Smirnowa .
zakładano, że jest nietypowy
4
Kiedy wywołać tę funkcję z estBetaParams(0.06657, 0.1)mam alpha=-0.025, beta=-0.35. Jak to jest możliwe?
Amelio Vazquez-Reina
1
Obliczenia te działają tylko wtedy, gdy wariancja jest mniejsza niż średnia * (1 średnia).
danno
2
@danno - Zawsze tak jest, że . Aby to zobaczyć, przepisz wariancję jako . Ponieważ , . σ2μ(1μ)σ2=μ(1μ)α+β+1α+β+11σ2μ(1μ)
zakładano, że normalny
1
@ AmelioVazquez-Reina Jeśli podasz swoje oryginalne dane, spodziewam się, że szybko stanie się oczywiste, dlaczego dystrybucja beta nie jest odpowiednia.
Glen_b
21

Oto ogólny sposób rozwiązywania tego rodzaju problemów za pomocą Klonu zamiast R. Działa to również w przypadku innych dystrybucji:

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

co prowadzi do rozwiązania

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

Jest to odpowiednik rozwiązania Maxa.

Erik P.
źródło
5

W R rozkład beta z parametrami oraz ma gęstośćshape1=ashape2=b

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

dla , i .a>0b>00<x<1

W R możesz to obliczyć według

dbeta (x, shape1 = a, shape2 = b)

W tej parametryzacji średnia to a wariancja to . Możesz teraz śledzić odpowiedź Nicka Sabbe.E(X)=aa+bV(X)=ab(a+b)2(a+b+1)

Dobra robota!

Edytować

Znajduję:

a=(1μV1μ)μ2 ,

i

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

gdzie i .μ=E(X)V=V(X)

ocram
źródło
Zdaję sobie sprawę, że moja odpowiedź jest bardzo podobna do pozostałych. Niemniej jednak uważam, że zawsze warto najpierw sprawdzić, jakiej parametryzacji używa R ....
ocram
2

Na przykład w Wikipedii można znaleźć następujące formuły dla średniej i wariancji rozkładu beta, biorąc pod uwagę alfa i beta: i Odwracanie ich (wypełnij w dolnym równaniu) powinno dać pożądany rezultat (choć może to zająć trochę pracy).

μ=αα+β
σ2=αβ(α+β)2(α+β+1)
β=α(1μ1)
Nick Sabbe
źródło
1
Wikipedia ma sekcję dotyczącą szacowania parametrów, która pozwala uniknąć zbyt dużej pracy :)
rm999
1

W przypadku uogólnionego rozkładu Beta zdefiniowanego w przedziale istnieją relacje:[a,b]

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

które można odwrócić, aby uzyskać:

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

gdzie

λ=(μa)(bμ)σ21
becko
źródło
Użytkownik próbował zostawić następujący komentarz: „gdzieś tutaj jest błąd. Bieżąca formuła nie zwraca prawidłowej wariancji”.
Silverfish
1

Rozwiąż równanie dla lub , rozwiązując dla , otrzymujesz Następnie podłącz to do drugiego równania i rozwiąż . Otrzymujesz więc Upraszcza to Następnie zakończ rozwiązywanie dla .μαββ

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

Pijane pochodzenie
źródło
0

Szukałem pytona, ale natknąłem się na to. Byłoby to przydatne dla innych osób takich jak ja.

Oto kod python do oszacowania parametrów beta (zgodnie z równaniami podanymi powyżej):

# 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}

Możesz zweryfikować parametry i , importując pakiet.αβscipy.stats.beta

mityczny koder
źródło