Codage d'une interaction entre un prédicteur nominal et continu pour la régression logistique dans MATLAB

8

Nos données sont donc structurées comme suit:

Nous avons participants, chaque participant peut être classé en 3 groupes ( G ), et pour chaque participant, nous avons échantillons d'une variable continue. Et nous essayons de prédire des valeurs qui sont soit 0 soit 1.M UNE,B,CN

Comment utiliserait-on matlab pour tester une interaction entre la variable continue et la variable catégorielle pour prédire ces valeurs?

mpacer
la source
@Thislstheld Quel code utilisez-vous pour ajuster votre régression logistique?
chl
@chl - Soit glmfit avec un 'lien', 'logit' ou mnrfit fonctionnerait, aucune préférence particulière non plus.
mpacer
Je ne pense pas que ce soit une question de statistique, mais une question de programmation, qui est placée plus correctement sur StackOverflow ...
Manoel Galdino
@Manoel comme le montre la réponse de @chl, cette question est de nature fondamentalement statistique. Si des questions comme celle-ci étaient hors sujet, il en serait de même pour la moitié des questions sur ce site!
whuber

Réponses:

9

La façon la plus simple, IMO, est de construire vous-même la matrice de conception, car elle glmfitaccepte 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 gniveaux (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+β1X+β2jeg=2+β3jeg=3+β4X×jeg=2+β5X×jeg=3,

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 xavec 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 statsstructure):

   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 lratiotestfonction 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 xet gdans 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
chl
la source
Btw, pour ceux qui souhaitent l'utiliser, pour votre référence, vous devez diviser par -2 et non 2, sinon cela retournera une erreur. Voir en.wikipedia.org/wiki/Deviance_%28statistics%29
mpacer
De plus, merci beaucoup - cela a été incroyablement utile à la fois dans ma compréhension du problème et dans la classe générale des problèmes auxquels je faisais face :).
mpacer