
什么时候你才会发现自己明明画好了路径图却因为数据不满足多元正态分布、样本量偏小、实验里还有随机区组导致经典结构方程模型跑不动或者结果不稳定“分段结构方程模型piecewiseSEM”就是为这类场景设计的。它不试图一次拟合整个协方差矩阵而是把路径图拆成多个独立线性模型再用d-sep检验汇总整体拟合。这篇文章我会从原理讲到R语言实现给出能直接跑的流程、参数判断标准和常见排错思路。如果你经常处理“环境因子—性状—功能—结果”这类多步链条或者要做路径分析但数据来自野外调查、盆栽实验、小区试验piecewiseSEM很值得先学。下面按“为什么—原理—R实现—结果解读—排错—适用范围”的顺序拆开讲。1. 为什么需要分段SEM经典结构方程模型解决不了的场景1.1 经典SEM的三个典型限制结构方程模型的核心是同时估计一组回归关系并估计潜在变量。经典SEM常用lavaan或sem包实现通常假设变量服从多元正态分布、样本量足够大、数据由协方差结构生成。但在生态和环境观测数据里这几个条件经常不成立。第一响应变量不一定是正态。比如物种有无是二值、菌群丰度是计数、土壤酶活性是偏态分布。经典SEM要处理连续正态变量遇到非正态就只能改数据或强行近似这会带来误差。第二样本量经常不够。经典SEM需要估计的参数不少遇到小样本、多变量、多路径协方差矩阵不稳定模型收敛率和标准误都会受影响。第三随机效应不好处理。实验设计里有区块、样地、地点嵌套或者时间重复测量这些结构是经典SEM最头疼的地方之一。这三点不是piecewiseSEM独有的卖点而是它的出发点。它不追求一次性求解整个协方差矩阵而是把路径图拆成一个个独立的回归模型。每个方程可以用lm、glm、lmer、glmer、lme甚至贝叶斯模型来写。这样就绕开了“所有变量必须同分布、所有样本必须完整”的限制。1.2 分段SEM的基本思路把一个路径拆开建分段SEM的建模顺序和经典SEM不同。经典SEM是先设定整个协方差结构再一次性拟合分段SEM是先画路径图再把每条路径写成独立的回归模型最后用一个列表组合起来整体检查路径图是否与数据冲突。举个例子。假设你有一个假设链环境条件影响植物性状植物性状影响昆虫多度环境条件还可能直接影响昆虫多度。路径图有两种画法画直接路径环境条件 - 性状 - 多度环境条件 - 多度。不画直接路径环境条件 - 性状 - 多度。如果选择不画“环境条件到多度”的直接箭头那么第二个方程就不放环境变量。分段SEM会自动去检验“环境条件和多度在控制性状后是否仍然独立”。如果检验结果显示不独立说明可能遗漏一条直接路径如果独立说明当前路径图和数据没有明显冲突。这种“把关系拆开建”的好处是每个方程可以单独指定分布、连接函数、随机效应和协变量。坏处是整体拟合不再是单一协方差矩阵的卡方检验而需要用d-sep检验把各方程结果汇总。这正是下一节要讲的原理。2. 分段SEM的核心原理路径拆解和d-sep检验2.1 路径图、方程列表和基础分离集分段SEM仍然以路径图为基础。你可以把它理解成一套有向无环图箭头表示因果关系没有画箭头的关系表示“条件独立”。为了检验模型是否成立需要对路径图中所有“缺失的连接”做检验。具体做法是找出基础分离集basis set把没有直接连线的成对变量找出来再找到能阻断它们关联的最少变量集合。然后对这些变量对在控制基础分离集后检验两者是否真的无关。这个步骤在piecewiseSEM包中由dsep()和summary()自动完成。你不需要手动列所有独立性检验条件但你要理解缺失路径越多检验的变量对越多如果路径图是完全饱和的所有变量之间都画了箭头就没有缺失路径此时模型没有可证伪性Fishers C可能直接算不出来。2.2 条件独立性检验、Fishers C和AICc对基础分离集中的每一对变量用相应模型做条件独立性检验。一般做法是把其中一个变量作为响应控制条件变量看另一个变量的系数或残差相关性是否显著。把这些检验的p值组合起来就得到Fishers C统计量Fishers C -2 * sum(log(p_i))如果所有独立性条件都成立Fishers C应该服从自由度为2k的卡方分布其中k是独立性检验的数量。这里p值越大说明模型没有遗漏太多必要路径p值小于0.05则说明路径图和数据之间存在明显冲突。除了Fishers CpiecewiseSEM还会返回AICc用于比较同一套数据下的不同路径结构。AICc可以理解为“拟合越好、参数越少越占优”的指标。比较模型时AICc相差小于2通常说明模型差别不大。这个逻辑和经典SEM类似但计算方式完全不一样。经典SEM基于协方差矩阵的拟合函数分段SEM基于各独立模型的条件独立性检验。因此分段SEM不能直接和lavaan的卡方、CFI、RMSEA作数值比较。2.3 为什么分段SEM支持随机效应和非正态响应因为分段SEM的“单元”不是整个路径而是每一个方程。lmer模型可以处理区块、样地等随机效应glm模型可以处理二值、计数、比例数据甚至brms模型可以接入贝叶斯框架。你可以在一个psem对象里同时放不同分布、不同随机效应的方程。这也带来一个注意事项每个方程有不同的误差分布、数据子集和随机结构整体拟合的“标准误”不是一个统一协方差矩阵估计出来的而是各方程分别估计后再汇总。解释时要记住分段SEM得到的“整体模型”更像是一个模型套件不是单个协方差结构模型。3. piecewiseSEM的R语言实现从环境准备到模型输出3.1 安装依赖和加载包piecewiseSEM是R语言中的一个包安装方式很常规install.packages(piecewiseSEM) library(piecewiseSEM)如果你刚开始用R语言建议先确认R语言安装是否完整、R包安装路径是否可写。Windows下如果安装包时出现“had non-zero exit status”先看是不是缺少编译工具或者网络镜像源不稳定。可以考虑换一个国内镜像源再装install.packages(piecewiseSEM, dependencies TRUE)平时我一般会先把nlme、lme4、mgcv这些依赖包装好再装主包这样能省不少排查时间。装完后可以跑一个最小测试确认包能正常加载。如果你用的是RStudio注意看Console里有没有报错。很多“包明明装了却无法加载”的情况其实是R版本和包版本不匹配或者安装路径权限不够。3.2 数据准备变量、缺失值和样本量进入建模前先把手头数据整理成data.frame。变量名尽量短、不用空格、不用特殊符号。缺失值要提前处理。piecewiseSEM在计算Fishers C时可能会因为变量缺失导致样本量不一致所以最好把参与建模的变量统一处理成完整案例。如果缺失比例较高先做缺失值评估或插补不要直接跳过。样本量没有绝对标准但对于分段SEM每个方程的参数数量最好不要超过样本量的1/10到1/5。比如50个样地一个方程有5个预测变量估计会很不稳定。我自己一般先看最小方程和最大方程的样本量再决定是否合并变量或删减路径。数据整理时还要检查量纲。如果变量之间的单位差距特别大比如一个变量是0到1另一个变量是几千标准化系数会很难解释。piecewiseSEM的summary里通常有标准化估计值可以缓解这个问题但原始数据量纲仍然会影响模型数值稳定性。3.3 用psem()组合多个模型lm、glm和混合模型这是piecewiseSEM的核心操作。先逐个建好基础模型再用psem()组合成一个结构方程系统。比如library(piecewiseSEM) set.seed(123) n - 100 x1 - rnorm(n) x2 - rnorm(n) y - 0.3 * x1 0.4 * x2 rnorm(n) z - 0.5 * y rnorm(n) dat - data.frame(x1, x2, y, z) model1 - lm(y ~ x1 x2, data dat) model2 - lm(z ~ y, data dat) sem_model - psem(model1, model2) summary(sem_model)如果研究中涉及随机区组或混合效应可以改用lme4或nlmelibrary(lme4) model1 - lmer(y ~ x1 x2 (1 | site), data dat) model2 - glmer(z ~ y (1 | site), family binomial, data dat) sem_model - psem(model1, model2)这里要注意psem()中每个模型对象都要有data参数并且数据中变量名称要一致。不同模型可以使用不同子集但整体结构必须对应同一个路径图。如果你在lm公式里写了变量变换比如log(y)不要在另一个方程里又用log(y)和y混着出现这样会让路径图关系混乱。3.4 查看summary结果各路径系数和整体拟合summary(sem_model)会输出两部分。第一部分是各方程的路径系数包括响应变量、预测变量、估计值、标准误、自由度、临界比、标准化估计值。第二部分是条件独立性检验和整体拟合信息包括Fishers C、p值、AICc。看结果时我按四个顺序检查各路径是否显著、方向是否符合预期。条件独立性检验中有没有显著项。如果有p 0.05的独立性检验说明存在未建模的显著关系。Fishers C对应的p值是否大于0.05。p值小说明模型需要增加路径或调整结构。比较不同模型的AICc看哪个结构更优。如果summary里输出不完整先确认每个模型对象是否正常、是否带data参数、变量名是否一致。这类问题多数不是模型本身的问题而是数据或公式写错了。还有一个常见坑如果在psem()里放了两个方程其中一个响应变量是y另一个方程里y又作为预测变量那么数据里的y不能有缺失值否则两个方程的样本量不一致。4. 结果解读直接效应、间接效应和模型比较4.1 标准化系数和效应拆解路径系数有非标准化和标准化两种。非标准化系数保持原始单位标准化系数用标准差标度便于比较不同量纲变量。piecewiseSEM的summary输出里一般会有一列Std.Estimate这就是标准化估计值。计算间接效应时把连续路径上的标准化系数相乘。例如环境→性状→多度如果环境对性状的标准化系数是0.6性状对多度的标准化系数是0.5那么环境对多度的间接效应就是0.3。如果还同时有环境→多度直接路径就把直接效应和间接效应相加得到总效应。这个计算在路径不复杂时可以直接手算。路径较多时建议把路径矩阵写成传递闭包或者用扩展包自动计算。不要只汇报一条显著直接路径而忽略其他路径贡献。分段SEM的价值就在于能拆开多个链式关系间接效应往往才是研究假设里最想验证的部分。4.2 用AICc比较不同路径结构分段SEM的模型比较不是靠卡方差值而是靠AICc。比如你有两种理论假设一种认为环境只通过性状间接影响结果另一种认为环境还直接作用于结果。这两个模型可以分别写成不同psem对象再用AICc比较。比较前要注意两个模型必须使用同一套样本和相同的变量集合。随机效应结构尽量保持一致。缺失值处理要一致。AICc小的模型更优但相差小于2时不要过度解读。模型比较的核心是“在解释力和简洁性之间取得平衡”不是单纯追求p值显著。如果你的样本量很小AICc比AIC更稳妥因为它会额外惩罚参数数量。4.3 多组比较、交互项和自相关结构piecewiseSEM还支持多组比较。如果你有处理组和对照组想检验路径系数是否不同可以使用multigroup()函数。它会分别估计各组路径系数并比较模型结构是否一致。使用时要注意组间样本量不能相差太大否则检验效力会受影响。交互项可以直接写在回归方程里。比如lm(y ~ x1 * x2, data dat)路径图中可以把交互项作为一个变量处理但解释时要区分主效应和交互效应。交互项会显著影响路径系数如果交互项不显著建议先考虑是否简化模型。时间或空间自相关可以用nlme的广义最小二乘或混合模型处理。比如model1 - lme(y ~ x1, random ~ 1 | site, correlation corAR1(), data dat)加入相关结构可以降低自相关导致的伪显著风险但也会增加参数数量小样本时要谨慎。5. 常见问题与排查顺序报错、不收敛、结果不合理5.1 安装和包依赖问题最常见的是安装包时缺依赖或者R版本太旧。看到“unable to load shared object”这类报错先升级R再重装相关依赖包。也有可能是本地编译工具不完整。在Windows系统里R语言安装后如果缺少Rtools安装需要编译的包会失败。可以先安装Rtools或使用预编译版本。如果R包已经装好但加载时报错检查package之间是否有冲突。比如nlme和lme4都是混合模型包有时会mask函数如果代码里直接调用某个函数报错可以写成包名::函数名。5.2 数据问题缺失、共线性和样本量不足模型不收敛、系数极端大、标准误爆炸很多时候不是模型问题而是数据问题。先检查共线性。可以用方差膨胀因子或相关性矩阵看预测变量之间是否高度相关。vif(model1)如果VIF大于5或10说明某几个预测变量之间存在严重共线性。共线性会导致单个系数不稳定即使总体拟合看起来正常。缺失值导致的样本不一致也很隐蔽。分段SEM中不同方程可能有不同NA数量summary里的固定效应用到的样本可能和独立性检验用到的样本不一致Fishers C和AICc都可能失真。我建议在建模前明确用complete.cases保留完整样本再建模型。5.3 模型拟合检验不通过怎么办如果summary输出Fishers C的p值小于0.05说明路径图与数据存在冲突。这时不要急着加满所有路径。先看Tests of directed separation部分找哪些变量对的条件独立性检验显著。显著项通常提示你漏掉了一条直接路径或者漏掉了某个中间变量。调整路线有三条增加一条有理论依据的直接路径重新比较AICc。增加协变量控制混淆关系。检查是否遗漏了一个关键中间变量。修改后重新拟合再看Fishers C和AICc。如果反复调整后依旧很差可能需要回到路径图层面重新设计假设而不是继续在同一个图上加箭头。5.4 绘图不显示和函数运行异常piecewiseSEM的plot()函数依赖图形渲染包通常需要DiagrammeR或visNetwork。如果你没有安装相关包plot(sem_model)会报错或只生成脚本。最简单的办法是先安装DiagrammeR再调用plot。如果浏览器没有弹出图可以检查RStudio Viewer窗口是否被隐藏或者用export_graph导出为HTML文件查看。还有一种情况是plot能运行但图上没有数字或线条混乱。这种情况多发生在模型比较复杂时建议先简化方程或自己对图做后期布局。分段SEM的图是辅助理解不是论文唯一标准最终结果要以summary里的数值为准。6. 使用边界和落地建议什么时候用分段SEM更合适6.1 适合用分段SEM的场景如果你的研究属于下面几种分段SEM通常更顺手数据来自野外调查或实验样本量不大但变量较多。响应变量包含二值、计数、比例等非正态分布。实验设计包含区块、样地、地点等随机效应。研究重点是检验多条直接和间接路径而不是估计潜在变量。已经熟悉线性模型和混合模型不希望把所有变量塞进一个协方差矩阵。生态学里的“环境—群落—功能”链、土壤学里的“施肥—微生物—酶活—作物产量”、微生物组里的“资源—多样性—功能”分析都比较适合分段SEM。因为它允许每个方程采用最适合该变量的分布族也允许不同路径的样本量不完全一致。6.2 不适合用分段SEM的场景分段SEM不是万能的。需要估计潜在变量时比如“生态系统稳定性”这种不能直接测量的概念经典SEM或潜变量模型更合适。路径图特别复杂且样本量足够大时经典SEM的整体拟合检验、修正指数等工具更成熟。此外如果你的数据本来就能满足多元正态假设经典SEM的结果更容易被审稿人接受因为它的检验逻辑更直接。分段SEM的“整体拟合”依赖d-sep检验和AICc不等于经典SEM的全局协方差拟合。一些审稿人可能不熟悉你需要清楚解释这些指标的含义。如果非要用分段SEM论文方法部分要把方程列表、随机效应、独立性检验、Fishers C和AICc都写清楚。6.3 给学习者和实际项目作者的检查清单我自己在实际项目里会留一份检查清单你可以直接参考路径图是否画清楚每条箭头是否有理论依据。每个方程是否指定了合适的分布和连接函数。随机效应是否正确对应实验设计。数据是否处理成完整案例变量名是否统一。是否检查了共线性和样本量。summary里各个路径是否与路径图对应。Tests of directed separation是否有显著项。Fishers C的p值是否大于0.05。是否用AICc比较了候选模型。结果中是否区分了直接效应、间接效应和总效应。论文或报告里是否写明了软件版本和函数版本方便别人复现。分段SEM并不是要替代经典SEM而是给多样化的研究数据提供更自由的建模方式。如果你正在处理非正态、小样本、有随机效应的生态或环境数据它大概率比硬套lavaan更合适。落地时最该盯住的不是功能列表而是数据完整性、方程设定和独立性检验结果。一次跑通并不难难的是让路径结构经得起数据检验。