Codierung einer Interaktion zwischen einem nominalen und einem kontinuierlichen Prädiktor für die logistische Regression in MATLAB

8

Unsere Daten sind also wie folgt strukturiert:

Wir haben Teilnehmer, jeder Teilnehmer kann in 3 Gruppen eingeteilt werden ( G ), und für jeden Teilnehmer haben wir Stichproben einer kontinuierlichen Variablen. Und wir versuchen, Werte vorherzusagen, die entweder 0 oder 1 sind.A , B , C.M A,B,CN

Wie würden wir matlab verwenden, um eine Interaktion zwischen der kontinuierlichen Variablen und der kategorialen Variablen bei der Vorhersage dieser Werte zu testen?

mpacer
quelle
@Thislstheld Welchen Code verwenden Sie zum Anpassen Ihrer logistischen Regression?
Chl
@chl - Entweder glmfit mit einem 'Link', 'logit' oder mnrfit würde funktionieren, ohne besondere Präferenz für beides.
mpacer
Ich denke nicht, dass dies eine statistische Frage ist, sondern eine Programmierfrage, die bei StackOverflow besser platziert ist ...
Manoel Galdino
@Manoel Wie die Antwort von @chl zeigt, ist diese Frage grundsätzlich statistischer Natur. Wenn Fragen wie diese nicht zum Thema gehören würden, wäre dies etwa die Hälfte der Fragen auf dieser Website!
whuber

Antworten:

9

Der einfachste Weg, IMO, besteht darin, die Entwurfsmatrix selbst zu erstellen, da glmfitentweder eine Matrix aus rohen (beobachteten) Werten oder eine Entwurfsmatrix akzeptiert wird. Das Codieren eines Interaktionsbegriffs ist nicht so schwierig, wenn Sie das vollständige Modell geschrieben haben. Nehmen wir an, wir haben zwei Prädiktoren, (stetig) und (kategorisch, mit drei ungeordneten Ebenen, sagen wir ). Unter Verwendung der Wilkinson-Notation würden wir dieses Modell unter Vernachlässigung der linken Seite schreiben (für ein Binomialergebnis würden wir eine Logit-Link-Funktion verwenden). Wir benötigen nur zwei Dummy-Vektoren, um die Ebenen zu codieren (als vorhanden / nicht vorhanden für eine bestimmte Beobachtung), sodass wir 5 Regressionskoeffizienten plus einen Intercept-Term haben. Dies kann zusammengefasst werden alsxgg=1,2,3y ~ x + g + x:gg

β0+β1x+β2Ig=2+β3Ig=3+β4x×Ig=2+β5x×Ig=3,

Dabei steht für eine Indikatormatrix, die die Ebene von codiert .Ig

In Matlab würde ich anhand des Online-Beispiels Folgendes tun:

x = [2100 2300 2500 2700 2900 3100 3300 3500 3700 3900 4100 4300]';
g = [1 1 1 1 2 2 2 2 3 3 3 3]';
gcat = dummyvar(g);
gcat = gcat(:,2:3); % remove the first column
X = [x gcat x.*gcat(:,1) x.*gcat(:,2)]; 
n = [48 42 31 34 31 21 23 23 21 16 17 21]';
y = [1 2 0 3 8 8 14 17 19 15 17 21]';
[b, dev, stats] = glmfit(X, [y n], 'binomial', 'link', 'probit');

Ich habe keine Spalte mit Einsen für den Achsenabschnitt eingefügt, da diese standardmäßig enthalten ist. Die Designmatrix sieht aus wie

    2100           0           0           0           0
    2300           0           0           0           0
    2500           0           0           0           0
    2700           0           0           0           0
    2900           1           0        2900           0
    3100           1           0        3100           0
    3300           1           0        3300           0
    3500           1           0        3500           0
    3700           0           1           0        3700
    3900           0           1           0        3900
    4100           0           1           0        4100
    4300           0           1           0        4300

und Sie können sehen, dass die Interaktionsterme nur als Produkt von xmit der entsprechenden Spalte von g(g = 2 und g = 3, da wir die erste Ebene nicht benötigen) codiert sind .

