单细胞数据分析之蛋白活性推断篇

作者,Evil Genius

世事无常

315打假日

2月26日获知家里电信诈骗,到今日过去了17天,从一开始的震惊,到冷静也仅用了3天, 我特别感谢那些帮助了我的人,很多人无偿捐助了我。

很多人都还是学生,将来都会走向社会,进入岗位,其中有一些人也会遇到很大的挫折,我希望大家遇到挫折的时候可以想起我,我这么倒霉的情况下,依然要相信,生活还是很美好的,大多数人的挫折比起我来,也就不再是挫折了。

今天我们来分享一个关于蛋白活性推断的内容,最近一段时间因为一篇文章的发表,运用基因表达来推断蛋白活性,文章在Single-cell protein activity analysis identifies recurrence-associated renal tumor macrophages,杂志 Cell,顶刊,其中就用到了单细胞转录组数据来推断蛋白活性,其中用到的软件是viper,2021年5月的一个软件,值得关注。

推断原理

VIPER(Virtual Inference of Protein-activity by Enriched Regulon analysis)算法允许在单个样本的基础上,从基因表达谱数据计算蛋白质活性推断。它利用最直接受特定蛋白质调控的基因表达,如转录因子(TF)的靶标,作为其活性的准确推断手段。

viper实现了一种专门用于估计调控活性的算法,该算法考虑了调节子的作用模式, regulator-target gene相互作用的可信度和每个靶基因调控的多效性。

VIPER在这个包中提供了两种推断方法:多样本版本(msVIPER)设计用于基于多个样本或表达谱的基因表达特征,以及单样本版本(VIPER),它在逐个样本的基础上估计相对蛋白质活性,从而允许将典型的基因表达矩阵(即多个样本中的多个mRNA)转换为蛋白质活性矩阵,表示每个样本中每个蛋白质的相对活性

看一下实例代码

安装,其中bcellViper提供了示例数据和需要的调控网络作为参考
if (!requireNamespace("BiocManager", quietly=TRUE))
+ install.packages("BiocManager")
BiocManager::install("mixtools")
BiocManager::install("bcellViper")
BiocManager::install("viper")
Getting started
library(viper)
Generating the regulon object

需要输入两个文件

  • gene expression signature
  • an appropriate cell context-specific regulatory network. This regulatory network is provided in the format of a class regulon object
调控文件通常是由 ARACNe的输出文件产生的,我们来看一下分析过程:
  • 由于ARACNe的资源消耗问题,所有对于单细胞数据针对每个cluster进行计算

  • 为了生成准确的、鲁棒性好的ARACNe network,ARACNe需要输入表达矩阵中细胞的大部分转录结构相同的数据。对于单细胞转录组数据而言,这需要在生成ARACNe network之前将数据中的细胞进行clustering。这个cluster可以通过多种方式获取:任何一种用于单细胞聚类分群的方法都可以,也可以是简单的通过前几个主成分进行的简单聚类分群。PISCES包中的Clustering方法有:Partition Around Medioids (PAM), Multi-Way K-Means, and Louvain with Resolution Optimization。PISCES软件使用的是基于Seurat与PISCES R Package 对数据进行的two step optimize resolution cluster:所有的clustering step均分两步完成。Seurat中FindNeighbors与FindClusters函数使用的是Louvain算法,这种算法的缺陷是会导致过度分群。因此,在0.01 ~ 1.0的分辨率(resolution)范围内进行聚类以0.01为间隔,并在每个分辨率值上评估聚类质量,以在此范围内选择最佳的聚类方式。对于每个分辨率值(resolution),将cluster中的细胞数再次取样至1000,并计算这1000个细胞及其cluster标签的silhouette score。对于基因表达数据,Pearson correlation被用于细胞距离矩阵(就是用CorDist函数算出来的dist.mat)被用于计算silhouette score。对于VIPER推断出来的蛋白活性数据,VIPER包中的ViperSimilarity函数计算出的distance metric被用于计算silhouette score。这个过程会针对这1000个细胞随机进行100次,然后得出一个针对一个resolution的mean and standard deviation of average silhouette score。选择使平均silhouette score最大化的最高resolution值作为对数据进行聚类而不过度聚类的最佳resolution。
    Clustering完成后就可以产生meta-cells用于输入ARACNe:将cluster中距离最近的10个细胞的reads相加后进一步re-normalizing,生成一个具有250个sample的矩阵用于后续ARACNe(这个地方操作起来有点复杂,资源可以的话将所有细胞输入进行计算)
    如果在数据集中的不同细胞类型已经进行了定义和注释,那么cell-type specific networks可以基于细胞注释得出。然而,由于无监督下的(无细胞定义与注释)PISCES 计算可以进一步确认实验的设计是否有问题并可能进一步得出新的生物学发现,因此推荐无监督下的PISCES 计算。这里大家就用定义好的Seurat分群就可以了。

