WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Mischverteilung: Parameterberechnung mit MLE

 

JacksoN123
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 07.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2015, 16:04     Titel: Mischverteilung: Parameterberechnung mit MLE
  Antworten mit Zitat      
Hallo.

Ich habe eine Zeitreihe von Daten (Renditen). Ich weiß, dass diese Daten aus einer Mischverteilung stammen, die aus zwei Normalverteilungen zusammengesetzt ist. Nun möchte ich die Parameter errechnen, für die die Maximumlikelihood Funktion am größten wird.
Hierzu definiere ich mir meine Dichtefunktion:
Code:
MV=@(x,mu1,sigma1,mu2,sigma2,p) normpdf(x,mu1,sigma1)*p+normpdf(x,mu2,sigma2)*(1-p)
 

Da x die Daten sind, habe ich also 5 unbekannte Parameter, die ich mit Hilfe der MLE Funktion ermitteln möchte.
Hierfür verwende ich:
Code:
phat=mle(x,'pdf',MV,'start',start)

Jedoch gibt Matlab Fehlermeldungen aus:
Zitat:
??? Error using ==> mlecustom at 169
Error while evaluating the user-supplied pdf function
'@(x,mu1,sigma1,mu2,sigma2,p)normpdf(x,mu1,sigma1)*p+normpdf(x,mu2,sigma2)*(1-p)'.

Error in ==> mle at 225
phat = mlecustom(data,varargin{:});

Caused by:
Input argument "p" is undefined.

Ich glaube ich habe die Syntax der MLE Funktion nicht ganz verstanden. Ich hoffe ihr könnt mir helfen.

Ich danke im Voraus
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.01.2015, 16:39     Titel:
  Antworten mit Zitat      
Hallo,

was ist der Wert der Variable start bei dir?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JacksoN123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 07.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2015, 17:34     Titel:
  Antworten mit Zitat      
Code:
start=[mean(x) std(x)]


Da schließt sich direkt die nächste Frage an. Oben genannte Formel ist für eine einfache Normalverteilung mit zwei Parametern.
Kann ich denn die Startwerte für alle fünf Parameter festlegen und falls ja, wie?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.01.2015, 20:37     Titel:
  Antworten mit Zitat      
Hallo,

dann wundert mich das nicht. Wenn du 5 Parameter hast, musst du schon auch 5 Startwerte angeben.
Eine Möglichkeit: du nimmst Mittelwert und Standardabweichung von jeweils der linken und der rechten Hälfte der Daten, und p = 0.5.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JacksoN123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 07.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2015, 20:53     Titel:
  Antworten mit Zitat      
Ich habe jetzt fünf Startwerte wie folgt angegeben:

Code:
start=[2.4777e-004 0.0242 2.5e-004 0.24 0.5]


und dann wieder
Code:
phat=mle(x,'pdf',MV,'start',start)


Jetzt wirft andere Fehlermeldungen aus:

Zitat:
??? Error using ==> mlecustom>llf_pdfcdf at 443
The PDF function returned negative or zero values.

Error in ==> fminsearch at 320
x(:) = xr; fxr = funfcn(x,varargin{:});

Error in ==> mlecustom at 186
[phat,nll,err,output] = ...

Error in ==> mle at 225
phat = mlecustom(data,varargin{:});
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.01.2015, 21:14     Titel:
  Antworten mit Zitat      
Hallo,

mal den Debugger verwenden?
Für weitere Unterstützung bitte Beispieldaten zur Verfügung stellen, bei denen das Problem auftritt.

Bei deinen Startwerten sieht es so aus, als ob die beiden Normalverteilungen sehr nahezu deckungsgleich sind. Das ist sicher nicht optimal.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JacksoN123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 07.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.01.2015, 23:06     Titel:
  Antworten mit Zitat      
Die Startwerte habe ich jetzt einfach so angenommen. Die Werte habe ich in einer Excel Tablle hinterlegt, da ich hier kein m file hochladen kann.
Den Debugger habe ich noch nicht probiert, da ich nicht weiß wie ich damit umegehen soll.

x.xls
 Beschreibung:

Download
 Dateiname:  x.xls
 Dateigröße:  169 KB
 Heruntergeladen:  583 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.01.2015, 23:45     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Die Startwerte habe ich jetzt einfach so angenommen.

Das ist selten eine gute Idee.
Versuch's doch mal mit den vorgeschlagenen Startwerten.
Code:
leftx = x(x < median(x));
rightx = x(x > median(x));
start=[mean(leftx) std(leftx) mean(rightx) std(rightx) 0.5]


Davon abgesehen stellt sich mir bei den Daten die Frage, was das bringen soll. Wenn ich mir ein Histogramm ansehe, kann ich jedenfalls keine zwei verschiedenen Peaks unterscheiden.

Was das Debuggen angeht, siehe z.B. hier:
[url]de.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html[/url]

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JacksoN123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 07.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2015, 10:45     Titel:
  Antworten mit Zitat      
Ich dank dir schonmal für deine Hilfe. Jetzt können tatsächlich Werte errechnet werden.

Mit den Peaks hast du recht, jedoch nehme ich eine Mischverteilung an, da eine einzelne Normalverteilung einen zu schlechten Fit liefert.

Was mich zudem interessiert, ist der Wert der ML. Da Matlab ihn nicht direkt ausgibt, geh ich davon aus, dass man ihn manuell berechnen muss. Bisher mach ich das so:
Code:
n=length(x);
maxLH=0;
for ind=1:n;
    max=MV(x(ind,:),0.000501540473094752,0.0146155935613219,-0.00206896857921734,0.0630371648611383,0.901424547006823);
    maxLH=max+maxLH;
