La façon la plus simple, IMO, est de construire vous-même la matrice de conception, car elle glmfit
accepte soit une matrice de valeurs brutes (observées), soit une matrice de conception. Le codage d'un terme d'interaction n'est pas si difficile une fois que vous avez écrit le modèle complet. Disons que nous avons deux prédicteurs,X (continu) et g (catégorique, avec trois niveaux non ordonnés, disons g= 1 , 2 , 3). En utilisant la notation de Wilkinson, nous écririons ce modèle comme y ~ x + g + x:g
, en négligeant le côté gauche (pour un résultat binomial, nous utiliserions une fonction de lien logit). Nous avons seulement besoin de deux vecteurs fictifs pour coder les g
niveaux (présents / absents pour une observation particulière), nous aurons donc 5 coefficients de régression, plus un terme d'interception. Cela peut être résumé comme
β0+β1⋅ x +β2⋅jeg= 2+β3⋅jeg= 3+β4⋅ x ×jeg= 2+β5⋅ x ×jeg= 3,
où je représente une matrice d'indicateurs codant le niveau de g.
Dans Matlab, en utilisant l'exemple en ligne, je ferais ce qui suit:
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');
Je n'ai pas inclus de colonne pour l'interception car elle est incluse par défaut. La matrice de conception ressemble à
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
et vous pouvez voir que les termes d'interaction sont simplement codés comme le produit de x
avec la colonne correspondante de g
(g = 2 et g = 3, car nous n'avons pas besoin du premier niveau).
Les résultats sont donnés ci-dessous, sous forme de coefficients, d'erreurs standard, de statistiques et de valeurs de p (à partir de la stats
structure):
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
Maintenant, tester l'interaction peut être fait en calculant la différence de déviance du modèle complet ci-dessus et d'un modèle réduit (en omettant le terme d'interaction, c'est-à-dire les deux dernières colonnes de la matrice de conception). Cela peut être fait manuellement ou en utilisant la lratiotest
fonction qui fournit le test d'hypothèse du rapport de vraisemblance. La déviance pour le modèle complet est de 4,3122 ( dev
), tandis que pour le modèle sans interaction, elle est de 6,4200 (j'ai utilisé glmfit(X(:,1:3), [y n], 'binomial', 'link', 'probit');
), et le test LR associé a deux degrés de liberté (la différence de nombre de paramètres entre les deux modèles). Comme la déviance à l'échelle est deux fois plus faible que la probabilité logarithmique pour les GLM, nous pouvons utiliser
[H, pValue, Ratio, CriticalValue] = lratiotest(4.3122/2, 6.4200/2, 2)
où la statistique est distribuée comme χ2avec 2 df (la valeur critique est alors 5,9915, voir chi2inv(0.95, 2)
). Le résultat indique un résultat non significatif: nous ne pouvons conclure à l'existence d'une interaction entre x
et g
dans l'échantillon observé.
Je suppose que vous pouvez conclure les étapes ci-dessus dans une fonction pratique de votre choix. (Notez que le test LR peut être fait à la main avec très peu de commandes!)
J'ai vérifié ces résultats par rapport à la sortie R, qui est donnée ensuite.
Voici le code R:
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)
Voici les résultats, pour les coefficients du modèle complet,
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
Pour la comparaison des deux modèles imbriqués, j'ai utilisé les commandes suivantes:
m0 <- update(m1, . ~ . -x:g)
anova(m1,m0)
qui donne le "tableau de déviance" suivant:
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