# Seurat clustering
sce.combined.sct <- RunPCA(sce.combined.sct, verbose = FALSE)
sce.combined.sct <- RunUMAP(sce.combined.sct, dims = 1:30, verbose = FALSE)
sce.combined.sct <- FindNeighbors(sce.combined.sct, dims = 1:30, verbose = FALSE)
sce.combined.sct <- FindClusters(sce.combined.sct, method = "igraph" ,verbose = FALSE)

这样的话,抽取每个cluster的矩阵进行下游推断即可,如果cluster的细胞数过多,则需要下采用或者合并。

ARACNe-network generation

从这里开始ARACNe-AP的教程,这部分内容可以基于windows平台的Terminal或者linux平台完成,这里使用的是linux平台,方法大同小异。

mkdir JAVA_JDK#创建JAVA安装位置
mkdir ANTs    #创建ANTs安装位置
  • 将下载好的JDK与ANTs安装文件分别传送至服务器的“/JAVA_JDK”与“/ANTs”文件夹中
  • 安装软件:分别进入到/JAVA_JDK”与“/ANTs”文件夹中,解压文件
tar -zxvf /your/pathway/to/apache-ant-1.9.14-bin.tar.gz
tar -zxvf /your/pathway/to/jdk-8u131-linux-x64.tar.gz
  • 配置环境文件,进入到个人目录下
    vi .profile #使用文本编辑器打开并编辑“.profile”文件

  • 分别为JAVA与ANT增加环境变量,编辑一下内容加入到“.profile”文件

export JAVA_HOME=/YOUR/PATHWAY/TO/jdk1.8.0_211 
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/ 
export PATH=$PATH:$JAVA_HOME/bin

export ANT_HOME=/YOUR/PATHWAY/TO/apache-ant-1.9.15/
export PATH=$ANT_HOME/bin:$PATH

  • 进入ARACNe工作目录,检查JAVA与ANT是否安装成功, 如果安装成功输入以下命令会弹出详细版本号
source .profile
java -version
ant -version
  • 构建JAVA需要的aracne.jar文件