end
maxLH %Ausgabe


Wie man erkennt, habe ich die Werte von phat, also meine MLE-Schätzung per Hand eingegeben. Ist es möglich diese automatisiert in die Dichtefunktion MV einzulesen ohne Schleifen zu verwenden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.01.2015, 11:26     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
jedoch nehme ich eine Mischverteilung an, da eine einzelne Normalverteilung einen zu schlechten Fit liefert

Halte ich für keine gute Idee, da das m.E. nur eine kosmetische Verbesserung durch eine größere Anzahl Parameter ist. Ich würde andere Verteilungen versuchen oder eine nichtparametrische Verteilung.

Zitat:
Ist es möglich diese automatisiert in die Dichtefunktion MV einzulesen ohne Schleifen zu verwenden?

Code:
maxi=MV(x(ind,:),phat(1), phat(2), phat(3), phat(4), phat(5));

Ich würde wie gezeigt max als Variablenname vermeiden, da dies der Name einer gebräuchlichen Funktion ist.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JacksoN123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 07.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2015, 15:00     Titel:
  Antworten mit Zitat      
Ich hab jetzt die Werte der ML ausgerechnet.

Mischverteilung
Zitat:
phat = 0.0005 0.0146 -0.0021 0.0630 0.9014
Wert der ML-Funktion einer Mischverteilung maxLHMV= 6.6096e+004


und Normalverteilung
Zitat:

phat = 0.0002 0.0242
Wert der ML-Funktion einer Normalverteilung maxLHNV5.1594e+004


Diese habe ich in ein Informationskriterium eingesetzt K ist die Parameteranzahl des Modells:

Code:
AIC=-2.*log(maxLH)+2*K


Mischverteilung (K=5)= -12.1977
Normalverteilung (K=2)= -17.7023

Da kleinere Werte besser sind, sollte man wie du schon sagtest die Normalverteilung wählen. D.h. mein Problem ist gelöst. DANKE

Eine kleine Nebenfrage habe ich jedoch noch. Ich wollte die Mischverteilung als permanente Funktion speichen. Hierzu habe ich im Editor geschreiben:
Code:
% Mischverteilung aus zwei NV
function f=MV(x,mu1,sigma1,mu2,sigma2,p)
f=normpdf(x,mu1,sigma1)*p+normpdf(x,mu2,sigma2)*(1-p);

Wenn ich sie dann starte bekomm ich die Fehlermeldung:
Zitat:
??? Input argument "x" is undefined.

Error in ==> MV at 3
f=normpdf(x,mu1,sigma1)*p+normpdf(x,mu2,sigma2)*(1-p);


Was habe ich übersehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.01.2015, 15:39     Titel:
  Antworten mit Zitat      
Hallo,

du musst die Funktion mit Eingabeargumenten aufrufen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JacksoN123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 07.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2015, 09:49     Titel:
  Antworten mit Zitat      
Ich dachte die Funktion bekommt ihre Werte, da ich ja die Datei "x.mat" im Workspace habe.

Oder ist das "x" in meiner Funktion ein anderes als das der Daten x?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.01.2015, 09:56     Titel:
  Antworten mit Zitat      
Hallo,

es hilft nichts, dass eine .mat-Datei oder eine Variable existiert. Sie muss schon wirklich übergeben werden.

Der Aufruf kann also so lauten
Code:
f=MV(x,mu1,sigma1,mu2,sigma2,p) % x, ..., p müssen im Workspace definiert sein
aber z.B. auch so
Code:
f=MV(x,1,0.1,2,0.2,0.5) % x muss im Workspace definiert sein
oder
Code:
f=MV(x, mittel1, abw1, mittel2, abw2, wahrsch) % mittel1, ..., wahrsch müssen im Workspace definiert sein


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
JacksoN123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 07.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.01.2015, 11:30     Titel:
  Antworten mit Zitat      
Irgendwie steh ich auf dem Schlauch. Vielleicht versuch ich es nochmal anders zu erklären.

Zeil ist es, die MLE Schätzung für meine Dichtefunktion durchzuführen. Da die Dichtefunktion nicht standardmäßig in Matlab integriert ist, definiere ich sie mir. Da ich diese Dichtefunktion immer wieder benötige, wäre es sinnvoll, wenn ich diese speichern und aufrufen könnte.

Code:
MV=@(x,mu1,sigma1,mu2,sigma2,p) normpdf(x,mu1,sigma1)*p+normpdf(x,mu2,sigma2)*(1-p)

Wenn ich diesen Weg gehe, dann muss ich diese Zeile jedesmal eintippen wenn ich Matlab neu starte.

Daher dachte ich, ich schreibe eine m.Datei die genau das oben macht:
Code:
function f=MV(x,mu1,sigma1,mu2,sigma2,p)
f=normpdf(x,mu1,sigma1)*p+normpdf(x,mu2,sigma2)*(1-p);


Aber offensichtlich ist das nicht so. Denn wenn ich
Code:
phat=mle(x,'pdf',MV,'start',start)
eingebe, kommt
Zitat:
??? Input argument "x" is undefined.
.

Meine Frage nun, wie kann ich MV=@(...) abspeichern, so dass ich das nicht jedes mal eingeben muss wenn ich Matlab neu starte.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.