tmap数据分析基本步骤和结果解析

笔记内容

  • 以iris(鸢尾花)数据集为例,tmap各步骤input, output,结果解读,参数调整和选取。包括以下脚本:
    envfit_analysis.py
    Network_generator.py
    SAFE_analysis.py
    SAFE_visualization.py
  • 不涉及具体的算法解读,仅为走一遍数据分析流程做参考
  • 每个可执行的脚本(.py)都说明其input, output及目的
  • 小结及注意

tmap documents
tmap github

envfit_analysis.py

目的:
  1. 用到rpy2,使用R的vegan包中的方法做envfit。tmap的算法并不涉及envfit,该结果仅用于与tmap结果比较。如果不需要可以用--dont_analysis跳过。
  2. 处理input的metadata.
    默认如果metadata中的某个变量(column)缺失值占比超过60%,则删掉该变量;对于类别变量(category variable)做one-hot处理;对连续型变量用中位数填充缺失值。
    另外处理metadata的函数为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'  # 这里设置为iris,则Ouput文件名均以iris开头
                    --dont_analysis # 设置则不做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 如果设置了--dont_analysis则没有输出R的envfit分析结果
iris.envfit.data iris.csv文件
iris.envfit.dis 样本*样本的距离矩阵,可用-m设置哪种距离矩阵,默认为braycurtis
iris.envfit.metadata 处理后的metadata文件,字符变量one-hot处理,数值变量清洗并填充空值
iris.envfit.raw.metadata 原metadata

Network_generator.py

目的:

根据inputdata(这里为iris.csv)生成网络图. 下图为tmap生成网络图的简要步骤,参数设置影响着网络图对刻画和提取高维数据特征的精细程度。

参数选择的文档参考: https://tmap.readthedocs.io/en/latest/param.html
Network_generator.py -h,配合上述文档看看参数说明。

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得到的是一个.pickle的文件,通过quick_vs.py迅速看一下graph长什么样
quick_vis.py -G iris.graph 
             -O iris.html 
             -M iris_meta.csv  # 可以选择性的传个metadata, 看看某个变量在网络上的分布如何
             -col 'type'       # 指定某个变量
             -t 'categorical'  # 指定的变量是数值型(numerical)还是字符型(categorical)

input:

iris.csv (同上)

output:

iris.graph 及其log output,包含了graph的参数信息,生成了多少node和edge等。可以保存下来留做参考或debug.

Graph
Contains 91 nodes and 133 samples  
During constructing graph, 17 (88.67%) samples lost # 这里是指有88.67%的samples被留了下来,17个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]
对网络图的着色:颜色代表的是原始数值,而不是网络富集的统计学显著性(SAFE score)。对类别变量则为1和0两种着色,对连续型变量则将其原始数值map到每个点上。

SAFE_analysis.py

目的

计算每个node的SAFE (spatial analysis of functional enrichment) score

                 ↓↓↓注意这里要指定calculating mode
SAFE_analysis.py both -G iris.graph 
                      -M temp.envfit.metadata temp.envfit.data  # 可以输入多个metadata文件,包括构建.graph的data文件
                      -P SAFE    # 输出文件的开头字符
                      -i 1000    # permutation的次数
                      -p 0.05    # 计算显著性的cutoff value
                      --raw      # 最好保留中间文件
                      -v

input:

iris.graph: 即上一步得到的.graph文件
temp.envfit.metadata, temp.envfit.data : -M 可以输入多个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及其参数。SAFE SCORE以dataframe形式储存,每个node的每个feature对应着一个SAFE SCORE。参考下面的code.
SAFE_raw_enrich 保存了enrich mode的SAFE SCORE及其参数。同上。
SAFE_iris.envfit.data_enrich.csv 在enrich mode下,row均为iris.envfit.data的column name, 有6个column, 为根据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个node, 于是该dataframe有91行,对应每个node,每个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及其显著性开展的后续分析。主要实现三个分析目的:

三个分析目的实现示意图