ant main
  • 构建ARACNe-network需要两个文件:表达矩阵(Matrix)与基因列表(list),注意表达矩阵中使用ensembl ID,那么基因列表也需要是ensembl ID, 如果矩阵中使用gene symble,那么基因列表也需要是gene symble。这两个文件都放在ARACNe-AP-master.zip解压后的test文件夹中,运行参数中的文件名一定要与你文件夹中的文件名一致,否则java在调用这个文件的时候会报错
  • 表达矩阵:单细胞基因表达矩阵,txt格式;
  • 基因列表:使用PISCES作者给的:"tfs-hugo.txt", COTFs-"cotfs-hugo.txt",Signaling Proteins-"sig-hugol.txt",因为是三个基因集(文件可以在PISCES作者的github上下载:https://github.com/califano-lab/PISCES/tree/master/data,这里除了有上述提到的3个基因集,还有一个surface基因集,演示过程没有使用),因此针对每一个cluster的表达矩阵都需要跑三遍ARACNe流程,再将最后的三个文件合并成一个,即得到这个cluster的ARACNe-network 。当然基因集可以合并
#Step1 Calculate threshold with a fixed seed
java -Xmx5G -jar dist/aracne.jar -e 单细胞cluster矩阵txt  -o outputFolder --tfs test/tfs.txt --pvalue 1E-8 --seed 1 \--calculateThreshold
#Step2: Run ARACNe on a single bootstrap
java -Xmx5G -jar dist/aracne.jar -e 单细胞cluster矩阵txt  -o outputFolder --tfs test/tfs.txt --pvalue 1E-8 --seed 1
#Step3: Run 100 reproducible bootstraps
for i in {1..100}
do
java -Xmx5G -jar dist/aracne.jar -e 单细胞cluster矩阵txt  -o outputFolder --tfs test/tfs.txt --pvalue 1E-8 --seed $i
done
#Step4: Consolidate bootstraps in the output folder
java -Xmx5G -jar dist/aracne.jar -o outputFolder --consolidate
#Step5: Run a single ARACNE with no bootstrap and no DPI
java -Xmx5G -jar dist/aracne.jar -e 单细胞cluster矩阵txt  -o outputFolder --tfs test/tfs.txt --pvalue 1E-8 --seed 1 \ --nobootstrap --nodpi
#Step6: Consolidate bootstraps without Bonferroni correction
java -Xmx5G -jar dist/aracne.jar -o outputFolder --consolidate --nobonferroni

  • 最后在当前工作目录下进入“outputFolder", 里面的”network.txt“就是要的结果,我们将一个矩阵针对tfs-hugo.txt、cotfs-hugo.txt、sig-hugol.txt的三次运行结果合并在一起,并使用文本打开network.txt文件,将其表头“Regulator Target MI pvalue”删除,保存后修改文件后缀为tsv,就可以将其输入RegProcess()函数了。最终得到的文件就是这个矩阵的ARACNe-network,几个矩阵就有几个ARACNe-network。

  • 然后将输出结果中的 .adj file和基因表达矩阵,转换成 regulon object.

Protein activity based clustering analysis
构建的ARACNe-network通过RegProcess()函数将每一个cluster的ARACNe-network文件(pisces-1-net-final.tsv)与其相应的表达矩阵基因表达矩阵(MetaCells函数生成的表达矩阵)进行综合并生成一个调节子对象文件(pisces-1-net-pruned.rds)。

RegProcess <- function(a.file, exp.mat, out.dir, out.name = '.') {
  require(viper)
  processed.reg <- aracne2regulon(afile = a.file, eset = exp.mat, format = '3col')
  saveRDS(processed.reg, file = paste(out.dir, out.name, 'unPruned.rds', sep = ''))
  pruned.reg <- pruneRegulon(processed.reg, 50, adaptive = FALSE, eliminate = TRUE)
  saveRDS(pruned.reg, file = paste(out.dir, out.name, 'pruned.rds', sep = ''))
}
#针对每个cluster(3个为例)
RegProcess('pisces-1-net-final.tsv', mat1, out.dir = 'tutorial/', out.name = 'pisces-1-net-')
RegProcess('pisces-2-net-final.tsv', mat2, out.dir = 'tutorial/', out.name = 'pisces-2-net-')
RegProcess('pisces-3-net-final.tsv', mat3, out.dir = 'tutorial/', out.name = 'pisces-3-net-')

#RegProcess()函数生成的文件保存为rds格式,先使用readRDS()函数读进来。
c1.net <- readRDS('pisces-1-net-pruned.rds')
c2.net <- readRDS('pisces-2-net-pruned.rds')
c3.net <- readRDS('pisces-3-net-pruned.rds')
#使用list()函数构建net.list文件
net.list<-list(c1.net,c2.net,c3.net)

## viper and protein-activity based clustering
## net.list here would be a list of networks generated from ARACNe
sce.combined.sct <- AddProteinAssay(sce.combined.sct)#将Seurat对象里的count矩阵拿出来命名为PISCES,然后放回到Seurat对象里去,并设置为当前默认的active.assay
sce.combined.sct <- CPMTransform(sce.combined.sct)#针对PISCESassay进行CPMTransform()、GESTransform()标准化。
sce.combined.sct <- GESTransform(sce.combined.sct)
sce.combined.sct <- PISCESViper(sce.combined.sct, net.list)#蛋白活性推断

推断出最终的VIPER矩阵(蛋白活性矩阵),就可以对细胞重新进行clustering。VIPER结果通常允许分辨出更小的、转录上更不同的cluster。然后这些cluster可以被用于鉴定master regulator protein。也可以运用蛋白矩阵进行下游的再分析以及更多的个性化分析。

左:差异基因热图;右:差异蛋白表达热图

生活很好,有你更好。

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

推荐阅读更多精彩内容