tmap數(shù)據(jù)分析基本步驟和結(jié)果解析

筆記內(nèi)容

  • 以iris(鳶尾花)數(shù)據(jù)集為例,tmap各步驟input, output,結(jié)果解讀便锨,參數(shù)調(diào)整和選取澜倦。包括以下腳本:
    envfit_analysis.py
    Network_generator.py
    SAFE_analysis.py
    SAFE_visualization.py
  • 不涉及具體的算法解讀,僅為走一遍數(shù)據(jù)分析流程做參考
  • 每個(gè)可執(zhí)行的腳本(.py)都說明其input, output及目的
  • 小結(jié)及注意

tmap documents
tmap github

envfit_analysis.py

目的:
  1. 用到rpy2嘹叫,使用R的vegan包中的方法做envfit嫩絮。tmap的算法并不涉及envfit丛肢,該結(jié)果僅用于與tmap結(jié)果比較。如果不需要可以用--dont_analysis跳過剿干。
  2. 處理input的metadata.
    默認(rèn)如果metadata中的某個(gè)變量(column)缺失值占比超過60%蜂怎,則刪掉該變量;對于類別變量(category variable)做one-hot處理;對連續(xù)型變量用中位數(shù)填充缺失值置尔。
    另外處理metadata的函數(shù)為tmap.api.generalprocess_metadata_beta
    inputdata(即-I后輸入的文件)在這里沒有處理派敷,只是讀入,并且確保其與metadata所含有的樣本(row)一致。
envfit_analysis.py  -I iris.csv 
                    -M iris_meta.csv 
                    -O iris_envfit.csv 
                    -tn 'iris'  # 這里設(shè)置為iris,則Ouput文件名均以iris開頭
                    --dont_analysis # 設(shè)置則不做envfit分析篮愉,僅處理metadata和data
                    --keep  # 保留output中處理后的.data, .dis及.metadata文件
                    -v
input:
# load并head一下iris.csv: 
sepal length (cm)   sepal width (cm)    petal length (cm)   petal width (cm)
0     5.1           3.5                 1.4                 0.2
1     4.9           3.0                 1.4                 0.2
2     4.7           3.2                 1.3                 0.2
3     4.6           3.1                 1.5                 0.2
4     5.0           3.6                 1.4                 0.2

# load并head一下iris_meta.csv
    type
0   setosa
1   setosa
2   setosa
3   setosa
4   setosa

output:
file what's this
iris_envfit.csv 如果設(shè)置了--dont_analysis則沒有輸出R的envfit分析結(jié)果
iris.envfit.data iris.csv文件
iris.envfit.dis 樣本*樣本的距離矩陣腐芍,可用-m設(shè)置哪種距離矩陣,默認(rèn)為braycurtis
iris.envfit.metadata 處理后的metadata文件试躏,字符變量one-hot處理猪勇,數(shù)值變量清洗并填充空值
iris.envfit.raw.metadata 原metadata

Network_generator.py

目的:

根據(jù)inputdata(這里為iris.csv)生成網(wǎng)絡(luò)圖. 下圖為tmap生成網(wǎng)絡(luò)圖的簡要步驟,參數(shù)設(shè)置影響著網(wǎng)絡(luò)圖對刻畫和提取高維數(shù)據(jù)特征的精細(xì)程度颠蕴。

參數(shù)選擇的文檔參考: https://tmap.readthedocs.io/en/latest/param.html
Network_generator.py -h泣刹,配合上述文檔看看參數(shù)說明。

Network_generator.py -I iris.csv 
                     -O iris.graph  # 生成Python3 pickle格式的graph
                     -f 'PCOA'      # 選擇降維方式犀被,default為PCOA
                     -ol 0.75       # 具體見下圖
                     -eps 95
                     -ms 3
                     -v

# Network_generator.py得到的是一個(gè).pickle的文件椅您,通過quick_vs.py迅速看一下graph長什么樣
quick_vis.py -G iris.graph 
             -O iris.html 
             -M iris_meta.csv  # 可以選擇性的傳個(gè)metadata, 看看某個(gè)變量在網(wǎng)絡(luò)上的分布如何
             -col 'type'       # 指定某個(gè)變量
             -t 'categorical'  # 指定的變量是數(shù)值型(numerical)還是字符型(categorical)

