在brms中指定组水平效应遇重复组效应错误的求解
解决brms模型重复组效应错误(保留所有预设关系)
问题背景
我尝试用brms建模连续变量y和连续变量mass、三个分类变量site/sex/method的关系,变量存在嵌套/组合结构,预设要捕捉的关系如下:
mass与y的全局关系,以及三个分类变量的全局截距site层面mass与y的特定关系(截距和斜率)site-sex组合层面mass与y的特定关系(截距和斜率)site层面method的特定截距
最初写的模型代码:
m <- brm(y ~ mass + # 1. 连续变量的斜率 site + sex + method + # 1. 各分类变量的截距 (1 + mass | site) + # 2. site嵌套的截距&mass斜率 (1 + mass | site + sex) + # 3. site-sex嵌套的截距&mass斜率 (1 | site + method), # 4. site-method嵌套的截距 family = gaussian(link = "identity"), data = df)
运行后报错:
Error: Duplicated group-level effects are not allowed. Occured for effect 'Intercept' of group 'site'.
知道是重复包含site导致的,但不知道怎么改才能保留所有预设关系。
错误原因
问题出在固定效应里的site和随机效应(1 + mass | site)重复定义了site组的截距:固定效应site会给每个site计算一个固定截距,而随机效应又给site组估计随机截距,brms不允许同一组的同一个效应(这里是截距)同时出现在固定和随机效应中。
修正后的模型代码
下面的代码严格对应你要的4项关系,同时避开了重复组效应的问题:
m <- brm( y ~ mass + sex + method + # 对应预设1:全局关系 (1 + mass | site) + # 对应预设2:site层面的截距&斜率变异 (1 + mass || site:sex) + # 对应预设3:site-sex组合的截距&斜率变异 (1 || site:method), # 对应预设4:site-method组合的截距变异 family = gaussian(link = "identity"), data = df )
代码对应预设关系的说明
全局关系(预设1):
mass:计算mass和y的总体平均斜率(也就是你要的全局关系)sex、method:计算这两个变量的总体平均截距效应(全局截距)- 删掉了原代码里的固定效应
site,因为site层面的截距变异已经由后面的随机效应(1 + mass | site)覆盖了,不用重复加
site层面特定关系(预设2):
(1 + mass | site):给每个site单独算截距和mass斜率,竖线|表示这些参数在不同site之间是相关的(比如某个site的截距高,斜率也可能高)
site-sex组合层面特定关系(预设3):
site:sex表示site和sex的组合组(如果sex是嵌套在site里的——比如每个site的sex类别不重复,改成site/sex更准确)(1 + mass || site:sex):给每个site-sex组合单独算截距和mass斜率,双竖线||表示这些参数之间不相关(如果需要保留相关性,改回|就行,但模型会更复杂,可能影响收敛)
site-method组合层面特定截距(预设4):
(1 || site:method):给每个site-method组合单独算截距,双竖线||同样是为了降低模型复杂度,避免不必要的参数相关性
额外提醒
- 如果
sex是嵌套在site里的结构,把site:sex换成site/sex更符合数据逻辑 - 要是想保留随机效应参数间的相关性,把
||改回|即可,但可能需要增加迭代次数或者调整先验来保证模型收敛 - 跑完模型后用
summary(m)查看结果,确认各层级的效应是否符合你的预期
内容的提问来源于stack exchange,提问作者tnt
相关产品推荐
相关产品推荐

