You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在brms中指定组水平效应遇重复组效应错误的求解

解决brms模型重复组效应错误(保留所有预设关系)

问题背景

我尝试用brms建模连续变量y和连续变量mass、三个分类变量site/sex/method的关系,变量存在嵌套/组合结构,预设要捕捉的关系如下:

  1. mass与y的全局关系,以及三个分类变量的全局截距
  2. site层面mass与y的特定关系(截距和斜率)
  3. site-sex组合层面mass与y的特定关系(截距和斜率)
  4. 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. 全局关系(预设1):

    • mass:计算mass和y的总体平均斜率(也就是你要的全局关系)
    • sex、method:计算这两个变量的总体平均截距效应(全局截距)
    • 删掉了原代码里的固定效应site,因为site层面的截距变异已经由后面的随机效应(1 + mass | site)覆盖了,不用重复加
  2. site层面特定关系(预设2):

    • (1 + mass | site):给每个site单独算截距和mass斜率,竖线|表示这些参数在不同site之间是相关的(比如某个site的截距高,斜率也可能高)
  3. site-sex组合层面特定关系(预设3):

    • site:sex表示site和sex的组合组(如果sex是嵌套在site里的——比如每个site的sex类别不重复,改成site/sex更准确)
    • (1 + mass || site:sex):给每个site-sex组合单独算截距和mass斜率,双竖线||表示这些参数之间不相关(如果需要保留相关性,改回|就行,但模型会更复杂,可能影响收敛)
  4. site-method组合层面特定截距(预设4):

    • (1 || site:method):给每个site-method组合单独算截距,双竖线||同样是为了降低模型复杂度,避免不必要的参数相关性

额外提醒

  • 如果sex是嵌套在site里的结构,把site:sex换成site/sex更符合数据逻辑
  • 要是想保留随机效应参数间的相关性,把||改回|即可,但可能需要增加迭代次数或者调整先验来保证模型收敛
  • 跑完模型后用summary(m)查看结果,确认各层级的效应是否符合你的预期

内容的提问来源于stack exchange,提问作者tnt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:47:14