input:

iris.csv (同上)

output:

iris.graph 及其log output,包含了graph的參數(shù)信息寡键,生成了多少node和edge等掀泳。可以保存下來留做參考或debug.

Graph
Contains 91 nodes and 133 samples  
During constructing graph, 17 (88.67%) samples lost # 這里是指有88.67%的samples被留了下來西轩,17個(gè)samples被去掉了员舵。
Used params:
cluster params
n_jobs: 1
leaf_size: 30
metric: euclidean
metric_params: None
algorithm: auto
min_samples: 3
p: None
eps: 0.475659777979
=================
cover params
r: 20
overlap: 0.75
=================
lens params
lens_0:
metric: precomputed
components: [0, 1]
對網(wǎng)絡(luò)圖的著色:顏色代表的是原始數(shù)值,而不是網(wǎng)絡(luò)富集的統(tǒng)計(jì)學(xué)顯著性(SAFE score)藕畔。對類別變量則為1和0兩種著色马僻,對連續(xù)型變量則將其原始數(shù)值map到每個(gè)點(diǎn)上。

SAFE_analysis.py

目的

計(jì)算每個(gè)node的SAFE (spatial analysis of functional enrichment) score

                 ↓↓↓注意這里要指定calculating mode
SAFE_analysis.py both -G iris.graph 
                      -M temp.envfit.metadata temp.envfit.data  # 可以輸入多個(gè)metadata文件注服,包括構(gòu)建.graph的data文件
                      -P SAFE    # 輸出文件的開頭字符
                      -i 1000    # permutation的次數(shù)
                      -p 0.05    # 計(jì)算顯著性的cutoff value
                      --raw      # 最好保留中間文件
                      -v

input:

iris.graph: 即上一步得到的.graph文件
temp.envfit.metadata, temp.envfit.data : -M 可以輸入多個(gè)metadata文件

output:
file what's this
SAFE_raw_coldict 保存了iris.envfit.data, iris.envfti.metadata的column信息韭邓。import pickle后,用pickle.load(open('SAFE_raw_coldict', 'rb'))在Python中打開看看
SAFE_raw_decline 保存了decline mode的SAFE SCORE及其參數(shù)溶弟。SAFE SCORE以dataframe形式儲(chǔ)存女淑,每個(gè)node的每個(gè)feature對應(yīng)著一個(gè)SAFE SCORE。參考下面的code.
SAFE_raw_enrich 保存了enrich mode的SAFE SCORE及其參數(shù)可很。同上诗力。
SAFE_iris.envfit.data_enrich.csv 在enrich mode下凰浮,row均為iris.envfit.data的column name, 有6個(gè)column, 為根據(jù)SAFE score做的一系列summary, 詳見下面的code
SAFE_iris.envfit.data_decline.csv decline mode版本的 SAFE score summary我抠,同上
SAFE_iris.envfit.metadata_enrich.csv row均為iris.envfit.metadata的column name,同上
SAFE_iris.envfit.metadata_decline.csv row均為iris.envfit.metadata的column name,同上
import pickle

# 看看SAFE_raw_coldict
coldict = pickle.load(open('SAFE_raw_coldict', 'rb'))
print(coldict.keys())  # dict_keys('iris.envfit.metadata', 'iris.envfit.data')
print(coldict['iris.envfit.metadata']) # ['type_setosa', 'type_versicolor', 'type_virginica']

# 看看SAFE_raw_enrich
enrich = pickle.load(open('SAFE_raw_enrich','rb'))
print(enrich.keys())   # dict_keys(['params', 'data'])
enrich['data'].head() 
#  一共91個(gè)node, 于是該dataframe有91行,對應(yīng)每個(gè)node,每個(gè)feature的SAFE score
   type_setosa  type_versicolor  type_virginica  sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0     0.829397             -0.0            -0.0               -0.0          -0.00000               -0.0              -0.0
1     0.829397             -0.0            -0.0               -0.0          -0.00000               -0.0              -0.0
2     0.829397             -0.0            -0.0               -0.0           0.11586               -0.0              -0.0
3     0.829397             -0.0            -0.0               -0.0           0.30695               -0.0              -0.0
4     0.829397             -0.0            -0.0               -0.0           0.30695               -0.0              -0.0

