Verwendung von glm () als Ersatz für einen einfachen Chi-Quadrat-Test

15

Ich bin daran interessiert, die Nullhypothesen glm()in R zu ändern .

Beispielsweise:

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

testet die Hypothese, dass . Was ist, wenn ich die Null in = einen beliebigen Wert innerhalb von ändern möchte ? p=0,5pglm()

Ich weiß, dass dies auch mit prop.test()und möglich ist chisq.test(), aber ich möchte die Idee untersuchen, glm()mit allen Hypothesen, die sich auf kategoriale Daten beziehen, einen Test durchzuführen.

Bill Ravenwood
quelle
7
+1. bezieht sich offensichtlich auf den als Wahrscheinlichkeit ausgedrückten Binomialparameter . Da die natürliche Verbindung (und die standardmäßig verwendete) die Protokollierung ist, ist es zur Vermeidung von Verwechslungen wichtig, von der Protokollierung zu unterscheiden , bei der es sich um die Protokollquoten . pglmpLog(p/(1-p))
whuber

Antworten:

19

Sie können einen Versatz verwenden : glmmit family="binomial"Schätzparametern auf der Log-Odds- oder Logit-Skala, sodass einer Log-Odds von 0 oder einer Wahrscheinlichkeit von 0,5 entspricht. Wenn Sie mit einer Wahrscheinlichkeit von vergleichen möchten , möchten Sie, dass der Grundlinienwert . Das statistische Modell ist jetztp q = logit ( p ) = log ( p / ( 1 - p ) )β0=0pq=logit(p)=Log(p/(1-p))

Y.Binom(μ)μ=1/(1+exp(-η))η=β0+q

wobei sich nur die letzte Zeile gegenüber der Standardeinstellung geändert hat. Im R-Code:

  • Verwenden Sie offset(q)in der Formel
  • Die Logit / Log-Odds-Funktion ist qlogis(p)
  • Etwas ärgerlich ist, dass Sie für jedes Element in der Antwortvariablen einen Versatzwert angeben müssen - R repliziert für Sie nicht automatisch einen konstanten Wert. Dies wird im Folgenden durch das Einrichten eines Datenrahmens durchgeführt, aber Sie könnten es einfach verwenden 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
quelle
2
(+1) Dies gibt Ihnen den Wald-Test. Ein LRT kann durch Anpassen des Nullmodells glm(y ~ offset(q)-1, family=binomial, data=dd)und Verwenden lrtestaus dem lmtestPaket erstellt werden. Pearsons Chi-Quadrat-Test ist der Score-Test für das GLM-Modell. Wald / LRT / Score sind allesamt konsistente Tests und sollten bei relativ großen Stichproben entsprechende Schlussfolgerungen liefern.
AdamO
1
Ich denke, Sie können auch anova()von Basis R auf dem glm verwenden, um einen LR-Test zu erhalten
Ben Bolker
Interessanterweise habe ich die Angewohnheit verloren, ANOVA zu verwenden. Ich beobachte jedoch, dass anova sich weigert, den p-Wert für den Test zu drucken, wohingegen dies der lrtestFall ist.
AdamO
2
vielleicht anova(.,test="Chisq")?
Ben Bolker
6

Sehen Sie sich das Konfidenzintervall für die Parameter Ihres GLM an:

> 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 

Dies ist ein Konfidenzintervall für Log-Odds.

p=0,5Log(Ödds)=Logp1-p=Log1=0p=0,5

p

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

Es ist nicht (vollständig) korrekt / genau, die p-Werte, die auf den z- / t-Werten in der Funktion glm.summary basieren, als Hypothesentest zu verwenden.

  1. Das ist verwirrende Sprache. Die angegebenen Werte werden als z-Werte bezeichnet. In diesem Fall wird jedoch der geschätzte Standardfehler anstelle der tatsächlichen Abweichung verwendet. In Wirklichkeit sind sie daher näher an t-Werten . Vergleichen Sie die folgenden drei Ausgaben:
    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. Sie sind keine exakten p-Werte. Eine genaue Berechnung des p-Wertes mit der Binomialverteilung würde besser funktionieren (mit der Rechenleistung ist dies heutzutage kein Problem mehr). Die t-Verteilung unter der Annahme einer Gaußschen Verteilung des Fehlers ist nicht genau (sie überschätzt p, ein Überschreiten des Alpha-Niveaus tritt in der "Realität" seltener auf). Siehe folgenden Vergleich:

    # 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 der Ablehnung durch Alpha

    Die schwarze Kurve steht für Gleichheit. Die rote Kurve ist darunter. Dies bedeutet, dass wir für einen gegebenen berechneten p-Wert durch die glm-Zusammenfassungsfunktion diese Situation (oder einen größeren Unterschied) in der Realität seltener finden, als der p-Wert angibt.

Sextus Empiricus
quelle
Hmm .. Ich kann über die Gründe für die Verwendung der T-Verteilung für eine GLM verwirrt sein. Können Sie einen Blick auf eine verwandte Frage werfen, die ich gerade hier gestellt habe ?
AdamO
2
Diese Antwort ist interessant, aber problematisch. (1) Das OP hat nicht wirklich nach dem Unterschied zwischen Score, Chi-Quadrat, "exakt" oder GLM-basierten Ansätzen gefragt, um Hypothesen über Binomialantworten zu testen (sie kennen das alles vielleicht bereits). t die gestellte Frage beantworten; (2) Die Schätzungen der Restvarianz usw. basieren auf anderen Annahmen und Stichprobenverteilungen als die linearen Modelle (wie in der Frage von @ AdamO). Daher ist die Verwendung eines t-Tests umstritten. ...
Ben Bolker
2
(3) „exakte“ Konfidenzintervalle für binomiale Antworten sind tatsächlich schwierig („exakte“ [Clopper-Wilson] -Intervalle sind konservativ; in einigen Bereichen können Score-Tests bessere Ergebnisse erzielen
Ben Bolker
@Ben Du hast Recht, dass der Z-Test tatsächlich besser ist als der T-Test. Das in der Antwort angezeigte Diagramm ist für den Z-Test. Es verwendet die Ausgabe der GLM-Funktion. Das Fazit meiner Antwort war, dass der "p-Wert" eine heikle Sache ist. Daher finde ich es besser, es explizit zu berechnen, z. B. unter Verwendung der Normalverteilung, als den p-Wert aus einer glm-Funktion zu extrahieren, die sehr bequem um den Offset verschoben wurde, aber die Ursprünge der Berechnungen für den p-Wert verbirgt .
Sextus Empiricus
1
@BenBolker, ich glaube, der genaue Test ist in der Tat konservativ, aber ... nur, weil wir in Wirklichkeit keine Stichproben aus perfekten Binomialverteilungen ziehen. Der alternative Z-Test ist nur aus empirischer Sicht besser . Die beiden "Fehler" heben sich gegenseitig auf. 1) Die Binomialverteilung ist in der Praxis nicht die tatsächliche Verteilung der Residuen. 2) Die Z-Verteilung ist kein exakter Ausdruck für eine Binomialverteilung. Es ist fraglich, ob wir die falsche Distribution für das falsche Modell bevorzugen sollten , nur weil es sich in der Praxis als 'ok' herausstellt.
Sextus Empiricus