Einfache binäre logistische Regression mit MATLAB

8

Ich arbeite an einer logistischen Regression mit MATLAB für ein einfaches Klassifikationsproblem. Meine Kovariate ist eine kontinuierliche Variable zwischen 0 und 1, während meine kategorische Antwort eine binäre Variable von 0 (falsch) oder 1 (korrekt) ist.

Ich suche nach einer logistischen Regression, um einen Prädiktor zu erstellen, der die Wahrscheinlichkeit für eine Eingangsbeobachtung (z. B. die kontinuierliche Variable wie oben beschrieben) ausgibt, die korrekt oder falsch ist. Obwohl dies ein ziemlich einfaches Szenario ist, habe ich einige Probleme damit, dies in MATLAB auszuführen.

Mein Ansatz ist wie folgt: Ich habe einen Spaltenvektor X , der die Werte der kontinuierlichen Variablen enthält, und einen weiteren gleich großen Spaltenvektor Y , der die bekannte Klassifizierung jedes Wertes von X enthält (z 0 oder 1). Ich verwende den folgenden Code:

[b,dev,stats] = glmfit(X,Y,'binomial','link','logit');

Dies gibt mir jedoch unsinnige Ergebnisse mit einem p = 1.000 , Koeffizienten ( b ), die extrem hoch sind (-650.5, 1320.1) und zugehörige Standardfehlerwerte in der Größenordnung von 1e6.

Ich habe dann versucht, einen zusätzlichen Parameter zu verwenden, um die Größe meines binomischen Samples anzugeben:

glm = GeneralizedLinearModel.fit(X,Y,'distr','binomial','BinomialSize',size(Y,1));

Das gab mir Ergebnisse, die mehr mit meinen Erwartungen übereinstimmten. Ich habe die Koeffizienten extrahiert, glmval verwendet, um Schätzungen zu erstellen ( Y_fit = glmval(b,[0:0.01:1],'logit'); ), und ein Array für die Anpassung erstellt ( X_fit = linspace(0,1) ). Wenn ich die Plots der Originaldaten und des Modells mit figure, plot(X,Y,'o',X_fit,Y_fit'-') überlagert habe, sah das resultierende Diagramm des Modells im Wesentlichen wie das untere 1/4 des "S" -förmigen Plots aus, das für logistische Regressionsplots typisch ist.

Meine Fragen sind wie folgt:

1) Warum hat meine Verwendung von glmfit seltsame Ergebnisse ergeben?
2) Wie soll ich meine erste Frage angehen: Bei gegebenem Eingabewert, wie hoch ist die Wahrscheinlichkeit, dass die Klassifizierung korrekt ist? 3) Wie erhalte ich Konfidenzintervalle für meine Modellparameter? glmval sollte die stats Ausgabe von glmfit eingeben können, aber meine Verwendung von glmfit liefert keine korrekten Ergebnisse.

Alle Kommentare und Eingaben wären sehr nützlich, danke!

UPDATE (3/18/14)

Ich fand, dass mnrval vernünftige Ergebnisse zu liefern scheint. Ich kann [b_fit,dev,stats] = mnrfit(X,Y+1); verwenden, wobei Y+1 meinen binären Klassifizierer einfach zu einem nominalen macht.

Ich kann [pihat,lower,upper] = mnrval(b_fit,loopVal(ii),stats); durchlaufen, um verschiedene pihat Wahrscheinlichkeitswerte zu erhalten, wobei loopVal = linspace(0,1) oder ein geeigneter Eingabebereich und 'ii = 1: length (loopVal)' ist.

Der Parameter stats hat einen großen Korrelationskoeffizienten (0,9973), aber die p-Werte für b_fit sind 0,0847 und 0,0845, was ich nicht genau weiß, wie zu interpretieren ist. Irgendwelche Gedanken? Warum würde mrnfit in meinem Beispiel über glmfit arbeiten? Ich sollte beachten, dass die p-Werte für die Koeffizienten bei Verwendung von GeneralizedLinearModel.fit beide p<<0.001 waren, und die Koeffizientenschätzungen waren auch ziemlich unterschiedlich.

Wie interpretiert man schließlich die dev Ausgabe von der mnrfit Funktion? Das MATLAB-Dokument stellt fest, dass es "die Abweichung der Anpassung an den Lösungsvektor ist. Die Abweichung ist eine Verallgemeinerung der Restsumme der Quadrate." Ist dies nützlich als eigenständiger Wert oder wird dieser Wert nur mit dev -Werten anderer Modelle verglichen?

    
chex 19.03.2014, 00:15
quelle

1 Antwort

3

Es klingt, als könnten Ihre Daten linear separierbar sein. Kurz, das bedeutet, da Ihre Eingabedaten eindimensional sind, dass es einen Wert von x gibt, so dass alle Werte von x < xDiv zu einer Klasse gehören (sagen wir y = 0 ) und alle Werte von x > xDiv gehören zu andere Klasse ( y = 1 ).

Wenn Ihre Daten zweidimensional sind, bedeutet das, dass Sie eine Linie durch Ihr zweidimensionales Leerzeichen X ziehen können, so dass sich alle Instanzen einer bestimmten Klasse auf einer Seite der Linie befinden.

Das sind schlechte Nachrichten für die logistische Regression (LR), da LR nicht wirklich dazu gedacht ist, Probleme zu lösen, bei denen die Daten linear trennbar sind.

Logistische Regression versucht, eine Funktion der folgenden Form anzupassen:

Dies liefert nur Werte von y = 0 oder y = 1 , wenn der Ausdruck innerhalb der Exponentialfunktion im Nenner negativ unendlich oder unendlich ist.

Nun, da Ihre Daten linear trennbar sind und die Matlab-LR-Funktion versucht, eine maximale Wahrscheinlichkeit für die Daten zu finden, erhalten Sie extreme Gewichtswerte.

Dies ist nicht unbedingt eine Lösung, aber versuchen Sie, die Beschriftungen nur auf einen Ihrer Datenpunkte zu spiegeln (für einen Index t also y(t) == 0 set y(t) = 1 ). Dies führt dazu, dass Ihre Daten nicht mehr linear trennbar sind und die gelernten Gewichtswerte dramatisch näher an Null gezogen werden.

    
Ryan J. Smith 23.03.2014 17:46
quelle