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

使用piecewiseSEM+glmmTMB做d分离测试指定方向时出错,是bug吗?

使用piecewiseSEM结合glmmTMB指定路径方向时出现错误的排查

问题描述

我正在用计数数据做结构方程模型(SEM)分析,采用piecewiseSEM包(2.30版本)搭配glmmTMB包(1.1.8-9000版本)拟合路径。此前模型拟合正常,但在解决基础集的方向性冲突时,针对glmmTMB路径指定方向的操作出现错误,用glmer、glm等其他包则可正常运行。更换多版本仍无法解决,附上可复现代码,想确认这是bug还是操作疏漏?

可复现代码

require(piecewiseSEM)
require(glmmTMB)

simData = data.frame(sp1 = runif(300),
                     sp2 = rpois(300, 3),
                     sp3 = rpois(300, 5),
                     sp4 = rpois(300, 1))

# Model structure:
#      sp2
#sp1 <     > sp4
#      sp3
    
SEM <- psem( 
  glmmTMB(sp2 ~ sp1, family = poisson, data = simData),
  glmmTMB(sp3 ~ sp1, family = poisson, data = simData),
  glmmTMB(sp4 ~ sp2 + sp3, family = poisson, data = simData),
  data = simData)

basisSet(SEM)

summary(SEM) # 此处会显示冲突

summary(SEM, direction = c("sp3 <- sp2")) # 错误发生在这里

错误信息

在str2lang(x)中出错: :2:0: 意外的输入结束
1: . ~ sp3 + sp2 + sp1 +
^

问题分析与解决

这是piecewiseSEM针对glmmTMB模型的兼容性bug,并非操作疏漏。原因是piecewiseSEM在解析glmmTMB模型公式、生成方向指定检验的临时模型时,公式拼接逻辑出错,导致末尾多了一个多余的+号,触发了str2lang的语法解析错误。而glm/glmer等模型包的公式解析逻辑与glmmTMB不同,因此没有触发该问题。

临时修复方法

手动调整冲突路径对应的模型,重新构建SEM对象:

# 重新拟合sp3模型,加入sp2作为预测变量(对应sp3 <- sp2的方向)
mod_sp3 <- glmmTMB(sp3 ~ sp1 + sp2, family = poisson, data = simData)
# 重新构建SEM对象
SEM_fixed <- psem(
  glmmTMB(sp2 ~ sp1, family = poisson, data = simData),
  mod_sp3,
  glmmTMB(sp4 ~ sp2 + sp3, family = poisson, data = simData),
  data = simData
)
# 查看修正后的结果
summary(SEM_fixed)

这种方式绕过了piecewiseSEM自动处理方向指定的逻辑,手动修正模型结构以解决冲突。

长期解决方案

向piecewiseSEM的官方仓库提交issue,附上你的可复现代码和错误信息,推动开发者修复这个针对glmmTMB的兼容性问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:57:23