Сравнение уровней факторов после 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будет работать?


1
О Боже, спасибо вам большое! На этот раз мне удалось правильно написать команду, и она сработала! Еще раз спасибо !
— Энн

1
Дополнительный вопрос: есть ли способ получить множественные сравнения по взаимодействию? У меня есть подобные данные, где взаимодействие (из первоначального вопроса, которое было бы «Температура * пол») является значительным, и мне было интересно, можно ли сравнить их вместе ...
— Энн

1
Вы имеете в виду множественное сравнение для каждого уровня взаимодействия? Если да, вы можете найти этот сайт интересным (в последнем параграфе показано, как проверить все возможные парные комбинации).
— COOLSerdash

Вы можете создать переменную, которая соответствует взаимодействиям для переменной, и использовать эту переменную для выполнения mcp. Вы делаете это так. mydata $ gparank <- взаимодействие (mydata $ gpa, mydata $ rank)
— Notquitesure

1
@ Новая, какую ссылку ты имеешь в виду? Тот, что в комментариях? Вот новая ссылка на этот сайт.
— COOLSerdash
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.