(真·小众软件)使用 simmr 和稳定同位素分析环境中污染物、有机物的来源

注意:

  1. 本指南展示的只是 simmr 的一个非常基本的应用,您可以将其作为一个入门指南。如需深入了解这一程序,请参阅 simmr 官网提供的操作指南。
  2. 本文只介绍 simmr 的使用方法,不深入讨论其原理(因为我也看不明白……)。
  3. 本文是笔者摸鱼的时候写的,里面会有很多不完善的地方,欢迎大家批评指正。日后笔者可能还会对本文进行更新,但考虑到近期比较紧张的工作安排,大概率是短期内不会更新了。
  4. 本文的内容……说实话是比较专业的,对路人读者可能不太友好。只能这么说,需要用的人自然会懂,看不懂的人大概率也不需要懂 :doge:

目的与情景导入

根据样品的稳定同位素组成信息,分析样品中有机物的来源。比如:

  1. 根据河水中硝酸盐的氮、氧同位素信息,确认该河流中硝酸盐的来源(土壤中的含氮有机物?生活污水?化肥?)
  2. 根据某海带养殖区海底的淤泥的碳、氮同位素信息,确认淤泥中有机物的来源(海洋中的浮游植物?陆生C3植物?陆生C4植物?海带产生的碎屑?)

数据测量

在开始分析前,我们需要测定样品的稳定同位素组成,比如碳稳定同位素 δ13C、氮稳定同位素组成 δ15N、氧稳定同位素 δ18O、氢同位素 δD。

各参数的测量方法不尽相同,这里不展开介绍。

环境准备

1 安装 R 语言

分析有机物来源的程序 simmr 是一个 R 语言程序包。使用它需要您先安装 R 语言。不同操作系统安装 R 语言的方法请参考:

2 安装 JAGS

simmr 工作时需要调用 JAGS 这个计算工具。在 Ubuntu、Debian 系统中,可执行如下命令安装 JAGS:

sudo apt install r-cran-rjags

对于 Windows 系统,请到这里下载 JAGS 的安装包(下载最新版的 JAGS-xxx.exe 即可,xxx 表示安装程序的版本号):

3 安装 simmr 和 showfont

进入 R shell,执行如下命令:

install.packagse('simmr')
install.packagse('showfont')

其中,

  • simmr 是分析物质来源的程序,也是本指南的核心
  • showfont 用于在作图时正确显示汉字

准备工作空间

接下来的演示中,我们以使用 δ13C 和 δ15N 两种稳定同位素为例开展物质来源分析进行演示。

我们需要新建一个文件夹,作为工作空间。该文件夹中需要包含如下内容:

  • mixture.csv:存放样品的稳定同位素组成信息。该文件包含 3 列,分别为
    • group:样品的分组依据,为正整数
    • d13C:样品的 δ13C 值
    • d15N:样品的 δ15N 值
    • 后面几列可以根据您实际使用的稳定同位素进行替换,如 d18O、dH 等。
    • 除了稳定同位素比值,也可以使用元素含量比值,如碳氮摩尔比(C/N),但在命名的时候需要避免使用特殊符号,因此您可以将其写成 CvsN
  • sources.csv:存放各物质来源(下文称“端元”)的稳定同位素组成信息。该文件包含 5 列,分别为
    • Sources:端元名称
    • Meand13C:某一端元的 δ13C 值
    • SDd13C:某一端元的 δ13C 值的不确定度
    • Meand15N:某一端元的 δ15N 值
    • SDd15N:某一端元的 δ15N 值的不确定度
    • 这里的 d13C、d15N 同样可以根据研究需要做适当调整,注意要和 mixture.csv 相对应。
  • myfont.ttf:一个支持汉字的字体文件,要求是 ttf 格式
  • simmr.R:R 语言脚本,用于执行分析程序

编写脚本

编辑工作文件夹下的 simmr.R,输入如下代码。每一行代码是干什么的,我都用尽可能详细的注释进行了说明。大家可以根据自己的需要酌情调整。

#!/usr/bin/Rscript

library(simmr)
library(showtext) # 该包用于在图表中显示汉字
showtext_auto() # 让程序自动处理汉字等其他字符,保障所有文本正常显示
font_add("myfont", "myfont.ttf") # 在工作目录下放一个支持中文的字体文件 myfont.ttf,在绘图时使用

