Utilisation de glm () comme substitut d'un simple test du chi carré

15

Je souhaite modifier les hypothèses nulles à l'aide glm()de R.

Par exemple:

x = rbinom(100, 1, .7)  
summary(glm(x ~ 1, family = "binomial"))

teste l'hypothèse que . Et si je veux changer le null en pp=0.5p = une valeur arbitraire, à l'intérieur glm()?

Je sais que cela peut être fait aussi avec prop.test()et chisq.test(), mais j'aimerais explorer l'idée d'utiliser glm()pour tester toutes les hypothèses relatives aux données catégorielles.

Bill Ravenwood
la source
7
+1. fait évidemment référence au paramètre binomial exprimé en probabilité. Étant donné que le lien naturel (et celui utilisé par défaut) est le logit, pour éviter toute confusion, il est important de distinguer p de son logit, qui est le journal des cotes du journal ( p / ( 1 - p ) ) . pglmpJournal(p/(1-p))
whuber

Réponses:

19

Vous pouvez utiliser un décalage : glmavec family="binomial"des paramètres d'estimation sur l'échelle log-odds ou logit, donc correspond à des log-odds de 0 ou une probabilité de 0,5. Si vous voulez comparer avec une probabilité de p , vous voulez que la valeur de base soit q = logit ( p ) = log ( p / ( 1 - p ) ) . Le modèle statistique est maintenantβ0=0pq=logit(p)=Journal(p/(1-p))

OuiBinom(μ)μ=1/(1+exp(-η))η=β0+q

où seule la dernière ligne a changé par rapport à la configuration standard. En code R:

  • utilisation offset(q) dans la formule
  • la fonction logit / log-odds est qlogis(p)
  • légèrement ennuyeux, vous devez fournir une valeur de décalage pour chaque élément de la variable de réponse - R ne reproduira pas automatiquement une valeur constante pour vous. Cela se fait ci-dessous en configurant une trame de données, mais vous pouvez simplement l'utiliser rep(q,100).
x = rbinom(100, 1, .7)
dd <- data.frame(x, q = qlogis(0.7)) 
summary(glm(x ~ 1 + offset(q), data=dd, family = "binomial"))
Ben Bolker
la source
2
(+1) cela vous donnera le test de Wald. Un LRT peut être fait en ajustant le modèle nul glm(y ~ offset(q)-1, family=binomial, data=dd)et en utilisant à lrtestpartir du lmtestpackage. Le test du chi carré de Pearson est le test de score pour le modèle GLM. Wald / LRT / Score sont tous des tests cohérents et devraient fournir une inférence équivalente dans des tailles d'échantillon raisonnablement grandes.
AdamO
1
Je pense que vous pouvez également utiliser à anova()partir de la base R sur le GLM pour obtenir un test LR
Ben Bolker
Intéressant, j'ai perdu l'habitude d'utiliser l'ANOVA. Cependant, j'observe qu'anova refuse d'imprimer la valeur p pour le test alors que oui lrtest.
AdamO
2
peut anova(.,test="Chisq")- être ?
Ben Bolker
6

Regardez l'intervalle de confiance pour les paramètres de votre GLM:

> set.seed(1)
> x = rbinom(100, 1, .7)
> model<-glm(x ~ 1, family = "binomial")
> confint(model)
Waiting for profiling to be done...
    2.5 %    97.5 % 
0.3426412 1.1862042 

Il s'agit d'un intervalle de confiance pour les log-odds.

Pour nous avons log ( o d d s ) = log pp=0,5. Donc, tester l'hypothèse quep=0,5Journal(os)=Journalp1-p=Journal1=0p=0,5 équivaut à vérifier si l'intervalle de confiance contient 0. Celui-ci n'en a pas, donc l'hypothèse est rejetée.

p

Łukasz Deryło
la source
1
p<0,05
2
confintp<0,05
2

