二项GLM嵌套数据建模、变量编码及固定效应设置咨询
1. 嵌套写法的正误说明
你原代码里的night/month写法存在两个核心问题:
- 第一是嵌套层级写反了:R公式语法中
a/b代表b嵌套在a下,展开为a + a:b。你要实现“调查夜(night)嵌套在月份(month)下”,正确的运算符顺序应该是month/night,你写的night/month实际代表“月份嵌套在调查夜下”,和你的研究设计层级完全相反。 - 第二是你看到输出里出现交互项属于正常现象:R中不存在单独的“嵌套项”类型,嵌套效应的参数化本质就是「上层分组变量主效应 + 上层变量与下层嵌套变量的交互项」,用来估计上层变量每个水平内部下层变量的独立效应,不是程序识别错误。
2. night变量的编码修正
你当前用的「单月内A区4晚编1-4、B区4晚重复编1-4」的编码是错误的,原因是同一编码值对应了两个完全独立的调查夜(比如3月A区11日和B区18日都被编为1),模型会将二者识别为同一个调查夜,导致效应估计完全失真。
两种可选编码的适用场景如下:
- 优先选「单月内8晚连续编码为1-8」:按调查时间顺序,将每月先开展的A区4晚编为1-4,后开展的B区4晚编为5-8即可。这种编码下,搭配
month/night的嵌套写法,模型会自动将不同月份下编码重复的night(比如3月night=1、4月night=1)识别为不同月份下的独立调查夜,不需要额外做全局编码,完全匹配你的研究设计。 - 全局连续编码(非必需):如果需要给每个调查夜加全局唯一标识,可以将3个月累计24个独立调查夜按时间顺序编为1-24即可(你提到的1-32属于笔误,3个月每月8晚总计24晚),这种编码下不需要写嵌套语法,直接将night作为分组变量即可,但对你的研究目标来说没有必要。
额外提醒:因为你每个研究区每一晚的调查路线、观测样地完全固定,不需要再给night加研究区的嵌套层级——单月内8晚的编码已经和调查顺序、所属研究区一一对应,month/night已经可以完全覆盖每个独立调查单元的变异。
3. 研究区(zone)的效应类型设定
zone应当设置为固定效应,判断依据完全匹配固定效应的适用规则:
- 你的核心研究目标就包含检验鹿类出现概率在两个研究区间的差异,两个研究区是你刻意选定的调查对象,你需要直接估计A、B区的具体效应值,结论也仅针对你调查的这两个研究区,完全符合固定效应的设定要求。
- 只有当研究区是从一个大的总体区域中随机抽取、你不关心单个研究区的具体效应、要将结论推广到总体中所有同类区域时,才需要将zone设为随机效应,这和你的研究目标不匹配。
4. 修正后的可运行代码
data <- comp # 变量类型转换 data$fieldtype <- as.factor(data$fieldtype) data$zone <- as.factor(data$zone) data$month <- as.factor(data$month) # 修正night编码:A区保留原1-4编码,B区原1-4编码加4变为5-8,保证单月内编码唯一 data$night <- as.factor(ifelse(data$zone == "A", data$night, data$night + 4)) # 正确的二项GLM模型:注意嵌套顺序是month/night,不是night/month mod3 <- glm( presence ~ zone + fieldtype + month/night, family = binomial, data = data )
补充说明:如果你后续不需要估计每个调查夜的具体效应,只是想控制不同夜晚间的随机干扰(比如某晚降雨、某晚人类活动强度异常),也可以将嵌套的night作为随机效应,使用lme4包的混合效应模型实现,这属于模型选择范畴,不影响嵌套逻辑的正确性:
# 加载混合效应包 library(lme4) mod3_mixed <- glmer( presence ~ zone + fieldtype + (1|month/night), family = binomial, data = data )
内容的提问来源于stack exchange,提问作者Anthonin Dupuy
相关产品推荐
相关产品推荐