Die Ergebnisse sind nachstehend als Koeffizienten, Standardfehler, Statistik und p-Wert (aus der statsStruktur) angegeben:

   int.   -3.8929    2.0251   -1.9223    0.0546
   x       0.0009    0.0008    1.0663    0.2863
   g2     -3.2125    2.7622   -1.1630    0.2448
   g3     -5.7745    7.5542   -0.7644    0.4446
   x:g2    0.0013    0.0010    1.3122    0.1894
   x:g3    0.0021    0.0021    0.9882    0.3230

Das Testen der Interaktion kann nun durchgeführt werden, indem der Unterschied in der Abweichung vom obigen vollständigen Modell und einem reduzierten Modell berechnet wird (wobei der Interaktionsterm weggelassen wird, dh die letzten beiden Spalten der Entwurfsmatrix). Dies kann manuell oder mithilfe der lratiotestFunktion erfolgen, die den Likelihood-Ratio-Hypothesentest bereitstellt. Die Abweichung für das vollständige Modell beträgt 4,3122 ( dev), während sie für das Modell ohne Interaktion 6,4200 (von mir verwendet glmfit(X(:,1:3), [y n], 'binomial', 'link', 'probit');) beträgt und der zugehörige LR-Test zwei Freiheitsgrade aufweist (die Differenz in der Anzahl der Parameter zwischen den beiden Modellen). Da die skalierte Abweichung nur das Zweifache der Log-Wahrscheinlichkeit für GLMs beträgt, können wir sie verwenden

[H, pValue, Ratio, CriticalValue] = lratiotest(4.3122/2, 6.4200/2, 2)

wobei die Statistik als mit 2 df verteilt ist (der kritische Wert ist dann 5,9915, siehe ). Die Ausgabe zeigt ein nicht signifikantes Ergebnis an: Wir können nicht auf eine Wechselwirkung zwischen und in der beobachteten Probe schließen.χ2chi2inv(0.95, 2)xg

Ich denke, Sie können die oben genannten Schritte in einer praktischen Funktion Ihrer Wahl abschließen. (Beachten Sie, dass der LR-Test in sehr wenigen Befehlen von Hand durchgeführt werden kann!)


Ich habe diese Ergebnisse mit der R-Ausgabe verglichen, die als nächstes angegeben wird.

Hier ist der R-Code:

x <- c(2100,2300,2500,2700,2900,3100,3300,3500,3700,3900,4100,4300)
g <- gl(3, 4)
n <- c(48,42,31,34,31,21,23,23,21,16,17,21)
y <- c(1,2,0,3,8,8,14,17,19,15,17,21)
f <- cbind(y, n-y) ~ x*g
model.matrix(f)  # will be model.frame() for glm()
m1 <- glm(f, family=binomial("probit"))
summary(m1)

Hier sind die Ergebnisse für die Koeffizienten im vollständigen Modell:

Call:
glm(formula = f, family = binomial("probit"))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.7124  -0.1192   0.1494   0.3036   0.5585  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)  
(Intercept) -3.892859   2.025096  -1.922   0.0546 .
x            0.000884   0.000829   1.066   0.2863  
g2          -3.212494   2.762155  -1.163   0.2448  
g3          -5.774400   7.553615  -0.764   0.4446  
x:g2         0.001335   0.001017   1.312   0.1894  
x:g3         0.002061   0.002086   0.988   0.3230  

Für den Vergleich der beiden verschachtelten Modelle habe ich die folgenden Befehle verwendet:

m0 <- update(m1, . ~ . -x:g)
anova(m1,m0)

was die folgende "Abweichungstabelle" ergibt:

Analysis of Deviance Table

Model 1: cbind(y, n - y) ~ x + g
Model 2: cbind(y, n - y) ~ x * g
  Resid. Df Resid. Dev Df Deviance
1         8     6.4200            
2         6     4.3122  2   2.1078
chl
quelle
Übrigens, für andere, die dies verwenden möchten, müssen Sie als Referenz durch -2 und nicht durch 2 teilen, da sonst ein Fehler zurückgegeben wird. Siehe en.wikipedia.org/wiki/Deviance_%28statistics%29
mpacer
Vielen Dank auch - dies war unglaublich hilfreich, sowohl für mein Verständnis des Problems als auch für die allgemeine Klasse von Problemen, mit denen ich mich befasst habe :).
mpacer