在生态水文学与环境地学研究中,利用氢氧稳定同位素解析植物水分吸收来源(土壤不同剖面水、地下水、降水、地表水)或河流补给组成已成为标准范式。
传统的多元线性混合模型(如 IsoSource)仅能进行质量守恒方程求解,无法显式纳入潜在水源的均值/方差不确定性,更无法根据先验信息进行概率推断。MixSIAR 基于 JAGS(Just Another Gibbs Sampler)马尔可夫链蒙特卡洛(MCMC)框架,支持同时考虑混合物个体变异、源的不确定性、分馏效应及嵌套随机效应,是目前同位素源解析领域最权威的工具之一。
本文结合一套典型的双同位素无协变量溯源脚本,逐行拆解数据输入、误差结构选取、MCMC 运行到结果判读的完整逻辑,并修复常见路径覆盖与参数冗余问题。
核心逻辑:所有混合物(木质部水或受体水)在空间中的同位素特征,必须落在所有潜在补给源构成的凸包(Convex Hull)多边形内部,模型计算的贡献率后验概率才具备物理意义。
一、 分析流程与核心架构
整个水同位素溯源分析在 R 环境下的核心执行链条如下:
+-----------------------------------------------------------+
| 1. 环境准备与数据加载:受体 (Mix)、潜在水源 (Source)、分馏 (TET) |
+-----------------------------------------------------------+
↓
+-----------------------------------------------------------+
| 2. 几何空间有效性校验:calc_area() 凸包面积与混合空间检验 |
+-----------------------------------------------------------+
↓
+-----------------------------------------------------------+
| 3. 贝叶斯模型架构配置:选择 Process Error 与构建 JAGS 文件 |
+-----------------------------------------------------------+
↓
+-----------------------------------------------------------+
| 4. 执行 MCMC 采样:设定收敛链长 (Normal/Long) 与平权先验 |
+-----------------------------------------------------------+
↓
+-----------------------------------------------------------+
| 5. 后验推断与诊断:Gelman-Rubin (R-hat < 1.05) & 密度图导出 |
+-----------------------------------------------------------+

