SCENIC-转录因子分析

今天写一篇关于单细胞转录因子的分析-scenic
在做分析之前你应该看一下这篇文献,看看别人做了什么scenic分析
《Single-cell RNA sequencing highlights the role of inflammatory cancer-associated fibroblasts in bladder urothelial carcinoma》

分析原理

对于这个包我想发表一下感想,这个包刚开始对于我来说比较难理解,其实跟着官方教程running无非就是debug而已,这没啥,重要的是这个分析做了些啥,最后得到啥,我能讲啥,这是最难的,反正我是不敢做那些我自己都不了解过程的分析,所以首先我们要了解这个包的分析流程:
GENIE3或GRNBoost→RcisTarget→AUCell(所以首先你得先了解这三个包做了啥,不过不太想了解也可以往后看,我会讲讲我的理解,希望对你们有所帮助)

1.使用GENIE3或GRNBoost(Gradient Boosting)基于共表达推断转录因子与候选靶基因之间的共表达模块
https://www.jianshu.com/p/d71dcd4cff5a (可以学一下这个包,体验一下,或许我理解的不对哈)
是不是看到这个就头大 ,所有的教程都是这样,其实简单的说第一步推断出转录因子(TF)与其作用的靶点/gene(一个转录因子可能调控很多的gene哈)

2.RcisTarget对每个共表达模块进行顺式调控基序(cis-regulatory motif)分析
https://www.jianshu.com/p/c9df97f9e6e0 (RcisTarget包)
由于GENIE3模型只是基于共表达,会存在很多假阳性和间接靶标,为了识别直接结合靶标(direct-binding targets),使用RcisTarget对每个共表达模块进行顺式调控基序(cis-regulatory motif)分析。进行TF-motif富集分析,识别直接靶标。(仅保留具有正确的上游调节子且显著富集的motif modules,并对它们进行修剪以除去缺乏motif支持的间接靶标。)这些处理后的每个TF及其潜在的直接targets gene被称作一个调节子(regulon),所以第二步就得到了转录因子(TF)与其对应的直接作用的靶点(targets genes),并且称为regulon(所以每一个regulon都是1个TF和这个TF调控的的targets genes)

3.使用AUCell算法对每个细胞的每个regulon活性进行打分
https://www.jianshu.com/p/6a6705f12842(AUCell包)
对于一个regulon来说,比较细胞间的AUCell得分可以鉴定出该regulon在哪种细胞显著更高的,这将确定regulon在哪些细胞中处于"打开"状态。简单来说第三步得到了每一个细胞对每一个regulon的得分,通过得分我们可以知道每一个细胞的每一个regulon的激活情况,即TF的激活情况

所以综上所得,我的浅显的认知:SCENIC能让我们知道每一个细胞他们不同的TF激活情况,不要跟RcisTarget包弄混了,虽然都是得到都是TF的差异,但是RcisTarget包是通过二者的差异基因来判断是什么TF造成的,而SCENIC是能够得出每一个细胞的TFs的激活情况。
ok 关于分析流程就将到这,当然这只是我个人浅显的理解,更标准,正派解释的还是要看原文献和各个生物信息学大佬的解释哈。(欢迎大家讨论与批评)

分析流程(R+linux)

我用过单纯R跑,超级慢,并且跑不出来,所以看别人的教程写着用linux+R一起
1.在R语言中获得单细胞的表达矩阵 scRNA是我自己的Seurat对象哈

write.csv(t(as.matrix(scRNA@assays$RNA@counts)), file = "scRNA.csv")
#提取表达矩阵,并命名为scRNA.csv,注意矩阵一定要转置,不然会报错

2.从这里就要转战场去linux了,莫慌,学就是了
个人的linux学习流程:
1.https://www.bilibili.com/video/BV1pE411C7ho?p=42&spm_id_from=333.880.my_history.page.click
2.https://www.bilibili.com/video/BV1ds411g7eg?p=7&spm_id_from=333.880.my_history.page.click
建议先学第一个视频再学jimmy老师的,因为jimmy老师讲的都是干货,但是呢比较散,建议先把基础视频学一遍,在听jimmy老师的,会更加有印象。
当你学完了就可以run接下来的流程了,
从现在开始都在linux运行
首先你要在Linux安装conda,(这是第一道难关)conda是什么,怎么安装,它能干什么:
conda是什么:我的理解,conda就像手机上的应用超市,我们在手机上进入应用超市点击下载就把app下载了,假如没有应用超市的话,我们要安装一个app则需要下载安装包再解压之类的,因此有了应用超市,我们可以更便捷的安装app,那么conda就像服务器上的应用超市,让我们更方便的下载各种软件和包。
conda安装

#下载安装包,解压,激活
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh   #下载安装包
bash Miniconda3-latest-Linux-x86_64.sh   #使用bash命令解压安装,记得是一路yes下去
source ~/.bashrc   #激活安装的conda

#设置国内镜像
conda config --add channels r 
conda config --add channels conda-forge 
conda config --add channels bioconda
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes 

