Порівняння рівнів факторів після ГЛМ в R


25

Ось невеличка інформація про мою ситуацію: мої дані стосуються кількості здобичі, яку з'їдає хижак. Оскільки кількість видобутку обмежена (25 доступних) у кожному випробуванні, у мене був стовпчик "Зразок", який представляє кількість доступної здобичі (так, 25 у кожному випробуванні), та інший під назвою "Порахувати", який був кількістю успіху ( скільки здобичі було з’їдено). Я базував свій аналіз на прикладі книги R на основі даних про пропорції (стор. 578). Пояснювальні змінні - Температура (4 рівні, які я розглядав як фактор) та Стать хижака (очевидно, чоловіки чи жінки). Тож я закінчую цю модель:

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

Отримавши таблицю Аналіз відхилення, з'ясовується, що температура та стать (але не взаємодія) суттєво впливають на споживання здобичі. Тепер моя проблема: мені потрібно знати, які температури відрізняються, тобто я повинен порівнювати 4 температури між собою. Якби у мене була лінійна модель, я би використовував функцію TukeyHSD, але оскільки я використовую GLM, я не можу. Я переглядав пакет MASS і намагаюся встановити контрастну матрицю, але чомусь це не працює. Будь-які пропозиції чи посилання?

Ось підсумок, який я отримую від своєї моделі, якщо це допомагає зробити це зрозумілішим ...

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
glhtmultcompglht(my.glm, mcp(Temperature="Tukey"))model<-glm(y ~ Temperature*Sex data=predator, family=quasibinomial)

Привіт, дякую за швидку відповідь! Однак я повинен щось робити неправильно, оскільки отримую лише повідомлення про помилку ... Я припускаю, що my.glm - це glm, який я виконував раніше (тому "модель" у випадку). На що посилається mcp? Я отримую повідомлення про помилку, що говорить про те, що розміри коефіцієнтів та матриці коваріації не відповідають ...?
Енн

Було б корисно, якби ви відредагували своє запитання та включили висновок моделі.
COOLSerdash

3
Чому ви моделювали Temperatureяк фактор? У вас немає фактичних числових значень? Я б використовував їх як суцільну змінну, і тоді вся ця проблема є спірною.
gung - Відновіть Моніку

3
Цілком розумно хотіти знати, як це зробити в цілому; ваше питання стоїть. Однак, з огляду на вашу конкретну ситуацію, я би використовував temp як суцільну змінну, навіть якщо ви спочатку вважали це фактором. Якщо відмовитись від проблем, що стосуються декількох порівнянь, моделювання темпів як фактору є неефективним використанням наявної інформації.
gung - Відновіть Моніку

Відповіді:


15

Енн, я коротко поясню, як робити такі багаторазові порівняння взагалі. Чому це не працює у вашому конкретному випадку, я не знаю; Мені шкода.

Але зазвичай це можна зробити за допомогою multcompпакета та функції glht. Ось приклад:

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

Якщо ви хочете обчислити парні порівняння між rankвикористанням Hkey DS Tukey, ви можете зробити це таким чином:

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

Примітка. Як зазначає @gung у коментарях, вам слід, коли це можливо, включати температуру як суцільну, а не категоричну змінну. Щодо взаємодії: ви можете виконати тест на коефіцієнт ймовірності, щоб перевірити, чи значно покращив термін взаємодії модель. У вашому випадку код буде виглядати приблизно так:

# 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")

Якщо цей тест не суттєвий, ви можете видалити взаємодію зі своєї моделі. Може glht, тоді буде працювати?


1
О боже, дякую ТАКЕ !! Цього разу я зміг правильно написати команду, і вона спрацювала! Знову дякую !
Енн

1
Питання, що додається: чи існує спосіб порівняння взаємодії? У мене є подібні дані, де взаємодія (з початкового питання, що було б Температура * Пол) є важливою, і мені було цікаво, чи можна порівняти їх разом ...
Енн

1
Ви маєте на увазі багаторазове порівняння для кожного рівня взаємодії? Якщо так, то цей сайт може бути цікавим (останній абзац показує, як перевірити всі можливі парні комбінації).
COOLSerdash

ви можете створити змінну, яка відповідає взаємодії змінної, і використовувати цю змінну для здійснення mcp. Ви робите це так. mydata $ gparank <- взаємодія (mydata $ gpa , mydata $ rank)
Notquitesure

1
@Nova про яке посилання ви маєте на увазі? Той, що в коментарях? Ось нове посилання на цей сайт.
COOLSerdash
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.