下圖為SAFE_iris.envfit.data_enrich.csv及其解讀:

SAFE_iris.envfit.data_enrich.csv

SAFE_visualization.py

目的:

基于SAFE_analysis.py得到的SAFE score及其顯著性開展的后續(xù)分析袜茧。主要實(shí)現(xiàn)三個(gè)分析目的:

三個(gè)分析目的實(shí)現(xiàn)示意圖

分析目的 how 意義
ranking 即上表中SAFE enriched score: 對每個(gè)feature菜拓,求其所有具有顯著性node SAFE score之和后排序 與linear regression中的effective size類似,為feature的重要性排序笛厦。ranking中SAFE score之和越大纳鼎,則其對微生物組變化的貢獻(xiàn)越大
stratification stratification是挑選出每個(gè)node SAFE score最大的feature,且通過permutation驗(yàn)證統(tǒng)計(jì)學(xué)顯著性,將每個(gè)Node的enriched feature著色 ranking是從數(shù)據(jù)整體出發(fā)贱鄙,看最重要的feature, stratification則是從每個(gè)node出發(fā)劝贸,找到每個(gè)node顯著富集的feature。 一簇Node如果相互連接逗宁,且enriched feature一致映九,則可以通過node找到該feature富集的samples (subgroup).
ordination 對SAFE score做PCoA PCoA圖中的點(diǎn)為feature, 互相靠近的feature則:在基于微生物profile的情況下,富集趨勢趨于一致
# ranking: 當(dāng)然你也可以直接就用 SAFE_analysis.py中得到的SAFE summary表格自行畫圖瞎颗,比方說使用SAFE_iris.envfit.data_enrich.csv
SAFE_visualization.py ranking -G iris.graph 
                              -S2 SAFE_iris.envfit.metadata_enrich.csv  # 這里也可以再加一個(gè)iris_envfit.csv, 和envfit做比較件甥。不加則如下圖的ranking output 
                              -O ranking.html  

# stratification: 顯示所有的顯著富集feature
SAFE_visualization.py stratification -G iris.graph
                                     -S1 SAFE_raw_enrich  # 每個(gè)node的SAFE socre
                                     -O strtification.html

# stratification: 指定某一個(gè)顯著富集的feature
SAFE_visualization.py stratification -G iris.graph
                                     -S1 SAFE_raw_enrich  
                                     --col 'petal length(cm)'
                                     # --allnodes 則顯示所有的點(diǎn)對該feature的富集情況
                                     -O strtification.html

# stratification指定兩個(gè)或多個(gè)feature,則--col 'XXX' 'XXXX'哼拔,不需要加--allnodes

# ordination: -S2 可以放metadata和data兩個(gè)文件
SAFE_visualization.py ordination -S1 iris_raw_enrich 
                                 -S2 SAFE_iris.envfit.data_enrich.csv SAFE_iris.envfit.metadata_enrich.csv 
                                 -O ordination.html

input:

如代碼中所示引有。

output:
ranking.html
stratification.html node的大小表示其含有Samples的個(gè)數(shù),legend中括號(hào)內(nèi)數(shù)字為enriched的點(diǎn)個(gè)數(shù)
stratification_petal_length.html 右圖為加了--allnodes的情況
ordination.html

