Comment R calcule-t-il la valeur de p pour cette régression binomiale?

8

Considérez la régression binomiale suivante:

# Create some data
set.seed(10)
n <- 500
x <- runif(n,0,100)
y <- x + rnorm(n,sd=100) < 0
 
# Fit a binomial regression model
model <- glm(y ~ x, family="binomial")

summary(model)

La summaryfonction renvoie une valeur de p de 1.03e-05. Lors de l'utilisation anova.glm, on obtient des valeurs de p légèrement plus extrêmes, quelle que soit la méthode utilisée pour calculer la valeur de p.

anova(model, test="Rao")   # p.value = 7.5e-6
anova(model, test="LRT")   # p.value = 6.3e-6
anova(model, test="Chisq") # p.value = 6.3e-6

La valeur de p de la summaryfonction s'applique-t-elle à la même hypothèse que celles renvoyées par la anovafonction? Si oui, comment a summarycalculé cette valeur de p et est-il possible d'effectuer le même calcul directement avec anova?

Remi.b
la source
3
Bien que la fonction R prenne "binôme" comme argument pour la famille, la famille binomiale par défaut suppose le lien logit et vous effectuez une régression logistique.
AdamO

Réponses:

5

Cela peut vous aider à lire ma réponse ici: pourquoi mes valeurs de p diffèrent-elles entre la sortie de régression logistique, le test du chi carré et l'intervalle de confiance pour l'OR? Votre question ici est presque un double de cela, mais il y a quelques éléments supplémentaires dans votre question qui peuvent être traités.

Comme le note @CliffAB, les valeurs de p dans la summary.glm()sortie proviennent de tests Wald. Celles-ci sont analogues aux tests de coefficients pour un modèle linéaire en ce qu'elles sont la différence entre la valeur ajustée du coefficient et la valeur de référence (prise pour être ), divisée par l'erreur standard. La différence est que ceux-ci sont considérés comme étant distribués comme une norme normale au lieu de . D'un autre côté, ceux-ci sont valables pour de grands échantillons et nous ne savons pas nécessairement ce qui constitue un «grand échantillon» dans un cas donné. t0t

L'utilisation anova.glm()vous donne accès à différents tests. Lorsque vous définissez test="Rao", il vous donne la valeur p d'un test de score. Et lorsque vous définissez soit test="Chisq"ou test="LRT"(ce sont les mêmes), cela vous donne la valeur p d'un test de rapport de vraisemblance.

La anova.glm()fonction teste la même hypothèse nulle que le test de Wald dans la summary()sortie dans ce cas . C'est uniquement parce que votre modèle n'a qu'une seule variable. La anova.glm()fonction effectuera des tests séquentiels, qui sont analogues à `` SS de type I '' dans un cadre linéaire, tandis que les tests de Wald summary()sont analogues à `` SS de type III '' dans un cadre linéaire (voir ma réponse ici: Comment interpréter le type I, type II, et type III ANOVA et MANOVA? ). Considérer:

x2 = rnorm(n)
m2 = glm(y~x+x2, family="binomial")
summary(m2)$coefficients
#                Estimate  Std. Error    z value     Pr(>|z|)
# (Intercept) -0.05906436 0.186876339 -0.3160612 7.519561e-01
# x           -0.01567551 0.003537183 -4.4316372 9.352029e-06
# x2          -0.05967796 0.099093504 -0.6022388 5.470152e-01
anova(m2, test="LRT")
# Terms added sequentially (first to last)
# 
#      Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
# NULL                   499     619.10              
# x     1  20.3841       498     598.72 6.335e-06 ***
# x2    1   0.3627       497     598.35     0.547    
m3 = glm(y~x2+x, family="binomial")  # I just switched the order of x & x2 here
summary(m3)$coefficients
#                Estimate  Std. Error    z value     Pr(>|z|)
# (Intercept) -0.05906436 0.186876339 -0.3160612 7.519561e-01
# x2          -0.05967796 0.099093504 -0.6022388 5.470152e-01  # these are the same
# x           -0.01567551 0.003537183 -4.4316372 9.352029e-06  #  as above
anova(m3, test="LRT")
# Terms added sequentially (first to last)
# 
#      Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
# NULL                   499     619.10              
# x2    1   0.1585       498     618.94    0.6906      # these differ from the
# x     1  20.5883       497     598.35 5.694e-06 ***  #  anova output above

Vous pouvez chausse-pied la anova.glm()fonction pour vous donner des tests de score et de rapport de vraisemblance de variables individuelles dans un modèle de régression logistique multiple qui sont analogues au `` SS de type III '', mais c'est fastidieux. Vous devrez continuer à réaménager votre modèle afin que chaque variable à son tour soit répertoriée en dernier dans la formule fournie pour l' glm()appel. La dernière valeur de p répertoriée dans la anova.glm()sortie est celle qui sera analogue à «type III SS».

Pour obtenir plus facilement les tests de score ou de rapport de vraisemblance de variables individuelles, utilisez drop1()plutôt. Considérer:

drop1(m3, test="LRT")
# Single term deletions
# 
# Model:
# y ~ x2 + x
#        Df Deviance    AIC     LRT  Pr(>Chi)    
# <none>      598.35 604.35                      
# x2      1   598.72 602.72  0.3627     0.547      # the same as when x2 is last above
# x       1   618.94 622.94 20.5883 5.694e-06 ***  # the same as when x  is last above
gung - Réintégrer Monica
la source
6

Dans R, la summaryfonction pour glmcalcule la valeur de p à l'aide d'une simple statistique de Wald, c'est-à-dire

2×Φ(-|β^|SE(β^))

β^ est le paramètre de régression qui nous intéresse, SE(β^) est l'erreur-type de ce paramètre de régression estimé et Φ est le CDF d'une distribution normale standard.

Pour recréer cela à partir de votre sortie, essayez

 beta = coef(model)[2]
 # getting estimate
 B_SE = sqrt(vcov(model)[2,2])
 # extracting standard error
 pvalue =  pnorm(-abs(beta) / B_SE)  * 2
 # pvalue = 1.027859e-05
Cliff AB
la source