Wie gehe ich mit einer quasi vollständigen Trennung in einem logistischen GLMM um?

8

Update : Da ich jetzt weiß, dass mein Problem als quasi vollständige Trennung bezeichnet wird, habe ich die Frage aktualisiert, um dies widerzuspiegeln (danke an Aaron).


Ich habe einen Datensatz aus einem Experiment, bei dem 29 menschliche Teilnehmer (Faktor code) an einer Reihe von Versuchen gearbeitet haben und der responseentweder 1 oder 0 war. Außerdem haben wir die Materialien so manipuliert, dass wir drei gekreuzte Faktoren hatten p.validity(gültig gegen ungültig). type(Bestätigung versus Verleugnung) und counterexamples(wenige gegen viele):

d.binom <- read.table("http://pastebin.com/raw.php?i=0yDpEri8")
str(d.binom)
## 'data.frame':   464 obs. of  5 variables:
##      $ code           : Factor w/ 29 levels "A04C","A14G",..: 1 1 1 1 1 1 1 1 1 1 ...
##      $ response       : int  1 1 1 1 0 1 1 1 1 1 ...
##      $ counterexamples: Factor w/ 2 levels "few","many": 2 2 1 1 2 2 2 2 1 1 ...
##      $ type           : Factor w/ 2 levels "affirmation",..: 1 2 1 2 1 2 1 2 1 2 ...
##      $ p.validity     : Factor w/ 2 levels "invalid","valid": 1 1 2 2 1 1 2 2 1 1 ...

Insgesamt gibt es nur eine kleine Anzahl von Nullen:

mean(d.binom$response)
## [1] 0.9504

Eine Hypothese ist, dass es einen Effekt von gibt validity, jedoch deutet eine vorläufige Analyse darauf hin, dass es einen Effekt von geben könnte counterexamples. Da ich abhängige Daten habe (jeder Teilnehmer hat an allen Studien gearbeitet), möchte ich ein GLMM für die Daten verwenden. Leider counterexamplestrennen Sie die Daten quasi vollständig (zumindest für eine Ebene):

with(d.binom, table(response, counterexamples))
##         counterexamples
## response few many
##        0   1   22
##        1 231  210

Dies spiegelt sich auch im Modell wider:

require(lme4)
options(contrasts=c('contr.sum', 'contr.poly'))


m2 <- glmer(response ~ type * p.validity * counterexamples + (1|code), 
            data = d.binom, family = binomial)
summary(m2)
## [output truncated]
## Fixed effects:
##                                      Estimate Std. Error z value Pr(>|z|)
##   (Intercept)                            9.42     831.02    0.01     0.99
##   type1                                 -1.97     831.02    0.00     1.00
##   p.validity1                            1.78     831.02    0.00     1.00
##   counterexamples1                       7.02     831.02    0.01     0.99
##   type1:p.validity1                      1.97     831.02    0.00     1.00
##   type1:counterexamples1                -2.16     831.02    0.00     1.00
##   p.validity1:counterexamples1           2.35     831.02    0.00     1.00
##   type1:p.validity1:counterexamples1     2.16     831.02    0.00     1.00

Die Standardfehler für die Parameter sind einfach verrückt. Da mein letztes Ziel darin besteht, zu beurteilen, ob bestimmte Effekte signifikant sind oder nicht, sind Standardfehler nicht völlig unwichtig.

  • Wie kann ich mit der quasi vollständigen Trennung umgehen? Ich möchte Schätzungen erhalten, anhand derer ich beurteilen kann, ob ein bestimmter Effekt signifikant ist oder nicht (z. B. Verwendung PRmodcompaus dem Paket pkrtest, aber dies ist ein weiterer Schritt, der hier nicht beschrieben wird).

Ansätze mit anderen Paketen sind ebenfalls in Ordnung.

Henrik
quelle
2
Versuchen Sie Folgendes
Aaron hat den
@ Aaron Sieht gut aus. Dies in eine Antwort zu setzen, hätte Ihnen zumindest eine Gegenstimme gebracht ...
Henrik
Nicht wirklich eine Antwort, aber danke!
Aaron verließ Stack Overflow
@ Henrik Du kannst auch Kommentare positiv bewerten.
Peter Flom
Siehe dieses Papier von Paul Allison. Obwohl er SAS betont, gelten dieselben Punkte auch für andere Sprachen.
Peter Flom

Antworten:

8

Ich fürchte, Ihr Titel enthält einen Tippfehler: Sie sollten nicht versuchen, gemischte Modelle, geschweige denn nichtlineare gemischte Modelle, mit nur 30 Clustern anzupassen. Nur wenn Sie glauben, dass Sie eine Normalverteilung an 30 Punkte anpassen können, die durch Messfehler, Nichtlinearitäten und nahezu vollständige Trennung (auch als perfekte Vorhersage bezeichnet) behindert werden.

Was ich hier tun würde, ist, dies als regelmäßige logistische Regression mit Firths Korrektur auszuführen :

library(logistf)
mf <- logistf(response ~ type * p.validity * counterexamples + as.factor(code),
      data=d.binom)

Die Korrektur von Firth besteht darin, die Wahrscheinlichkeit zu erhöhen und ist eine Form der Schrumpfung. In Bayes'schen Begriffen sind die resultierenden Schätzungen die hinteren Modi des Modells mit einem Jeffreys-Prior. In häufigem Sinne ist die Strafe die Determinante der Informationsmatrix, die einer einzelnen Beobachtung entspricht, und verschwindet daher asymptotisch.

StasK
quelle
4
Eigentlich glaube ich daran , gemischte Modelle mit weniger als 30 Clustern anzupassen. Die Analyse scheint jedoch vielversprechend (+1). Oder gibt es Firths Methode für GLMMs?
Henrik
2
Richtig, Sie sind der Enthusiast der minimalen Anforderungen an die Stichprobengröße ... Die Korrektur von Firth funktioniert nur mit ID-Daten. Sie können an alles glauben, aber es ist besser, einige Simulationen durchzuführen, um festzustellen, ob eine bestimmte Überzeugung in einer bestimmten Datensituation gerechtfertigt ist. Mit einem perfekt ausbalancierten Datensatz und kontinuierlicher Antwort kann es OK funktionieren. Bei einem stark unausgeglichenen Datensatz sehen Sie in Bezug auf die Reaktion nur einen ganz linken Schwanz der Normalverteilung der zufälligen Effekte, und Sie sind bereit, darauf zu wetten, dass dieser Schwanz durch Ein-Punkt-Laplace in *lmer??? gut angenähert wird. : - \
StasK
5

Sie können einen Bayes'schen Maximum- a-posteriori- Ansatz mit einem schwachen Prior vor den festen Effekten verwenden, um ungefähr den gleichen Effekt zu erzielen. Insbesondere das blme-Paket für R (das ein dünner Wrapper um das lme4Paket ist) tut dies, wenn Sie Prioritäten für die festen Effekte wie im Beispiel hier angeben (Suche nach "vollständige Trennung"):

cmod_blme_L2 <- bglmer(predation~ttt+(1|block),data=newdat,
                       family=binomial,
                       fixef.prior = normal(cov = diag(9,4)))

tttβΣ=9IN(μ=0,σ2=9)σ=3

Das verknüpfte Beispiel zeigt, dass Sie es auch mit dem MCMCglmmPaket tun können , wenn Sie vollbayesisch werden möchten ...

Ben Bolker
quelle