Il n'est pas (entièrement) correct / précis d'utiliser les valeurs p basées sur les valeurs z / t dans la fonction glm.summary comme test d'hypothèse.

  1. C'est un langage déroutant. Les valeurs rapportées sont nommées valeurs z. Mais dans ce cas, ils utilisent l' erreur standard estimée à la place de la véritable déviation. Par conséquent, en réalité, ils sont plus proches des valeurs t . Comparez les trois sorties suivantes:
    1) summary.glm
    2) t-test
    3) z-test

    > set.seed(1)
    > x = rbinom(100, 1, .7)
    
    > coef1 <- summary(glm(x ~ 1, offset=rep(qlogis(0.7),length(x)), family = "binomial"))$coefficients
    > coef2 <- summary(glm(x ~ 1, family = "binomial"))$coefficients
    
    > coef1[4]  # output from summary.glm
    [1] 0.6626359
    > 2*pt(-abs((qlogis(0.7)-coef2[1])/coef2[2]),99,ncp=0) # manual t-test
    [1] 0.6635858
    > 2*pnorm(-abs((qlogis(0.7)-coef2[1])/coef2[2]),0,1) # manual z-test
    [1] 0.6626359
  2. Ce ne sont pas des valeurs p exactes. Un calcul exact de la valeur de p en utilisant la distribution binomiale fonctionnerait mieux (avec la puissance de calcul de nos jours, ce n'est pas un problème). La distribution t, en supposant une distribution gaussienne de l'erreur, n'est pas exacte (elle surestime p, le dépassement du niveau alpha se produit moins souvent en "réalité"). Voir la comparaison suivante:

    # trying all 100 possible outcomes if the true value is p=0.7
    px <- dbinom(0:100,100,0.7)
    p_model = rep(0,101)
    for (i in 0:100) {
      xi = c(rep(1,i),rep(0,100-i))
      model = glm(xi ~ 1, offset=rep(qlogis(0.7),100), family="binomial")
      p_model[i+1] = 1-summary(model)$coefficients[4]
    }
    
    
    # plotting cumulative distribution of outcomes
    outcomes <- p_model[order(p_model)]
    cdf <- cumsum(px[order(p_model)])
    plot(1-outcomes,1-cdf, 
         ylab="cumulative probability", 
         xlab= "calculated glm p-value",
         xlim=c(10^-4,1),ylim=c(10^-4,1),col=2,cex=0.5,log="xy")
    lines(c(0.00001,1),c(0.00001,1))
    for (i in 1:100) {
      lines(1-c(outcomes[i],outcomes[i+1]),1-c(cdf[i+1],cdf[i+1]),col=2)
    #  lines(1-c(outcomes[i],outcomes[i]),1-c(cdf[i],cdf[i+1]),col=2)
    }
    
    title("probability for rejection as function of set alpha level")

    CDF de rejet par alpha

    La courbe noire représente l'égalité. La courbe rouge est en dessous. Cela signifie que pour une valeur de p calculée calculée par la fonction de résumé glm, nous trouvons cette situation (ou une différence plus grande) moins souvent en réalité que la valeur de p ne l'indique.

Sextus Empiricus
la source
Hmm .. Je peux être confus quant à la raison d'utiliser la distribution T pour un GLM. Pouvez-vous prendre un pic à une question connexe que je viens de poser ici ?
AdamO
2
Cette réponse est intéressante mais problématique. (1) l'OP n'a pas réellement posé de questions sur la différence entre les approches basées sur le score, le chi carré, "exact" ou GLM pour tester les hypothèses sur les réponses binomiales (ils pourraient en fait déjà savoir tout cela), donc cela ne fonctionne pas '' t répondre à la question posée; (2) les estimations de la variance résiduelle, etc. ont un ensemble différent d'hypothèses et de distributions d'échantillonnage à partir de modèles linéaires (comme dans la question de @ AdamO), donc l'utilisation d'un test t est discutable; ...
Ben Bolker
2
(3) Les intervalles de confiance «exacts» pour les réponses binomiales sont en fait délicats (les intervalles «exacts» [Clopper-Wilson] sont conservateurs; les tests de score peuvent mieux fonctionner sur certaines plages
Ben Bolker
@Ben Vous avez raison de dire que le z-test est en fait meilleur que le t-test. Le graphique affiché dans la réponse correspond au test z. Il utilise la sortie de la fonction GLM. L'essentiel de ma réponse était que la "valeur p" est une chose délicate. Par conséquent, je trouve préférable de le calculer explicitement, par exemple en utilisant la distribution normale, plutôt que d'extraire la valeur de p d'une fonction glm, qui a très commodément été décalée avec le décalage mais cache l'origine des calculs pour la valeur de p .
Sextus Empiricus
1
@BenBolker, je crois que le test exact est en effet conservateur, mais ... uniquement parce qu'en réalité nous n'échantillons pas à partir de distributions binomiales parfaites. L'alternative z-test n'est meilleure que d'un point de vue empirique . C'est que les deux "erreurs" s'annulent 1) la distribution binomiale n'étant pas la distribution réelle des résidus dans des situations pratiques, 2) la distribution z n'étant pas une expression exacte d'une distribution binomiale. On peut se demander si nous devrions préférer la mauvaise distribution pour le mauvais modèle, simplement parce que dans la pratique, cela se révèle «ok».
Sextus Empiricus