3 Stimmen

MATLAB | Berechnung von Gamma-Dist-Parametern auf Basis von Mittelwert und Wahrscheinlichkeitsintervall

Ich habe ein System von 2 Gleichungen mit 2 Unbekannten, das ich mit MATLAB lösen möchte, weiß aber nicht genau, wie ich programmieren soll. Ich habe einige Informationen über eine Gamma-Verteilung erhalten (Mittelwert von 1,86, 90%-Intervall zwischen 1,61 und 2,11) und möchte letztlich den Mittelwert und die Varianz ermitteln. Ich weiß, dass ich die Normalapproximation verwenden könnte, aber ich möchte lieber A und B, die Form- und Skalierungsparameter der Gamma-Verteilung, bestimmen und auf diese Weise den Mittelwert und die Varianz ermitteln. In Pseudo-MATLAB-Code würde ich dies lösen wollen:

gamcdf(2.11, A, B) - gamcdf(1.61, A, B) = 0.90;
A*B = 1.86;

Wie würden Sie vorgehen, um dieses Problem zu lösen? Ich habe die symbolische Mathe-Toolbox, falls das hilft.

5voto

Der Mittelwert ist A*B. Kannst du also vielleicht A durch den Mittelwert (mu) und B lösen?

A = mu/B

Das nützt natürlich nichts, wenn man B nicht kennt. Oder doch?

Sehen Sie sich Ihren ersten Ausdruck an. Kannst du ihn ersetzen?

gamcdf(2.11, mu/B, B) - gamcdf(1.61, mu/B, B) = 0.90

Bringt Sie das weiter? Vielleicht. Es wird keine brauchbare symbolische Lösung geben, außer in Bezug auf die unvollständige Gammafunktion selbst. Wie löst man in Matlab eine einzelne Gleichung numerisch mit einer Unbekannten? Verwenden Sie fzero.

Natürlich sucht fzero nach einem Nullwert. Aber durch Subtraktion von 0,90 wird das Problem gelöst.

Können wir eine Funktion definieren, die fzero verwenden kann? Verwenden Sie ein Funktionshandle.

>> mu = 1.86;
>> gamfun = @(B) gamcdf(2.11, mu/B, B) - gamcdf(1.61, mu/B, B) - 0.90;

Also probieren Sie es aus. Bevor wir das tun, empfehle ich immer, die Dinge zu planen.

>> ezplot(gamfun)

Hm. Diese Darstellung legt nahe, dass es schwierig sein könnte, eine Nullstelle für Ihre Funktion zu finden. Wenn Sie es dennoch versuchen, werden Sie feststellen, dass gute Startwerte für fzero erforderlich sind.

Entschuldigung für meinen ersten Versuch. Bessere Startwerte für fzero und eine weitere Aufzeichnung ergeben eine Gamma-Verteilung, die die gewünschte Form ergibt.

>> B = fzero(gamfun,[.0000001,.1])
B =
        0.0124760672290871
>> A = mu/B
A =
          149.085442218805
>> ezplot(@(x) gampdf(x,A,B))

Tatsächlich handelt es sich um eine sehr "normale", d. h. gaußförmige Kurve.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X