conda能干什么:1.conda能够更好的安装软件与r包 2.conda能创建一个环境
创建环境是什么意思呢,首先要搞清楚创建环境跟mkdir不一样,对于环境的理解就是,类似于我们看书需要一个安静的环境,所以我们可以conda一个环境,这个环境让我们更好做这次分析,因此对于SCENIC分析来说 ,由于r的分析过程很慢,而python的分析比较快,所以我们在linux要创建一个python的环境
conda创建一个python环境

conda create -n pyscenic python=3.8  #创建一个名为pyscenic的python3.8环境,这是一个难点,这里提醒一下,假如安装failed的话,可能是.condarc文件配置的问题哈。
conda info -e    #查看全部的环境
conda activate pyscenic   #激活我们工作的环境,进入到该环境
#在这个环境中配置一些依赖的东西
conda install pip
conda install -y numpy     
conda install -y -c anaconda cytoolz
conda install -y scanpy   #注意scanpy这个包,假如安装不了用pip安装:pip install -i https://mirrors.bfsu.edu.cn/pypi/web/simple scanpy 
#假如还是安装不了,就去Google
pip install pyscenic=0.11.1   #必须安装这个版本哈  因为在2022年5月份更新了,所以要安装以前的版本 否则后面运行会报错

linux上分析流程
1.在服务器上创建一个工作文件夹,并往文件夹中传输4个文件,进入该文件夹,开始工作

mkdir pyscience  #创建名为pyscience的工作文件夹,这样我们就在一个名叫pyscenic 的环境下创建了一些pyscience的工作文件夹。
cd pyscience #进入该文件夹

2.使用文件传输软件(Xftp)往我们pyscience文件夹中传送4个文件

  1. hg38__refseq-r80__10kb_up_and_down_tss.mc9nr.feather
  2. hs_hgnc_tfs.txt
  3. motifs-v9-nr.hgnc-m0.001-o0.0.tbl
  4. scRNA.csv
    解释这些文件
    123这三个文件都是该上述那三个流程需要用到的参比数据集,假如分析不是人的就不是这三个哈,并且必须确保这三个数据集是完好无损的
    4这个文件还记得吗,是第一步在r语言操作获得的单细胞表达矩阵
    假如大家需要123文件可以简信我哈(佛系回复)

3.run Linux流程
3.1 将scRNA.csv这个文件变成一个loom文件

pip install ipython  #安装ipython,便于运行python代码   #如果慢的话加其他镜像
ipython   #启动ipython 为了后面用python语言 
#一行一行的输入以下代码,
import os, sys 
os.getcwd()
os.listdir(os.getcwd())
import loompy as lp
import numpy as np
import scanpy as sc
x=sc.read_csv("scRNA.csv")
row_attrs = {"Gene": np.array(x.var_names),}
col_attrs = {"CellID": np.array(x.obs_names)}
lp.create("sample.loom",x.X.transpose(),row_attrs,col_attrs)
exit   #退出ipython包

当我们run完这些代码后,在我们工作的文件夹下会多一个sample.loom的文件,这样就转换成功了(这里跟jimmy大佬的代码有一些不一样,大佬直接用python脚本,而我怕出错或者有一些依赖没有安装,所以用ipython包一行一行的run)
ipython运行示例图


36872a6c3c3506f9cf0661770d55cc7.png

记得一定要exit退出ipython包

3.2 pyscenic 的3个步骤之 GRN(linux里是用这个算法,R中是用GENIE3) 复制全部粘贴后运行即可 #这一步千万不要改num_workers 设置20就行

pyscenic grn \
--num_workers 20 \
--output adj.sample.tsv \
--method grnboost2 \
sample.loom \
hs_hgnc_tfs.txt    #转录因子文件,1839  个基因的名字列表

3.3 pyscenic 的3个步骤之 cistarget 复制全部粘贴后运行即可 #这一步改num_workers 设置99也行

pyscenic ctx \
adj.sample.tsv \
hg38__refseq-r80__10kb_up_and_down_tss.mc9nr.feather \
--annotations_fname motifs-v9-nr.hgnc-m0.001-o0.0.tbl \
--expression_mtx_fname sample.loom \
--mode "dask_multiprocessing" \
--output reg.csv \
--num_workers 3 \
--mask_dropouts

3.4 pyscenic 的3个步骤之 AUCell 复制全部粘贴后运行即可 #这一步改num_workers 设置99也行

pyscenic aucell \
sample.loom \
reg.csv \
--output sample_SCENIC.loom \
--num_workers 3

三个步骤run完后,用ls查看一下发现,多了一个sample_SCENIC.loom文件,这就是我们SCENIC分析的结果,将其下载到自己电脑并导入R中,进行plot了,by the way, GRN和cistarget这两个步骤很慢,建议看文献度过哈哈哈哈。

4.R中plot

