使用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
相关产品推荐
相关产品推荐

