Confronto tra livelli di fattori dopo un GLM in R


25

Ecco un piccolo retroscena della mia situazione: i miei dati si riferiscono al numero di prede mangiate con successo da un predatore. Poiché il numero di prede è limitato (25 disponibili) in ogni prova, ho avuto una colonna "Campione" che rappresenta il numero di prede disponibili (quindi, 25 in ogni prova) e un'altra chiamata "Conte" che era il numero di successo ( quante prede sono state mangiate). Ho basato la mia analisi sull'esempio del libro R su dati proporzionali (pagina 578). Le variabili esplicative sono Temperatura (4 livelli, che ho trattato come fattore) e Sesso del predatore (ovviamente, maschio o femmina). Quindi finisco con questo modello:

model <- glm(y ~ Temperature+Sex+Temperature*Sex data=predator, family=quasibinomial) 

Dopo aver ottenuto la tabella Analisi della devianza, si scopre che Temperatura e Sesso (ma non l'interazione) hanno un effetto significativo sul consumo di prede. Ora, il mio problema: ho bisogno di sapere quali temperature differiscono, cioè devo confrontare le 4 temperature tra loro. Se avessi un modello lineare, userei la funzione TukeyHSD, ma dato che sto usando un GLM non posso. Ho cercato il pacchetto MASS e ho cercato di impostare una matrice di contrasto, ma per qualche motivo non funziona. Qualche suggerimento o riferimento?

Ecco il riepilogo che ottengo dal mio modello, se questo aiuta a renderlo più chiaro ...

y <- cbind(data$Count, data$Sample-data$Count)
model <- glm(y ~ Temperature+Sex+Temperature*Sex data=predator, family=quasibinomial) 
> summary(model)

# Call:
# glm(formula = y ~ Temperature + Sex + Temperature * Sex, family=quasibinomial, data=data)

# Deviance Residuals: 
#     Min       1Q   Median       3Q      Max  
# -3.7926  -1.4308  -0.3098   0.9438   3.6831  

# Coefficients:
#                                        Estimate Std. Error t value Pr(>|t|)    
# (Intercept)                             -1.6094     0.2672  -6.024 3.86e-08 ***
# Temperature8                             0.3438     0.3594   0.957   0.3414    
# Temperature11                           -1.0296     0.4803  -2.144   0.0348 *  
# Temperature15                           -1.2669     0.5174  -2.449   0.0163 *  
# SexMale                                    0.3822     0.3577   1.069   0.2882    
# Temperature8:SexMale                    -0.2152     0.4884  -0.441   0.6606    
# Temperature11:SexMale                    0.4136     0.6093   0.679   0.4990    
# Temperature15:SexMale                    0.4370     0.6503   0.672   0.5033    
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

# (Dispersion parameter for quasibinomial family taken to be 2.97372)    
#     Null deviance: 384.54  on 95  degrees of freedom
# Residual deviance: 289.45  on 88  degrees of freedom
# AIC: NA   
# Number of Fisher Scoring iterations: 5

2
Ciao @Anne e benvenuto. Puoi provare a usare la glhtfunzione nel multcomppacchetto . Per eseguire i test TukeyHSD per la temperatura, usalo in questo modo glht(my.glm, mcp(Temperature="Tukey")). E BTW: La formula modello può essere abbreviato in: model<-glm(y ~ Temperature*Sex data=predator, family=quasibinomial). Con l'asterisco ( ) vengono montate le interazioni e gli effetti principali. *
COOLSerdash,

Ciao, grazie per la tua rapida risposta! Comunque devo fare qualcosa di sbagliato perché ricevo solo un messaggio di errore ... Presumo che my.glm sia il glm che ho eseguito prima (quindi, "modello" nel caso). A cosa si riferisce mcp? Viene visualizzato un messaggio di errore che indica che le dimensioni dei coefficienti e la matrice di covarianza non corrispondono ...?
Anne,

Sarebbe utile se modifichi la domanda e includa l'output del modello.
COOLSerdash

3
Perché hai modellato Temperaturecome fattore? Non hai i valori numerici effettivi? Vorrei usarli come una variabile continua e quindi l'intero problema è controverso.
gung - Ripristina Monica

3
È perfettamente ragionevole voler sapere come farlo in generale; la tua domanda è valida. Tuttavia, per quanto riguarda la tua situazione specifica, userei temp come una variabile continua anche se inizialmente l'hai considerata come un fattore. Mettendo da parte i problemi con confronti multipli, modellare la temperatura come fattore è un uso inefficiente delle informazioni che hai.
gung - Ripristina Monica

Risposte:


15

Anne, spiegherò brevemente come fare simili confronti multipli in generale. Perché questo non funziona nel tuo caso specifico, non lo so; Mi dispiace.

Ma normalmente, puoi farlo con il multcomppacchetto e la funzione glht. Ecco un esempio:

mydata      <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")
mydata$rank <- factor(mydata$rank)
my.mod      <- glm(admit~gre+gpa*rank, data=mydata, family=quasibinomial)

summary(my.mod)
# 
# Coefficients:
#              Estimate Std. Error t value Pr(>|t|)  
# (Intercept) -4.985768   2.498395  -1.996   0.0467 *
# gre          0.002287   0.001110   2.060   0.0400 *
# gpa          1.089088   0.731319   1.489   0.1372  
# rank2        0.503294   2.982966   0.169   0.8661  
# rank3        0.450796   3.266665   0.138   0.8903  
# rank4       -1.508472   4.202000  -0.359   0.7198  
# gpa:rank2   -0.342951   0.864575  -0.397   0.6918  
# gpa:rank3   -0.515245   0.935922  -0.551   0.5823  
# gpa:rank4   -0.009246   1.220757  -0.008   0.9940  
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Se desideri calcolare i confronti a coppie tra l' rankutilizzo dell'HSD di Tukey, puoi farlo in questo modo:

library(multcomp)
summary(glht(my.mod, mcp(rank="Tukey")))
# 
#    Simultaneous Tests for General Linear Hypotheses
# 
# Multiple Comparisons of Means: Tukey Contrasts
# 
# Fit: glm(formula = admit ~ gre + gpa * rank, family = quasibinomial, data = mydata)   
# 
# Linear Hypotheses:
#            Estimate Std. Error z value Pr(>|z|)
# 2 - 1 == 0   0.5033     2.9830   0.169    0.998
# 3 - 1 == 0   0.4508     3.2667   0.138    0.999
# 4 - 1 == 0  -1.5085     4.2020  -0.359    0.984
# 3 - 2 == 0  -0.0525     2.6880  -0.020    1.000
# 4 - 2 == 0  -2.0118     3.7540  -0.536    0.949
# 4 - 3 == 0  -1.9593     3.9972  -0.490    0.960
# (Adjusted p values reported -- single-step method)
# 
# Warning message:
# In mcp2matrix(model, linfct = linfct) :
#   covariate interactions found -- default contrast might be inappropriate

p

Nota: come notato da @gung nei commenti, dovresti - quando possibile - includere la temperatura come una variabile continua piuttosto che categorica. Per quanto riguarda l'interazione: è possibile eseguire un test del rapporto di verosimiglianza per verificare se il termine di interazione migliora significativamente l'adattamento del modello. Nel tuo caso, il codice sarebbe simile al seguente:

# Original model
model <- glm(y ~ Temperature+Sex+Temperature*Sex, data=predator, family=quasibinomial) 

# Model without an interaction
model2 <- glm(y ~ Temperature+Sex data=predator, family=quasibinomial) 

# Likelihood ratio test
anova(model, model2, test="LRT")

Se questo test non è significativo, è possibile rimuovere l'interazione dal modello. Forse glhtfunzionerà allora?


1
Oh dio, grazie mille !! Questa volta sono stato in grado di scrivere correttamente il comando e ha funzionato! Grazie ancora !
Anne,

1
Domanda aggiuntiva: esiste un modo per ottenere confronti multipli sull'interazione? Ho dati simili, in cui l'interazione (dalla domanda iniziale, che sarebbe Temperature * Sex) è significativa, e mi chiedevo se fosse possibile confrontarli insieme ...
Anne

1
Intendi un confronto multiplo per ogni livello dell'interazione? Se sì, potresti trovare interessante questo sito (l'ultimo paragrafo mostra come testare tutte le possibili combinazioni a coppie).
COOLSerdash

puoi creare una variabile che corrisponde alle interazioni per una variabile e usare questa variabile per eseguire il mcp. Lo fai così. mydata $ gparank <- interazione (mydata $ gpa, mydata $ rank)
Notquitesure

1
@Nova quale link vuoi dire? Quello nei commenti? Ecco il nuovo link a quel sito.
COOLSerdash,
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.