前两天看中科院微生物所高程老师的文章:Fungal community assembly in drought-stressed sorghum shows stochasticity, selection, and universal ecological dynamics,里面有这样一个图:
仔细看了材料与方法部分才知道这是临界指示物种分析法(Threshold Indicator Taxa ANalysis
,TITAN)。这种方法经常用于分析群落在时间梯度或者是环境梯度上变化的阈值。如上图表示的是随着时间变化,不同真菌群落的阈值变化。该方法于 2010 年被开发出来:
加载示例数据
先加载 R 包和示例数据:
rm(list = ls())
library(TITAN2)
data("glades.taxa")
data("glades.env")
这个方法需要的数据有两个:
-
群落数据:示例数据是通过
log10(x+1)
进行转换过的,开发者认为通常不用进行转换。进行转换的目的是避免稀有种对群落的影响。群落数据的行为样本,列为群落丰度数据。
环境数据:可以是时间梯度,也可以是环境梯度。高程老师文章使用的是时间梯度,在示例数据中使用的是总磷含量作为环境梯度:
参数一览
默认参数:
res = titan(glades.env,glades.taxa)
完整参数:
res = titan(glades.env,
glades.taxa,
minSplt = 5,
numPerm = 999,
boot = TRUE,
nBoot = 500,
imax = FALSE,
ivTot = FALSE,
pur.cut = 0.95,
rel.cut = 0.95,
ncpus = 1,
memory = FALSE)
参数解释:
-
glades.env
:环境数据; -
glades.taxa
:群落数据; -
minSplt
:计算在突变点任一侧相关统计量的最小观察数,不能小于 3; -
numPerm
:随机置换检验的次数,不能小于 250,通常是 500 或 1000; -
boot
:是否自举重抽样; -
nBoot
:自举重抽样的得到的新数据集的数据量,小于 500 能够有效减少计算资源的消耗,但通常是 500 或 1000; -
imax
:是否用IndVal
最大值或者 z-score 来决定每个群落的阈值; -
ivTot
:是否通过平均相对丰度来计算IndVal
; -
pur.cut
:纯响应方向的阈值; -
rel.cut
:可靠响应幅度的阈值; -
ncpu
:自举重抽样部分的处理的核数; -
memory
:是否在自举重抽样的时候建立临时文件夹存放文件。
运行耗时
样品数量多少、置换检验次数、自举重抽样次数等几个因素决定了运行时长,从几分钟到几个小时不等。示例数据有 126 个样本,164 个群落数据,使用下方的代码计算运行时长:
system.time(titan(glades.env,
glades.taxa,
minSplt = 5,
numPerm = 250,
boot = TRUE,
nBoot = 500,
imax = FALSE,
ivTot = FALSE,
pur.cut = 0.95,
rel.cut = 0.95,
ncpus = 1,
memory = FALSE)
)
可以看到,耗时在 21 分钟左右。
结果可视化
老版本的可视化是这样的(图中的点代表的是临界点(突变点),点的大小代表响应强度的大小):
代码如下:
plot_taxa(glades.titan, xlab = 'Surface Water TP (ug/l)')
新的可视化方法是这样的:
- 总的:
plot_taxa_ridges(glades.titan,
xlab = expression(paste('Surface water total phosphorus ('*mu*'g/l)')))
-
Decreasers
:
plot_taxa_ridges(glades.titan,
z2 = FALSE,
xlab = expression(paste('Surface water total phosphorus ('*mu*'g/l)')))
-
Increasers
:
plot_taxa_ridges(glades.titan,
z1 = FALSE,
xlab = expression(paste('Surface water total phosphorus ('*mu*'g/l)')))