小結(jié)及注意

  1. Network_generator.py構(gòu)建了整個(gè)tmap分析中最基礎(chǔ)的網(wǎng)絡(luò)結(jié)構(gòu)倦逐。在后續(xù)的分析中不會(huì)再改變這個(gè)基本結(jié)構(gòu)譬正。如果畫出了很奇怪的network,建議根據(jù)數(shù)據(jù)本身的情況調(diào)整參數(shù)-r, -f等僻孝。網(wǎng)絡(luò)圖的構(gòu)建參數(shù)的選擇具有經(jīng)驗(yàn)性导帝,多多嘗試 (-_-)
  2. 構(gòu)建好了網(wǎng)絡(luò)結(jié)構(gòu),網(wǎng)絡(luò)上每一個(gè)node都是一簇基于microbiome profile(如果你的input是一個(gè)OTU table之類的豐度表)相似的樣本穿铆,node之間有edge相連您单,則表明兩個(gè)node之間有共有樣本。
  3. 對于網(wǎng)絡(luò)結(jié)構(gòu)上的每一個(gè)node荞雏,都可以計(jì)算某一個(gè)feature的SAFE score虐秦。這個(gè)SAFE score量化了一種“富集程度的統(tǒng)計(jì)學(xué)顯著性”:對該feature而言,該node周圍的node凤优,有該feature值偏高的富集趨勢悦陋。通過隨機(jī)混洗(permutation)打亂node在network上的位置,如果發(fā)現(xiàn)這種富集趨勢顯著不同于隨機(jī)結(jié)果筑辨,則說明這種富集是有統(tǒng)計(jì)學(xué)意義的俺驶。
  4. SAFE_analysis.pyboth/enrich/decline三種SAFE score計(jì)算模式可以選擇。enrich即第三條中說的富集程度棍辕,decline即“該node周圍的node, 有該feature值偏低的富集趨勢”暮现。both則將兩種模式都做了。對于微生物組研究楚昭,可以只選擇enrich的方式栖袋。因?yàn)槟硞€(gè)物種的豐度升高可能更加有意義,更能夠解讀生物學(xué)意義抚太。
  5. 另外.graph中有茫茫多的屬性塘幅,用pickle讀入.graph之后昔案,graph.__dir__()查看所有屬性。這里例舉幾個(gè)常用的:
code(讀入的graph用G表示) output
G.info Network_generator.py的輸出电媳,快速了解graph的基本情況
G.nodes 所有node的ID踏揣,是networkx的一個(gè)類, 用G.nodes.data()看一看
G.edges 所有的edges, 用G.edges.data()看一看
G.sample_names 所有node中的samples
G.data 所有ndoe的坐標(biāo)
G.size ouput為一個(gè)dictionary,key為nodeID,value為里面包含的samples個(gè)數(shù)
G.node2sample(nodeID) 需要輸入一個(gè)參數(shù)nodeID, output為該node中包含的樣本ID
G.sample2node(sampleID) 需要輸入一個(gè)參數(shù)sampleID, output為該sample出現(xiàn)的nodeID
G.show() 將網(wǎng)絡(luò)圖簡單plot

目前代碼仍在不斷完善中匾乓,可能存在各種小bug呼伸,如有問題請大家及時(shí)同我們聯(lián)系,幫助我們改進(jìn)代碼 orz

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钝尸,一起剝皮案震驚了整個(gè)濱河市括享,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌珍促,老刑警劉巖铃辖,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猪叙,居然都是意外死亡娇斩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門穴翩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犬第,“玉大人,你說我怎么就攤上這事芒帕∏干ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵背蟆,是天一觀的道長鉴分。 經(jīng)常有香客問我,道長带膀,這世上最難降的妖魔是什么志珍? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮垛叨,結(jié)果婚禮上伦糯,老公的妹妹穿的比我還像新娘。我一直安慰自己嗽元,他們只是感情好敛纲,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著还棱,像睡著了一般载慈。 火紅的嫁衣襯著肌膚如雪惭等。 梳的紋絲不亂的頭發(fā)上珍手,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼琳要。 笑死寡具,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稚补。 我是一名探鬼主播童叠,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼课幕!你這毒婦竟也來了厦坛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤乍惊,失蹤者是張志新(化名)和其女友劉穎杜秸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體润绎,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撬碟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莉撇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呢蛤。...
    茶點(diǎn)故事閱讀 40,973評論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棍郎,靈堂內(nèi)的尸體忽然破棺而出其障,到底是詐尸還是另有隱情,我是刑警寧澤涂佃,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布静秆,位于F島的核電站,受9級(jí)特大地震影響巡李,放射性物質(zhì)發(fā)生泄漏抚笔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一侨拦、第九天 我趴在偏房一處隱蔽的房頂上張望殊橙。 院中可真熱鬧,春花似錦狱从、人聲如沸膨蛮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敞葛。三九已至,卻和暖如春与涡,著一層夾襖步出監(jiān)牢的瞬間惹谐,已是汗流浹背持偏。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氨肌,地道東北人鸿秆。 一個(gè)月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像怎囚,于是被迫代替她去往敵國和親卿叽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容