Der einfachste Weg, IMO, besteht darin, die Entwurfsmatrix selbst zu erstellen, da glmfit
entweder 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:g
g
β0+β1⋅x+β2⋅Ig=2+β3⋅Ig=3+β4⋅x×Ig=2+β5⋅x×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 x
mit 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 stats
Struktur) 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 lratiotest
Funktion 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)
x
g
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