二、 核心代码逐段拆解与技术要点
1. 混合物数据加载(load_mix_data)
R
library(MCMCpack)
library(coda)
library(MixSIAR)
# 设置工作空间并指定受体混合物文件路径
setwd("E:/Istobe/202508_09/5")
mix.filename <- "con-2026-5.csv"
mix <- load_mix_data(filename = mix.filename,
iso_names = c("d2H", "d18O"),
factors = NULL,
fac_random = NULL,
fac_nested = NULL,
cont_effects = NULL)
-
iso_names = c("d2H", "d18O"):指定 CSV 中用于运算的示踪同位素波段列名,必须与数据表头完全一致。 -
协变量参数设置 :若仅对单批次样品进行总体源贡献率求解,
factors(固定/随机分类因子)与cont_effects(连续协变量,如采样时间、土壤深度等)均设为NULL。
2. 潜在补给源数据加载(load_source_data)
R
source.filename <- "source-2026-5.csv"
source <- load_source_data(filename = source.filename,
source_factors = NULL,
conc_dep = FALSE,
data_type = "raw",
mix = mix)
-
conc_dep = FALSE(关键参数) :在碳、氮生态食性分析中,不同食物资源的 C/N 元素浓度不同,必须开启浓度依赖(Concentration Dependence);但在水同位素研究 中,所有水样介质本质均为纯水(100% \\text{H}_2\\text{O}),因此必须设置为FALSE。 -
data_type = "raw":如果提供的 CSV 包含所有实测样本记录(每一行代表一个采样瓶),选"raw",MixSIAR 会自动计算均值与协方差矩阵;若文件直接提供各个源的统计值(Mean, SD, n),则需切换为"means"。
3. 同位素分馏/富集因子加载(load_discr_data)
R
discr.filename <- "TET.csv"
discr <- load_discr_data(filename = discr.filename, mix = mix)
-
TET(Trophic Enrichment / Fractionation Factor)的作用 :对于大多数植物根系吸水过程,通常假设木质部水分吸收不发生同位素分馏 。在此假定下,
TET.csv中各水源对于 \\delta\^2\\text{H} 和 \\delta\^{18}\\text{O} 的均值(Mean)与标准差(SD)应均设为0。 -
若涉及干旱区超旱生植物(存在根际或茎干水气界面分馏)或地表蒸发混合,可在该表中赋予对应的同位素富集矫正值及不确定度。
4. 混合空间几何凸包检测(calc_area)
R
library(splancs)
if (mix$n.iso == 2) {
calc_area(source = source, mix = mix, discr = discr)
}
-
数学机理 :利用
splancs空间多边形库,以潜在水源同位素平均值(叠加分馏修正后)构建双同位素相图上的凸包,并计算受体投影分布的多边形面积占比。 -
质量控制标准:如果控制台输出显示大量混合物样品落在水源凸包外部,说明当前的潜在源存在遗漏(例如未考虑深层地下水或运移滞后水),强行计算会导致后验概率出现边界极值偏差。
5. 误差模型构造与 JAGS 代码生成
R
model_filename <- "MixSIAR_model.txt"
resid_err <- FALSE
process_err <- TRUE
write_JAGS_model(model_filename, resid_err, process_err, mix, source)
MixSIAR 支持三种误差模型设定:
| 误差模型 | 参数配置 | 适用场景 |
|---|---|---|
| 仅过程误差(Process Only) | process_err = TRUE, resid_err = FALSE |
潜在水源自身同位素变异较大,受体样本相对均一的水源解析(水文推荐) |
| 仅残差误差(Residual Only) | process_err = FALSE, resid_err = TRUE |
水源信号固定不变,受体个体生理变异占主导 |
| 嵌套复合误差(Multiplicative) | process_err = TRUE, resid_err = TRUE |
样本量充足、包含复杂多级随机效应的复合生态网络 |
6. 贝叶斯 MCMC 采样与参数调优
R
jags.1 <- run_model(run = "normal",
mix = mix,
source = source,
discr = discr,
model_filename = model_filename,
alpha.prior = 1,
resid_err = resid_err,
process_err = process_err)
-
run = "normal":定义 MCMC 迭代规格。-
"test":链长 1,000,仅用于验证语法是否报错; -
"normal":3 条链,每条链采样 100,000 次,预烧期(burn-in)50,000,抽稀率(thin)50; -
若模型诊断未收敛,需升级为
"long"(300,000 次)或"very long"。
-
-
alpha.prior = 1:采用对称无信息狄利克雷分布(Dirichlet prior),赋予各个水源初始相同的先验贡献权重。若已有水文计量先验数据,可传入自定义向量进行加权约束。
7. 导出模型统计诊断(output_JAGS)
R
output_JAGS(jags.1, mix, source)
函数运行完毕后,控制台与输出目录会生成核心统计结果:
-
Gelman-Rubin 诊断(\\hat{R}) :所有参数的 Point estimate 和 97.5% 分位数必须 小于 1.05(通常不能超过 1.1),以确保多链充分收敛。
-
Geweke 检验:检验各链前期与后期均值是否一致,绝对值 Z \< 1.96 表明状态平稳。
-
后验分布分位数表:提供各水源贡献率的 Mean、SD、2.5%、50%(中位数)和 97.5% 置信区间。
三、 脚本优化与规范化重构
在原始代码中,多次出现重复定义 mix.filename 并覆盖变量,以及残留系统内置测试路径 system.file(...) 的情况。整理后的整洁工程版本如下:
R
# ==============================================================================
# MixSIAR 氢氧同位素溯源标准分析脚本
# ==============================================================================
library(MCMCpack)
library(coda)
library(splancs)
library(MixSIAR)
# 1. 设定主工作目录及输入文件
data_dir <- "E:/Istobe/202508_09/5"
setwd(data_dir)
file_mix <- "con-2026-5.csv" # 受体/混合物
file_source <- "source-2026-5.csv" # 潜在水源
file_discr <- "TET.csv" # 分馏系数
# 2. 数据载入与格式校验
mix <- load_mix_data(filename = file_mix,
iso_names = c("d2H", "d18O"),
factors = NULL,
fac_random = NULL,
fac_nested = NULL,
cont_effects = NULL)
source <- load_source_data(filename = file_source,
source_factors = NULL,
conc_dep = FALSE, # 水同位素固定为 FALSE
data_type = "raw",
mix = mix)
discr <- load_discr_data(filename = file_discr, mix = mix)
# 3. 几何多边形混合空间检验
if (mix$n.iso == 2) {
message(">>> 正在检验受体样品与潜在水源的混合空间覆盖度...")
calc_area(source = source, mix = mix, discr = discr)
}
# 4. 构建并写入 JAGS 贝叶斯模型
model_file <- "MixSIAR_model.txt"
resid_err <- FALSE
process_err <- TRUE
write_JAGS_model(model_file, resid_err, process_err, mix, source)
# 5. 执行 MCMC 迭代采样 (如遇不收敛可切换为 "long")
jags.1 <- run_model(run = "normal",
mix = mix,
source = source,
discr = discr,
model_filename = model_file,
alpha.prior = 1,
resid_err = resid_err,
process_err = process_err)
# 6. 导出收敛诊断与后验贡献率图表
output_JAGS(jags.1, mix, source)
四、 常见运行故障排查指南
-
Error: Invalid Parent Value / Negative Variance
-
成因:部分水源数据存在单个极值,或方差为 0(仅 1 个样点)。
-
解决 :检查
source-2026-5.csv,确保每个源至少有 3 个以上的有效重复采样,且标准差大于 0。
-
-
Gelman-Rubin \hat{R} > 1.1(模型未收敛)
-
成因:采样步长不足,或两个潜在水源的同位素签名高度重叠(共线性严重)。
-
解决 :首先将
run = "normal"调整为"long"。若依然不收敛,需在数据准备阶段利用聚类分析(如 K-Means 或单因素方差分析)将同位素特征相似的两个水源进行合并(例如浅层土壤水与中层土壤水合并)。
-
-
输出图表文字乱码或保存失败
-
成因:R 工作路径含有中文字符或输出目录缺少写入权限。
-
解决 :建议将工作目录设为纯英文路径,并在执行前确认文件夹内旧版
MixSIAR_model.txt拥有覆盖权限。
-