前兩天看中科院微生物所高程老師的文章: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)')))