Usando glm () come sostituto del semplice test chi quadrato


15

Sono interessato a modificare le ipotesi null utilizzando glm()in R.

Per esempio:

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

verifica l'ipotesi che . Cosa succede se desidero modificare il valore null in = un valore arbitrario, all'interno ? p=0.5pglm()

So che questo può essere fatto anche con prop.test()e chisq.test(), ma mi piacerebbe esplorare l'idea di utilizzare glm()per testare tutte le ipotesi relative ai dati categorici.


7
+1. riferisce evidentemente al parametro binomiale espresso come probabilità. Poiché il collegamento naturale (e quello utilizzato per impostazione predefinita) è il logit, per evitare confusione è importante distinguere p dal suo logit, che è il registro delle probabilità del registro ( p / ( 1 - p ) ) . pglmplog(p/(1p))
whuber

Risposte:


19

È possibile utilizzare un offset : glmcon i family="binomial"parametri di stima sulla quota-log o sulla scala-logit, quindi corrisponde a quota-log di 0 o una probabilità di 0,5. Se si desidera confrontare una probabilità di p , si desidera che il valore di base sia q = logit ( p ) = log ( p / ( 1 - p ) ) . Il modello statistico è oraβ0=0pq=logit(p)=log(p/(1p))

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

dove solo l'ultima riga è cambiata dalla configurazione standard. Nel codice R:

  • utilizzare offset(q)nella formula
  • la funzione logit / log-odds è qlogis(p)
  • leggermente fastidioso, devi fornire un valore di offset per ogni elemento nella variabile di risposta - R non replicherà automaticamente un valore costante per te. Questo viene fatto di seguito impostando un frame di dati, ma potresti semplicemente usarlo 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"))

2
(+1) questo ti darà il test Wald. Un LRT può essere fatto adattando il modello null glm(y ~ offset(q)-1, family=binomial, data=dd)e usando lrtestdal lmtestpacchetto. Il test chi-quadrato di Pearson è il test del punteggio per il modello GLM. Wald / LRT / Score sono tutti test coerenti e dovrebbero fornire un'inferenza equivalente in campioni di dimensioni ragionevolmente grandi.
AdamO

1
Penso che puoi anche usare anova()dalla base R sul glm per ottenere un test LR
Ben Bolker,

Interessante, ho perso l'abitudine di usare ANOVA. Tuttavia, osservo che anova si rifiuta di stampare il valore per il test, mentre lo lrtestfa.
AdamO

2
forse anova(.,test="Chisq")?
Ben Bolker,

6

Guarda l'intervallo di confidenza per i parametri del tuo 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 

Questo è un intervallo di confidenza per le probabilità del log.

Per abbiamo log ( o d d s ) = log pp=0.5log(odds)=logp1p=log1=0p=0.5

p


1
p<0.05

2
confintp<0,05

2

Non è (interamente) corretto / accurato utilizzare i valori p in base ai valori z / t nella funzione glm.summary come test di ipotesi.

  1. È un linguaggio confuso. I valori riportati sono denominati valori z. Ma in questo caso usano l' errore standard stimato al posto della vera deviazione. Quindi in realtà sono più vicini ai valori t . Confronta i seguenti tre output:
    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. Non sono valori p esatti. Un calcolo esatto del valore p usando la distribuzione binomiale funzionerebbe meglio (con la potenza di calcolo al giorno d'oggi, questo non è un problema). La distribuzione t, ipotizzando una distribuzione gaussiana dell'errore, non è esatta (sopravvaluta p, superando il livello alfa si verifica meno spesso nella "realtà"). Vedi il seguente confronto:

    # 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 of rejection by alpha

    La curva nera rappresenta l'uguaglianza. La curva rossa è sotto di essa. Ciò significa che per un dato valore p calcolato dalla funzione di riepilogo glm, troviamo questa situazione (o differenza maggiore) meno spesso nella realtà di quanto indichi il valore p.


Hmm .. Potrei essere confuso riguardo alla logica dell'uso della distribuzione T per un GLM. Puoi dare un picco a una domanda correlata che ho appena fatto qui ?
AdamO

2
Questa risposta è interessante ma problematica. (1) il PO in realtà non ha chiesto la differenza tra approcci basati sul punteggio, sul chi-quadrato, "esatti" o basati su GLM per testare ipotesi sulle risposte binomiali ( potrebbero effettivamente conoscere già tutto ciò), quindi questo non t rispondere alla domanda che è stata posta; (2) le stime della varianza residua ecc. Presentano una serie diversa di ipotesi e distribuzioni campionarie rispetto ai modelli lineari (come nella domanda di @ AdamO), quindi è discutibile l'uso di un t-test; ...
Ben Bolker,

2
(3) Gli intervalli di confidenza "esatti" per le risposte binomiali sono in realtà difficili (gli intervalli "esatti" [Clopper-Wilson] sono conservativi; i test dei punteggi possono funzionare meglio in alcuni intervalli
Ben Bolker,

@Ben Hai ragione sul fatto che il test z è effettivamente migliore del test t. Il grafico visualizzato nella risposta è per il test z. Utilizza l'output della funzione GLM. La linea di fondo della mia risposta era che il "valore p" è una cosa complicata. Pertanto, trovo meglio calcolarlo esplicitamente, ad esempio utilizzando la distribuzione normale, piuttosto che estrarre il valore p da una funzione glm, che è stata spostata molto convenientemente con l'offset ma nasconde le origini dei calcoli per il valore p .
Sesto Empirico

1
@BenBolker, credo che l'esatto test sia davvero conservativo, ma ... solo perché in realtà non stiamo campionando da perfette distribuzioni binomiali. Il test z alternativo, è migliore solo dal punto di vista empirico . È che i due "errori" si annullano a vicenda 1) la distribuzione binomiale non essendo la distribuzione reale dei residui in situazioni pratiche, 2) la distribuzione z non essendo un'espressione esatta per una distribuzione binomiale. È discutibile se dovremmo preferire la distribuzione sbagliata per il modello sbagliato , solo perché in pratica risulta 'ok'.
Sesto Empirico
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.