💫 前言
好久不见~今天带来的是pySCENIC的安装教程和报错处理。SCENIC是一个用来分析单细胞转录组中转录调控网络和预测转录因子活性的工具,也是应用比较广泛的高级分析之一(毕竟很多细胞状态的变化都跟转录因子息息相关)。SCENIC有R和Python两种语言的包,pySCENIC有支持命令行、支持多线程、命令简单、运行快等优点,适合在服务器上跑。然而pySCENIC的依赖包管理做得不是很好,而且官方文档里有!很!多!坑!跟着官方文档走的小伙伴大概率会一头雾水还装不上(是的,我就被各种报错劝退过好几次)。在深挖帮助文件、github讨论之后,我终于总结出了成功安装和运行的秘诀!
🔧 安装步骤
第一步:创建conda环境
# 使用Python 3.10
conda create -n -y pyscenic python=3.10
conda activate pyscenic
# github的开发版本修复了一部分报错,可以试试这个
# pip install git+https://github.com/aertslab/pySCENIC.git
# 网络原因没法下载github版本的,先用pip
pip install pyscenic
# 下载旧版本的dask-expr
pip install dask-expr==0.5.3
第二步:下载转录因子数据库
# 下载人类数据库示例
# motif到转录因子的注释文件
wget https://resources.aertslab.org/cistarget/motif2tf/motifs-v10nr_clust-nr.hgnc-m0.001-o0.0.tbl
# 基因组的排序文件
wget https://resources.aertslab.org/cistarget/databases/homo_sapiens/hg38/refseq_r80/mc_v10_clust/gene_based/hg38_10kbp_up_10kbp_down_full_tx_v10_clust.genes_vs_motifs.rankings.feather
# 转录因子列表
wget https://resources.aertslab.org/cistarget/tf_lists/allTFs_hg38.txt
# 下载小鼠数据库示例
# motif到转录因子的注释文件
wget https://resources.aertslab.org/cistarget/motif2tf/motifs-v10nr_clust-nr.mgi-m0.001-o0.0.tbl
# 基因组的排序文件
wget https://resources.aertslab.org/cistarget/databases/mus_musculus/mm10/refseq_r80/mc_v10_clust/gene_based/mm10_10kbp_up_10kbp_down_full_tx_v10_clust.genes_vs_motifs.rankings.feather
# 转录因子列表
wget https://resources.aertslab.org/cistarget/tf_lists/allTFs_mm.txt
第三步:准备输入文件
如果你使用Seurat,需要先把数据转换成loom格式,我用的是SeuratDisk这个包。注意转换完之后要记得关闭loom文件保存更改。
# R
# 加载必须的包,安装过程就省略了
library(SeuratDisk)
library(SeuratObject)
# 读取数据
obj <- readRDS("seurat_obj.rds")
# 转化为loom
obj.loom <- as.loom(obj, filename = "obj.loom")
# 关闭loom文件
obj.loom$close_all()
🚨 常见报错
太长不看版
报错一览
报错类型 | 解决方案 | 何时出现 |
np.object报错 | 修改transform.py中的np.object为object | 任何pyscenic命令 |
np.string_报错 | 修改normalize.py中的np.string_为np.bytes_ | grn |
Must supply delayed object | pip安装dask-expr==0.5.3 | grn |
np.float 报错 | 修改diptest.py 中的np.float 为np.float64 | aucell |
np.msort报错 | 修改binarization.py和diptest.py中的msort为sort | aucell |
iteritems报错 | 修改utils.py中的iteritems为items | aucell |
numpy.ndarray 报错 | 修改utils.py中的第26行 | aucell |
具体报错信息
可以提前修改,避免跑到一半报错!
np.object
报错
输入pyscenic --help
,或者运行任意pyscenic命令之后报错
AttributeError: module 'numpy' has no attribute 'object'.
这时需要找到pyscenic包的transform.py这个文件,把np.object
全部替换成object
。具体操作如下:
# bash
# 用nano打开transform.py这个脚本,记得自行替换路径
nano /path/to/miniconda3/envs/pyscenic/lib/python3.10/site-packages/pyscenic/transform.py
# Ctrl+`\` ,输入np.object,回车,输入object,A,Ctrl+X接Y退出
这一步之后再输入pyscenic --help
就会正常显示帮助文档了。
np.string_
报错
运行pyscenic grn
时出现的报错:
AttributeError: `np.string_` was removed in the NumPy 2.0 release. Use `np.bytes_` instead.. Did you mean: 'strings'?
这次问题出在loompy包的normalize.py。跟第一个报错类似,将np.string_
替换成np.bytes_
即可。
# bash
which loompy # 找到loompy安装目录
# 打开normalize.py
nano /path/to/miniconda3/envs/pyscenic/lib/python3.10/site-packages/loompy/normalize.py
# Ctrl+`\` ,输入np.string_,回车,输入np.bytes_,A,Ctrl+X,Y退出
这一步修复之后应该可以顺利运行pyscenic grn
和pyscenic ctx
这两步。
np.float
报错
运行pyscenic aucell
时出现的报错:
AttributeError: module 'numpy' has no attribute 'float'.
还是pyscenic的问题。diptest.py中的np.float
改成float
# bash
# 自行替换路径
nano /path/to/miniconda3/envs/pyscenic/lib/python3.10/site-packages/pyscenic/diptest.py
# Ctrl+`\` ,输入np.float,回车,输入float,A,Ctrl+X接Y退出
msort
报错
运行pyscenic aucell
时出现的报错:
AttributeError: module 'numpy' has no attribute 'msort'
这次需要同时修改两个文件,pyscenic包里的diptest.py和binarization.py,把msort改成sort。
# bash
# 打开diptest.py
nano /path/to/miniconda3/envs/pyscenic/lib/python3.10/site-packages/pyscenic/diptest.py
# Ctrl+`\` ,输入msort,回车,输入sort,A,Ctrl+X接Y退出
# 打开binarization.py
nano /path/to/miniconda3/envs/pyscenic/lib/python3.10/site-packages/pyscenic/binarization.py
# Ctrl+`\` ,输入msort,回车,输入sort,A,Ctrl+X接Y退出
iteritems
报错
运行pyscenic aucell
时出现的报错:
AttributeError: 'Series' object has no attribute 'iteritems'
修改pyscenic/cli/中的utils.py文件,把iteritems改成items
# bash
# 替换成pyscenic路径
nano /path/to/miniconda3/envs/pyscenic/lib/python3.10/site-packages/pyscenic/cli/utils.py
# Ctrl+`\` ,输入iteritems,回车,输入items,A,Ctrl+X接Y退出
numpy.ndarray
报错
运行pyscenic aucell
时出现的报错:
AttributeError: 'numpy.ndarray' object has no attribute 'split'
又回到了loompy,这次需要把utils.py里的第26行get_loom_spec_version(f)
后加一个[0],具体操作如下:
# bash
# 替换成loompy路径
nano /path/to/miniconda3/envs/pyscenic/lib/python3.10/site-packages/loompy/utils.py
#找到以下这行,大概率在26/27行
vf = int("".join(get_loom_spec_version(f).split(".")))
#修改成
vf = int("".join(get_loom_spec_version(f)[0].split(".")))
#Ctrl+X退出,按Y保存
终于可以顺利运行~
🏃 运行步骤
#!/bin/bash
# Define data paths
loomfile='/home/miana/mPCa.loom'
tffile='/home/miana/ref/allTFs_mm.txt'
tblfile='/home/miana/ref/motifs-v10nr_clust-nr.mgi-m0.001-o0.0.tbl'
motiffile='/home/miana/ref/mm10_10kbp_up_10kbp_down_full_tx_v10_clust.genes_vs_motifs.rankings.feather'
echo"Step 1: Inferring gene regulatory networks and co-expression modules"
pyscenic grn \
--num_workers 16 \
-o "grn_adj.tsv" \
-m grnboost2 \
--seed 2024 \
"$loomfile" \
"$tffile"
echo"Step 1 completed. Co-expression modules are saved to grn_adj.tsv"
echo"----------"
echo"Step 2: Inferring TF regulons"
pyscenic ctx \
"grn_adj.tsv" \
"$motiffile" \
--output "ctx_reg.csv" \
--annotations_fname "$tblfile" \
--expression_mtx_fname "$loomfile" \
--num_workers 16 \
--all_modules
echo"Step 2 completed. Regulon file is saved to ctx_reg.csv"
echo"----------"
echo"Step 3: Using AUCell to calculate TF activity"
pyscenic aucell \
"$loomfile" \
"ctx_reg.csv" \
-o "aucell_mtx.loom" \
--num_workers 16
echo"Step 3 completed. Final AUC matrix is saved to aucell_mtx.loom"
echo "All done."
最后得到的loom文件可以导入到R中进行下一步分析。当然也可以在第三步aucell选择存储成csv或者tsv的形式,更方便操作。
🎯 还有话说
1. 操作系统不同报错可能不同。比如,我在RHEL9.0系统的HPC上测试就没有出现除了
np.object
之外的报错。本篇的解决方案是基于Ubuntu的,在20.04 LTS和24.04 LTS上都做了测试,可以顺利运行。2. 因为本篇教程修改了部分包的源代码,所以建议把pyscenic安装在一个完全独立的conda环境里,以免影响其他程序。
3. 参考:Ubuntu系统的服务器,本地运行,约5000细胞的样本,使用16线程,运行耗时约30分钟;RHEL的系统的计算机集群,24线程约22分钟。当然不同配置的电脑实际运行时间会有差别。用R的SCENIC包的小伙伴们分享一下,这是不是比用R包要快?
📌 重要提示:在运行pyscenic之前,建议先在小数据集上测试,确保流程没问题再处理大数据集。
如果觉得有用的话,欢迎点赞、在看、分享~ 有任何问题都可以在评论区留言,我们下期再见!
#下游流程 #高级分析
📚 参考资料
1. pySCENIC官方文档
2. pySCENIC GitHub Issues