Сравнение уровней факторов после GLM в 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
Привет @ Энн и добро пожаловать. Вы можете попробовать использовать glhtфункцию в multcompпакете . Чтобы выполнить тесты TukeyHSD на температуру, используйте его следующим образом glht(my.glm, mcp(Temperature="Tukey")). И кстати: Ваша модель формула может быть сокращена до: model<-glm(y ~ Temperature*Sex data=predator, family=quasibinomial). Звездочкой ( ) обозначены взаимодействия и основные эффекты. *
COOLSerdash
Привет, спасибо за быстрый ответ! Однако я должен делать что-то не так, потому что я получаю только сообщение об ошибке ... Я предполагаю, что 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использованием HSD Тьюки, вы можете сделать это следующим образом:

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

Все парные сравнения даны вместе с значением. Предупреждение: эти сравнения касаются только основных эффектов. Взаимодействия игнорируются. Если взаимодействия присутствуют, будет дано предупреждение (как в выходных данных выше). Более подробное руководство о том, как действовать в случае присутствия взаимодействий, см. В этих дополнительных примерах для multicomp .п

Примечание: как отметил @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будет работать?

COOLSerdash
источник
1
О Боже, спасибо вам большое! На этот раз мне удалось правильно написать команду, и она сработала! Еще раз спасибо !
Энн
1
Дополнительный вопрос: есть ли способ получить множественные сравнения по взаимодействию? У меня есть подобные данные, где взаимодействие (из первоначального вопроса, которое было бы «Температура * пол») является значительным, и мне было интересно, можно ли сравнить их вместе ...
Энн
1
Вы имеете в виду множественное сравнение для каждого уровня взаимодействия? Если да, вы можете найти этот сайт интересным (в последнем параграфе показано, как проверить все возможные парные комбинации).
COOLSerdash
Вы можете создать переменную, которая соответствует взаимодействиям для переменной, и использовать эту переменную для выполнения mcp. Вы делаете это так. mydata $ gparank <- взаимодействие (mydata $ gpa, mydata $ rank)
Notquitesure
1
@ Новая, какую ссылку ты имеешь в виду? Тот, что в комментариях? Вот новая ссылка на этот сайт.
COOLSerdash