【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)

在生态水文学与环境地学研究中,利用氢氧稳定同位素解析植物水分吸收来源(土壤不同剖面水、地下水、降水、地表水)或河流补给组成已成为标准范式。

传统的多元线性混合模型(如 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)

四、 常见运行故障排查指南

  1. Error: Invalid Parent Value / Negative Variance

    • 成因:部分水源数据存在单个极值,或方差为 0(仅 1 个样点)。

    • 解决 :检查 source-2026-5.csv,确保每个源至少有 3 个以上的有效重复采样,且标准差大于 0。

  2. Gelman-Rubin \hat{R} > 1.1(模型未收敛)

    • 成因:采样步长不足,或两个潜在水源的同位素签名高度重叠(共线性严重)。

    • 解决 :首先将 run = "normal" 调整为 "long"。若依然不收敛,需在数据准备阶段利用聚类分析(如 K-Means 或单因素方差分析)将同位素特征相似的两个水源进行合并(例如浅层土壤水与中层土壤水合并)。

  3. 输出图表文字乱码或保存失败

    • 成因:R 工作路径含有中文字符或输出目录缺少写入权限。

    • 解决 :建议将工作目录设为纯英文路径,并在执行前确认文件夹内旧版 MixSIAR_model.txt 拥有覆盖权限。

相关推荐
有点小困97725 分钟前
Spring Boot 异步任务 ClassLoader 踩坑实录:ClassNotFoundException 的诡异真相
java
aiks_yuan28 分钟前
Java 正则表达式很慢怎么办:Pattern 预编译只快 2~5 倍,真正卡死线程的是回溯(JDK 8、11、17 实测)
java
用户37215742613530 分钟前
C# 填写 PDF 交互式表单:文本框、复选框、单选按钮和下拉列表
java
IT枫斗者枫哥33 分钟前
Java 退款请求超时,先查原单还是重试?
java·后端
特立独行的猫A37 分钟前
我用仓颉写了个多平台发文工具:一份 Markdown,一条命令发六个平台
java·后端·python
ikgy1 小时前
JAVA EE:1.计算机是如何工作的
java·java-ee
.痞老板.2 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦2 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
青梅味猪大肠2 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统