# 1 加载数据
# 这里用的是软件包中提供的示例数据
mydata <- read.csv("mixture.csv")
# 样品数据,包含 3 列,其中一列为分组依据,另外两列为分析使用的代用指标。
mysources <- read.csv("sources.csv")
# 端元信息,至少包含 3 列,分别为端元名称以及两个代用指标的取值。
# 此外,还看过根据需要加上各端元值的标准偏差(不确定度)和 concentration dependence 数据。
simmr_groups <- simmr_load(
    mixtures = mydata[,c("d13C", "d15N")], # 读取样品数据表中的代用指标信息
    source_names = mysources$Sources, # 读取端元信息表中的端元值名称信息
    source_means = mysources[,c("Meand13C", "Meand15N")], # 读取端元信息表中的代用指标取值信息
    source_sds = mysources[,c("SDd13C", "SDd15N")], # 读取端元信息表中的代用指标标准偏差(不确定度)信息
    group = mydata$group # 读取样品信息表中的分组信息
)

# 2 检查数据
# 绘制数据分布图,查看数据点是否落在所有端元围成的多边形内,以确认端元选取的合理性

plot(simmr_groups) + theme(text = element_text(family = "myfont"))

# 3 启动模型
# 使用 MCMC 模式后需要进行收敛性检验,确保结果合理、有效。
simmr_groups_out <- simmr_mcmc(simmr_groups)
# 也可以直接用 FFVB 模式,则无需进行检验。
# simmr_groups_out_ffvb <- simmr_ffvb(simmr_groups)

# 4 输出结果
# 建议通过 "group = n" 参数设置一下分组,否则要么只显示第1组的计算结果,要么会给出一大堆图像。
# 输出统计分析结果表
summary(simmr_groups_out, type = "statistics", group = 1:max(mydata$group))

# 绘制概率密度分布图
plot(simmr_groups_out, type = "density", group = 1:max(mydata$group))

执行计算程序

进入工作文件夹,终端执行如下命令(Windows、Linux 皆可):

Rscript simmr.R

解读输出结果

执行上述命令后,您会看到一堆命令输出,以及得到一个 Rplot.pdf 文档。

执行脚本后,您可能会得到如下形式的输出:

Summary for 1

              mean    sd
deviance     6.549 1.321
C3植物       0.145 0.077
海洋POM      0.196 0.124
龙须菜与海带 0.282 0.184
人为污染物   0.376 0.140
sd[d13C]     0.001 0.000
sd[d15N]     0.001 0.000

其中,

  • Summary for 1 表示这是第 1 组数据的分析结果的汇总
  • 从表格第 2 行开始,每行的第 1 列表示某一来源的名称,第二列是这一来源在物质总量中所占的比例,第三列是这一计算结果的不确定度。
  • 比如根据本表,样品所含的总有机碳中,人为污染物来源有机物所占的份额为 37.6±14.0%

接下来我们看一下 Rplots.pdf,这里提供的图表在撰写报告时可能用得上。该文档的第一页大概长这个样子:

这张图主要是让我们确认端元值选取的合理性。需要注意的是,为得到可靠的结果,所有样品的数据点 必须落在代表各端元值的点围成的凸多边形内。如果有较多的点落在这一区间外,大概率是因为端元的选取不合理,比如忽略了某种重要的物质来源(举个例子,你的样品是在化工厂排污口旁边采集的,但你在设置端元的时候没有包含工业废水)。

接下来的几页大概长这样:

2025-10-14 23-33-31 创建的截图.png

x 轴表示某种来源的物质所占的份额,纵轴表示概率密度。simmr 给出的分析结果都是估算,因此我们只能说这个结果有多大的概率是多少,而不能说这个结果一定是多少。图中的峰值在哪儿,就代表这种来源的物质所占的比例最有可能是多少。

如何在论文中引用 simmr?

simmr 的官网有详细说明:

或者引用这篇发布并介绍该程序的论文:

https://onlinelibrary.wiley.com/doi/abs/10.1002/env.2221

用这个来分析一下鱼缸水体 :joy:

理论上肯定可以,但其实没什么好玩的。鱼缸这个“生态系统”太封闭了,物质流动基本上都是已知的。

至于鱼,到是可以玩玩。比如,

  1. 先确定鱼常吃的几种东西(鱼饲料、水草、小昆虫、海藻等)的稳定同位素组成
  2. 然后,再提取鱼的组织进行化验
    (传统的方法是取鱼的背部肌肉,但这样就把鱼弄死了。现在有人在研究活体取样,比如收集掉落的鱼鳞、粪便,或者向哺乳动物那样抽血化验)
  3. 最后,把鱼的稳定同位素组成和几种常见食物的稳定同位素组成输入上面那个程序,就可以得到鱼的食物组成。现在,很多生态系统的食物网结构,以及某种动物的摄食偏好,就是通过这种方法测定的。

虽然用不上,但感觉好有意思