问题描述
我正在尝试构建一个GLMM以适合我的数据,但是由于某种原因,我所有的随机效果都恢复为“由于奇异而未定义”。
我知道这将表明它们是由另一个变量完美预测的,但是这些变量是一天中的时间,日期和个人ID,并且不容易相互关联或与其他任何变量关联。我一直将它们添加为... +(1 | randomeffect)。
我尝试仅包含一个而不包含其他,但是无论如何,我都会收到此错误。该模型的其余部分运行良好。
这是模型和输出:
Call:
glm(formula = df$Sex ~ df$`Low Freq (KHz)` + df$`Full Song Duration` +
(1 | df$Individual) + (1 | df$TOD) + (1 | df$DATER),family = binomial(link = "logit"),data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.95539 -0.18003 0.02514 0.10766 2.16469
Coefficients: (3 not defined because of singularities)
Estimate Std. Error z value Pr(>|z|)
(Intercept) 4.2354 1.0846 3.905 9.42e-05 ***
df$`Low Freq (KHz)` -0.7999 0.3923 -2.039 0.0414 *
df$`Full Song Duration` 5.2124 1.2008 4.341 1.42e-05 ***
1 | df$IndividualTRUE NA NA NA NA
1 | df$TODTRUE NA NA NA NA
1 | df$DATERTRUE NA NA NA NA
解决方法
您的问题是您实际上不适合GLMM:glm()
不能做到这一点。您可能想要:
library(lme4)
glmer(formula = Sex ~ `Low Freq (KHz)` + `Full Song Duration` +
(1 | Individual) + (1 | TOD) + (1 | DATER),family = binomial(link = "logit"),data = df)
- 由于不了解随机效应,
glm()
将1|TOD
之类的术语解释为文字“或”语句:在这种情况下,0被视为FALSE,而其他任何数字均被视为TRUE,因此1|x
总是 TRUE-因此您最终在模型中得到了几列额外的1(从TRUE转换回来),它们与截距共线...
一些切线建议:
- 建议不在GLM(M)公式中使用
df$...
; R知道足够从提供的数据框中获取这些变量 - 通常,我建议将变量名转换为无需反引号即可使用的名称,例如
low_freq
和full_duration
(但这是个人喜好问题)