分析目的 how 意义
ranking 即上表中SAFE enriched score: 对每个feature,求其所有具有显著性node SAFE score之和后排序 与linear regression中的effective size类似,为feature的重要性排序。ranking中SAFE score之和越大,则其对微生物组变化的贡献越大
stratification stratification是挑选出每个node SAFE score最大的feature,且通过permutation验证统计学显著性,将每个Node的enriched feature着色 ranking是从数据整体出发,看最重要的feature, stratification则是从每个node出发,找到每个node显著富集的feature。 一簇Node如果相互连接,且enriched feature一致,则可以通过node找到该feature富集的samples (subgroup).
ordination 对SAFE score做PCoA PCoA图中的点为feature, 互相靠近的feature则:在基于微生物profile的情况下,富集趋势趋于一致
# ranking: 当然你也可以直接就用 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  # 这里也可以再加一个iris_envfit.csv, 和envfit做比较。不加则如下图的ranking output 
                              -O ranking.html  

# stratification: 显示所有的显著富集feature
SAFE_visualization.py stratification -G iris.graph
                                     -S1 SAFE_raw_enrich  # 每个node的SAFE socre
                                     -O strtification.html

# stratification: 指定某一个显著富集的feature
SAFE_visualization.py stratification -G iris.graph
                                     -S1 SAFE_raw_enrich  
                                     --col 'petal length(cm)'
                                     # --allnodes 则显示所有的点对该feature的富集情况
                                     -O strtification.html

# stratification指定两个或多个feature,则--col 'XXX' 'XXXX',不需要加--allnodes

# ordination: -S2 可以放metadata和data两个文件
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的个数,legend中括号内数字为enriched的点个数
stratification_petal_length.html 右图为加了--allnodes的情况
ordination.html

小结及注意

  1. Network_generator.py构建了整个tmap分析中最基础的网络结构。在后续的分析中不会再改变这个基本结构。如果画出了很奇怪的network,建议根据数据本身的情况调整参数-r, -f等。网络图的构建参数的选择具有经验性,多多尝试 (-_-)
  2. 构建好了网络结构,网络上每一个node都是一簇基于microbiome profile(如果你的input是一个OTU table之类的丰度表)相似的样本,node之间有edge相连,则表明两个node之间有共有样本。
  3. 对于网络结构上的每一个node,都可以计算某一个feature的SAFE score。这个SAFE score量化了一种“富集程度的统计学显著性”:对该feature而言,该node周围的node,有该feature值偏高的富集趋势。通过随机混洗(permutation)打乱node在network上的位置,如果发现这种富集趋势显著不同于随机结果,则说明这种富集是有统计学意义的。
  4. SAFE_analysis.pyboth/enrich/decline三种SAFE score计算模式可以选择。enrich即第三条中说的富集程度,decline即“该node周围的node, 有该feature值偏低的富集趋势”。both则将两种模式都做了。对于微生物组研究,可以只选择enrich的方式。因为某个物种的丰度升高可能更加有意义,更能够解读生物学意义。
  5. 另外.graph中有茫茫多的属性,用pickle读入.graph之后,graph.__dir__()查看所有属性。这里例举几个常用的:
code(读入的graph用G表示) output
G.info Network_generator.py的输出,快速了解graph的基本情况
G.nodes 所有node的ID,是networkx的一个类, 用G.nodes.data()看一看
G.edges 所有的edges, 用G.edges.data()看一看
G.sample_names 所有node中的samples
G.data 所有ndoe的坐标
G.size ouput为一个dictionary,key为nodeID,value为里面包含的samples个数
G.node2sample(nodeID) 需要输入一个参数nodeID, output为该node中包含的样本ID
G.sample2node(sampleID) 需要输入一个参数sampleID, output为该sample出现的nodeID
G.show() 将网络图简单plot

目前代码仍在不断完善中,可能存在各种小bug,如有问题请大家及时同我们联系,帮助我们改进代码 orz

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容