#在这里我们要理解SCENIC做了什么分析
#对每个细胞进行转录因子富集分析  筛选出较为真实的转录因子  并以细胞为单位  即每一个细胞对每一个TF进行打分(AUG)  
#所以我们可以按照细胞类型, 族,样本来源,将相应的TFplot出来
#sample_SCENIC.loom导入R里面进行可视化
library(SCENIC)
packageVersion("SCENIC")
library(Seurat)
library(SCopeLoomR)
library(AUCell)
library(SCENIC)
library(dplyr)
library(KernSmooth)
library(RColorBrewer)
library(plotly)
library(BiocParallel)
library(grid)
library(ComplexHeatmap)
library(data.table)
library(scRNAseq)
rm(list=ls())

# 提取sample_SCENIC.loom 信息
loom <- open_loom('sample_SCENIC.loom')                 #导入sample_SCENIC.loom文件

#首先我们要把导入的loom处理成R中的数据
#获取regulon        regulon定义:TF与作用的genes
#1.提取每一个TF与每一个gene作用系数
regulons_incidMat <- get_regulons(loom, column.attr.name="Regulons")   
regulons_incidMat[1:4,1:4]    #在这里就可以看出 每一个TF与每一个gene的作用数值
regulons <- regulonsToGeneLists(regulons_incidMat)      #做成一个list  TF与其作用gene的list  TF+genes  个人感觉这里假如后面想分析这个TF,则这里可以画这个TF与其作用的gene的网络图                             
#2.获得regulon的AUC  即TF在每一个细胞的激活程度
regulonAUC <- get_regulons_AUC(loom,column.attr.name='RegulonsAUC')
regulonAUC[1:4,1:4]  #regulonAUC这个文件含有每一个TF在各个细胞中的表达量  列名为细胞名   行名为TF
#3.找出在这单细胞数据中 高表达的TF
regulonAucThresholds <- get_regulon_thresholds(loom)     
tail(regulonAucThresholds[order(as.numeric(names(regulonAucThresholds)))])   #这里可以看出哪一些TF是在这个单细胞数据中高表达的
#4.这两步不知道是啥     
embeddings <- get_embeddings(loom)  #好像是什么嵌入   必须要做 否则后面会报错
close_loom(loom)
#这样就处理完成了

#接下来我们就可以挑选自己感兴趣的TF,进行个性化分析
#流程:1.查看富集到的全部的TF       2.从这些TF中挑选我们自己感兴趣的或者与课题相关的


#1.查看富集到的全部的TF
#需要每一个细胞的每一个TF的表达量
#导入单细胞数据
scRNA <- readRDS("scRNA.rds")    #这个rds是我的seruat对象
#将每一个细胞的每一个TF的表达量与单细胞的每一个细胞匹配
sub_regulonAUC <- regulonAUC[,match(colnames(scRNA),colnames(regulonAUC))]
dim(sub_regulonAUC)
#确认是否一致
identical(colnames(sub_regulonAUC), colnames(scRNA))
#[1] TRUE  一定要为TRUE,思考一下为啥,假如你用过r跑的话,r是要求你除了表达矩阵还要细胞的meta信息,而我们用linux跑的话,只用了细胞的表达矩阵,所以我们要判断我们我们做的分析是这个单细胞数据的分析,并且必须一模一样,否则你后面将分析的结果添加到seruat对象里就是不match的


#2.从这些TF中挑选我们自己感兴趣的或者与课题相关的
#挑选感兴趣的TF(所以要符合 1.在这个数据中有表达 2.不在所有细胞中都高表达,否则无法做差异分析)
names(regulons)        #我们可以通过这个函数来看在这个单细胞数据中 有哪些TF表达  在其中挑选感兴趣的TF
#设置感兴趣的TF   
regulonsToPlot = c("TWIST1(+)","NKX2-1(+)","ZNF831(+)","SIX4(+)","FOSB(+)","TBX21(+)")
#将感兴趣的TF的表达量加入到seruat对象中
scRNA@meta.data = cbind(scRNA@meta.data,t(assay(sub_regulonAUC[regulonsToPlot,])))


#3.可视化
#设置画图的分组   用idents    也可以用其他的分组
Idents(scRNA) <- sce$celltype
table(Idents(scRNA))
DotPlot(scRNA, features = unique(regulonsToPlot)) + RotatedAxis()
RidgePlot(scRNA, features = regulonsToPlot , ncol = 1)
VlnPlot(scRNA, features = regulonsToPlot,pt.size = 0 ) 
FeaturePlot(scRNA, features = regulonsToPlot )

更多的plot形式大家去Google哦,终于长舒一口气,这个包学了大概2个星期.........
写在最后,大家还是多去学习jimmy大佬的教程,真的很有帮助,解决问题时面红耳赤,解决完后心情舒坦,这该死的成就感!!!

References:

https://cn.bing.com/search?q=pyscenic&form=QBLHCN&sp=-1&pq=pyscenic&sc=8-8&qs=n&sk=&cvid=875AE9ECDA3D4EE5BEE138BA629C438E
https://www.jianshu.com/p/0a29ecfaf21e
https://blog.csdn.net/qq_45688354/article/details/108014189

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

推荐阅读更多精彩内容