Ich versuche, lme4::glmer()
ein binomiales verallgemeinertes gemischtes Modell (GLMM) mit abhängiger Variable anzupassen, die nicht binär ist, sondern eine kontinuierliche Variable zwischen Null und Eins. Man kann sich diese Variable als Wahrscheinlichkeit vorstellen; Tatsächlich ist es die Wahrscheinlichkeit, die von menschlichen Probanden angegeben wurde (in einem Experiment, das ich bei der Analyse unterstütze). Dh es ist kein "diskreter" Bruch, sondern eine stetige Variable.
Mein glmer()
Anruf funktioniert nicht wie erwartet (siehe unten). Warum? Was kann ich tun?
Später bearbeiten: Meine Antwort unten ist allgemeiner als die Originalversion dieser Frage, daher habe ich die Frage geändert, um sie auch allgemeiner zu gestalten.
Mehr Details
Anscheinend ist es möglich, die logistische Regression nicht nur für binäres DV, sondern auch für kontinuierliches DV zwischen null und eins zu verwenden. In der Tat, wenn ich renne
glm(reportedProbability ~ a + b + c, myData, family="binomial")
Ich bekomme eine Warnmeldung
Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!
aber eine sehr vernünftige Übereinstimmung (alle Faktoren sind kategorisch, so dass ich leicht überprüfen kann, ob die Modellvorhersagen nahe am subjektübergreifenden Mittelwert liegen und ob sie es sind).
Was ich aber eigentlich nutzen möchte ist
glmer(reportedProbability ~ a + b + c + (1 | subject), myData, family="binomial")
Es gibt mir die identische Warnung, gibt ein Modell zurück, aber dieses Modell ist eindeutig sehr abweichend. die schätzungen der fixen effekte sind sehr weit von glm()
jenen und den themenübergreifenden mitteln entfernt. (Und ich muss glmerControl(optimizer="bobyqa")
in den glmer
Aufruf einbeziehen, sonst konvergiert er überhaupt nicht.)
glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta")
, erhalte ich eine korrekte Anpassung und angemessene Konfidenzintervalle, aber eine Konvergenz- Warnung ist fehlgeschlagen : Beta könnte für mich funktionieren, da ich keine Fälle mit DV = 0 oder DV = 1 habe.+ (1 | rowid)
, meinen glmer-Aufruf zu ergänzen, und dies ergibt stabile Schätzungen und stabile Konfidenzintervalle, unabhängig von meiner Gewichtswahl (ich habe 100 und 500 versucht). Ich habe auch versucht, lmer auf logit auszuführen (gemeldete Wahrscheinlichkeit) und ich bekomme fast genau das Gleiche. Beide Lösungen scheinen also gut zu funktionieren! Beta MM mit glmmadmb liefert ebenfalls sehr nahe beieinander liegende Ergebnisse, die jedoch aus irgendeinem Grund nicht vollständig konvergieren und ewig dauern. Stellen Sie eine Antwort auf diese Optionen und erläutern Sie ein wenig die Unterschiede und Vor- und Nachteile! (Vertrauensintervalle, die ich erwähne, sind alle Wald.)Antworten:
Es ist sinnvoll, mit einem einfacheren Fall ohne zufällige Effekte zu beginnen.
Es gibt vier Möglichkeiten, um mit einer kontinuierlichen Null-zu-Eins-Antwortvariablen umzugehen, die sich wie ein Bruchteil oder eine Wahrscheinlichkeit verhält ( dies ist unser kanonischster, am besten bewerteter und angesehener Thread zu diesem Thema, aber leider werden dort nicht alle vier Optionen behandelt):
n
Logit transformiert die Antwort und verwendet die lineare Regression. Dies wird normalerweise nicht empfohlen.
Passen Sie ein Binomialmodell an, aber berechnen Sie dann die Standardfehler unter Berücksichtigung der Überdispersion. Die Standardfehler können auf verschiedene Arten berechnet werden:
(a) skalierte Standardfehler über die Überdispersionsschätzung ( eins , zwei ). Dies wird als "Quasi-Binomial" -GLM bezeichnet.
(b) robuste Standardfehler über den Sandwich-Schätzer ( eins , zwei , drei , vier ). Dies wird in der Ökonometrie als "Fractional Logit" bezeichnet.
Die Buchstaben (a) und (b) sind nicht identisch (siehe diesen Kommentar und die Abschnitte 3.4.1 und 3.4.2 in diesem Buch sowie diesen SO-Beitrag und auch diesen und diesen ), führen jedoch tendenziell zu ähnlichen Ergebnissen. Option (a) wird
glm
wie folgt umgesetzt:Die gleichen vier Möglichkeiten stehen mit zufälligen Effekten zur Verfügung.
Mit
weights
Argument ( eins , zwei ):Gemäß dem zweiten obigen Link ist es möglicherweise eine gute Idee, eine Überdispersion zu modellieren (siehe dort und auch # 4 unten).
Betamischmodell verwenden:
oder
Wenn die Antwortdaten exakte Nullen oder Einsen enthalten, kann man das auf Null / Eins aufgeblasene Betamodell in verwenden
glmmTMB
.Verwenden der logit-Transformation der Antwort:
Berücksichtigung der Überdispersion im Binomialmodell. Dies verwendet einen anderen Trick: Hinzufügen eines zufälligen Effekts für jeden Datenpunkt:
Aus irgendeinem Grund funktioniert dies nicht richtig, da sich
glmer()
Beschwerden über nicht ganzzahlige Wertep
und Unsinnschätzungen ergeben. Eine Lösung, die ich mir ausgedacht habe, ist, eine gefälschte Konstante zu verwendenweights=k
und sicherzustellen, dass diesep*k
immer eine Ganzzahl ist. Dies erfordert eine Rundung,p
aber wenn Siek
eine ausreichend große Auswahl treffen , sollte dies keine große Rolle spielen. Die Ergebnisse scheinen nicht vom Wert von abzuhängenk
.Späteres Update (Januar 2018): Dies ist möglicherweise ein ungültiger Ansatz. Siehe Diskussion hier . Ich muss das genauer untersuchen.
In meinem speziellen Fall ist Option 1 nicht verfügbar.
Option 2 ist sehr langsam und hat Probleme mit der Konvergenz: DieUpdate: Ich habe versucht,glmmadmb
Ausführung dauert fünf bis zehn Minuten (und beklagt sich immer noch, dass sie nicht konvergiert ist!), Während sielmer
inglmer
Sekundenbruchteilen funktioniert und einige Sekunden dauert.glmmTMB
wie in den Kommentaren von @BenBolker vorgeschlagen, und es funktioniert fast so schnell wieglmer
ohne Konvergenzprobleme. Das ist es also, was ich verwenden werde.Die Optionen 3 und 4 liefern sehr ähnliche Schätzungen und sehr ähnliche Wald-Konfidenzintervalle (erhalten mit
confint
). Ich bin allerdings kein großer Fan von # 3, weil es eine Art Betrug ist. Und # 4 fühlt sich etwas abgefahren an.Vielen Dank an @Aaron, der mich in seinem Kommentar auf # 3 und # 4 hingewiesen hat.
quelle
devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB")
, VerwendungglmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))
sollte funktionieren ...glmmTMB
ist schneller und stabiler alsglmmADMB
und unter (leicht) aktiverer Entwicklung, wenn auch nicht so ausgereift.