1. 簡介
cell2fate是一個(gè)用于velocity分析的軟件,相比傳統(tǒng)的scvelo建模方法,能建立更符合生物學(xué)過程的時(shí)序,詳情可閱讀原文:Cell2fate infers RNA velocity modules to improve cell fate prediction | Nature Methods。需要注意的是,該工具剛需GPU進(jìn)行訓(xùn)練,如果你沒有GPU,那就別浪費(fèi)時(shí)間了。

2. 安裝
參考官方文檔:Installation — cell2fate documentation
需要注意的是,在使用pip安裝的時(shí)候,可以考慮使用清華鏡像,參考博客:【Python】設(shè)置pip源為國內(nèi)源及簡單操作 - 愛啦啦 - 博客園
conda create -y -n cell2fate_env python=3.9
conda activate cell2fate_env
pip install git+https://github.com/BayraktarLab/cell2fate
當(dāng)然,如果向通過jupyter notebook進(jìn)行代碼調(diào)試,需要添加本環(huán)境為kernel
conda activate cell2fate_env
pip install ipykernel
python -m ipykernel install --user --name=cell2fate_env --display-name='Environment (cell2fate_env)'
3. 運(yùn)行
3.1 加載包
import cell2fate as c2f
import scanpy as sc
import numpy as np
import matplotlib.pyplot as plt
import os
3.2 導(dǎo)入數(shù)據(jù)
velocity分析需要unspliced及spliced兩種counts,這個(gè)文件可以從bam文件,利用velocyto等工具生成。不同的工具可能對(duì)結(jié)果有一定的影響,參考:Preprocessing choices affect RNA velocity results for droplet scRNA-seq data | PLOS Computational Biology
從bam通過velocyto得到包含spliced及unspliced counts的loom文件過程省略,可以參考velocyto官方教程。
使用R的seurat object,及包含這些細(xì)胞剪切信息的loom文件來生成用于velocity分析的adata對(duì)象,可以參考scvelo官方教程,大致流程如下:
#1. 導(dǎo)入loom
ldata = sc.read(filename.loom, cache=True)
#2. 導(dǎo)入adata
#2.1 在R中將seurat object先保存為h5ad:
SeuratDisk::SaveH5Seurat(seurat_obj, filename = h5Seurat_filename)
SeuratDisk::Convert(h5Seurat_filename, dest = "h5ad", overwrite = T)
#2.2 讀入adata
adata = sc.read(h5ad_filename, cache=True)
#2.3 Merge
adata = scv.utils.merge(adata, ldata)
4. 運(yùn)行注意事項(xiàng)。
詳細(xì)的運(yùn)行過程就不贅述了,直接參考官方流程。這里只記錄需要注意的點(diǎn):
4.1 數(shù)據(jù)過濾
對(duì)數(shù)據(jù)的過濾還是可以考慮一下的,如果數(shù)據(jù)過多可能訓(xùn)練時(shí)間會(huì)更長,這個(gè)我沒有具體測試。
adata = c2f.utils.get_training_data(adata, cells_per_cluster = 10**5, cluster_column = 'clusters',
remove_clusters = clusters_to_remove,
min_shared_counts = 20, n_var_genes= 3000)
4.2 mod.train
不剛需GPU,CPU也能訓(xùn)練,但是時(shí)間非常長,我自己測試用上4090能比cpu快15倍以上。cpu需要用5h,4090需要20min。(cpu型號(hào)忘了)。
mod.train()
另外需要注意的是,cell2fate默認(rèn)安裝pytorch=1.11.0,cuda=10.2,如果你的GPU是40系及其以上的話,會(huì)調(diào)用不了。報(bào)錯(cuò)及具體解決方式參考上一篇文章:解決error:CUDA error: no kernel image is available for execution on the device - 簡書
4.3 剛需GPU
adata = mod.export_posterior(adata) #沒有GPU就會(huì)報(bào)錯(cuò)無法繼續(xù)運(yùn)行
4.4 scvelo報(bào)錯(cuò)
運(yùn)行以下代碼的時(shí)候會(huì)調(diào)用scvelo中代碼,此時(shí),如果numpy,pandas環(huán)境沖突,可能會(huì)報(bào)錯(cuò):
"ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 2 dimensions. The detected shape was (1, 4) + inhomogeneous part."
這也是scvelo之前版本的問題,據(jù)說最新版本以及修復(fù)了。社區(qū)里大多通過安裝特定版本的python及其他依賴包來解決,不過jacobrepucci在MultiVelo-issues36提到可以修改scvelo的源代碼來解決該問題,我測試了以下的確可行,不過需要重新跑一遍流程,因?yàn)榄h(huán)境中的函數(shù)已經(jīng)加載了。
mod.compute_and_plot_total_velocity_scvelo(adata, save = results_path + data_name + 'total_velocity_plots.png', delete = False)
修改源碼方式如下:
Alternatively, you could edit the local scvelo code so that the line
res = np.array(res) if as_array else resin scvelo/core/_parallelize.py is insteadres = np.array(res, dtype=object) if as_array else res
在我的scvelo中,位于_parallelize.py的第138行,當(dāng)然,python也會(huì)告訴你具體在哪一行。