比较R中发生GLM后的因素水平


25

以下是有关我的处境的一些背景信息:我的数据是指被捕食者成功吃掉的猎物的数量。由于每个试验中猎物的数量都是有限的(可用25个),因此我有一列“ Sample”代表可用猎物的数量(因此,每个试验中有25个),另外一个名为“ Count”的数字表示成功的数量(吃了多少猎物)。我的分析基于R书中有关比例数据的示例(第578页)。解释变量是温度(4个级别,我将其视为因素)和捕食者的性别(显然是雄性还是雌性)。所以我最终得到这个模型:

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

得出“偏差分析”表后,事实证明,温度和性别(但不存在相互作用)对猎物的消耗有显着影响。现在,我的问题是:我需要知道哪个温度不同,即,我必须将这四个温度相互比较。如果我有线性模型,则可以使用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视为一个因素,我也会将temp用作连续变量。除了进行多次比较之外,将温度建模作为一个因素是对您所拥有信息的低效使用。
gung-恢复莫妮卡

Answers:


15

安妮,我将简要介绍一下如何进行这种多重比较。我不知道为什么这在您的特定情况下不起作用;对不起。

但是通常,您可以使用multcomppackage和function 来做到这一点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使用Tukey的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

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
补充问题:是否有办法对交互进行多次比较?我有类似的数据,其中的交互作用(从最初的问题开始,就是温度*性别)很重要,我想知道是否有可能将它们进行比较……
Anne

1
您是指对每个交互级别进行多次比较吗?如果是,您可能会发现此站点很有趣(最后一段显示了如何测试所有可能的成对组合)。
COOLSerdash

您可以创建一个变量,该变量与变量的交互作用相对应,并使用此变量执行mcp。你是这样做的。mydata $ gparank <-互动(mydata $ gpa,mydata $等级)
Notquitesure 2014年

1
@Nova是什么链接?评论中的一个?是指向该站点的新链接。
COOLSerdash
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.