10X單細(xì)胞(10X空間轉(zhuǎn)錄組)基于馬爾可夫過(guò)程和RNA速率的細(xì)胞命運(yùn)預(yù)測(cè)(Cellrank代碼分享)

這一篇接上一篇坝茎,我們來(lái)分享Cellrank的基礎(chǔ)分析代碼惧眠,我們直接開(kāi)始

使用 RNA 速度和轉(zhuǎn)錄組學(xué)相似性來(lái)估計(jì)細(xì)胞-細(xì)胞轉(zhuǎn)換概率详囤。即使沒(méi)有 RNA 速度信息桨武,也可以應(yīng)用 CellRank(但還是推薦大家RNA 速率和相似度方法聯(lián)合使用)肋拔。

加載

import sys

if "google.colab" in sys.modules:
    !pip install -q git+https://github.com/theislab/cellrank@dev
    !pip install python-igraph
import scvelo as scv
import scanpy as sc
import cellrank as cr
import numpy as np

scv.settings.verbosity = 3
scv.settings.set_figure_params("scvelo")
cr.settings.verbosity = 2
import warnings

warnings.simplefilter("ignore", category=UserWarning)
warnings.simplefilter("ignore", category=FutureWarning)
warnings.simplefilter("ignore", category=DeprecationWarning)

首先,需要獲取數(shù)據(jù)呀酸。 以下命令將下載 adata 對(duì)象并將其保存在 datasets/endocrinogenesis_day15.5.h5ad 下(示例數(shù)據(jù)凉蜂,大家可以下載下來(lái)自己研究)。 我們還將顯示拼接/未拼接讀數(shù)的比例性誉,需要用它來(lái)估計(jì) RNA 速度窿吩。

adata = cr.datasets.pancreas()
scv.pl.proportions(adata)
adata
圖片.png

AnnData object with n_obs × n_vars = 2531 × 27998
obs: 'day', 'proliferation', 'G2M_score', 'S_score', 'phase', 'clusters_coarse', 'clusters', 'clusters_fine', 'louvain_Alpha', 'louvain_Beta', 'palantir_pseudotime'
var: 'highly_variable_genes'
uns: 'clusters_colors', 'clusters_fine_colors', 'day_colors', 'louvain_Alpha_colors', 'louvain_Beta_colors', 'neighbors', 'pca'
obsm: 'X_pca', 'X_umap'
layers: 'spliced', 'unspliced'
obsp: 'connectivities', 'distances'

前處理數(shù)據(jù)

過(guò)濾掉沒(méi)有足夠剪接/未剪接計(jì)數(shù)的基因,對(duì)數(shù)據(jù)進(jìn)行歸一化和對(duì)數(shù)變換错览,并限制在高度可變的基因上纫雁。 此外,計(jì)算速度估計(jì)的主成分和矩蝗砾。
scv.pp.filter_and_normalize(adata, min_shared_counts=20, n_top_genes=2000)
sc.tl.pca(adata)
sc.pp.neighbors(adata, n_pcs=30, n_neighbors=30)
scv.pp.moments(adata, n_pcs=None, n_neighbors=None)

Run scVelo

我們將使用來(lái)自 scVelo 的動(dòng)力學(xué)模型來(lái)估計(jì)速度先较。
scv.tl.recover_dynamics(adata, n_jobs=8)
一旦有了參數(shù)携冤,就可以使用這些參數(shù)來(lái)計(jì)算速度和速度圖悼粮。 速度圖是一個(gè)加權(quán)圖,它指定了兩個(gè)cell在給定速度向量和相對(duì)位置的情況下轉(zhuǎn)換為另一個(gè)cell的可能性曾棕。
scv.tl.velocity(adata, mode="dynamical")
scv.tl.velocity_graph(adata)
scv.pl.velocity_embedding_stream(
    adata, basis="umap", legend_fontsize=12, title="", smooth=0.8, min_mass=4
)
圖片.png

運(yùn)行Cellrank

CellRank 提供了多種將方向性注入單細(xì)胞數(shù)據(jù)的方法扣猫。 在這里,方向信息來(lái)自 RNA 速度翘地,使用這些信息來(lái)計(jì)算胰腺發(fā)育動(dòng)態(tài)過(guò)程的初始和終止?fàn)顟B(tài)以及fate probabilities申尤。

Identify terminal states

cr.tl.terminal_states(adata, cluster_key="clusters", weight_connectivities=0.2)

The most important parameters in the above function are:

  • estimator: this determines what’s going to behind the scenes to compute the terminal states. Options are cr.tl.estimators.CFLARE (“Clustering and Filtering of Left and Right Eigenvectors”) or cr.tl.estimators.GPCCA (“Generalized Perron Cluster Cluster Analysis, [Reuter et al., 2018] and [Reuter et al., 2019], see also our pyGPCCA implementation). The latter is the default, it computes terminal states by coarse graining the velocity-derived Markov chain into a set of macrostates that represent the slow-time scale dynamics of the process, i.e. it finds the states that you are unlikely to leave again, once you have entered them.

  • cluster_key: takes a key from adata.obs to retrieve pre-computed cluster labels, i.e. ‘clusters’ or ‘louvain’. These labels are then mapped onto the set of terminal states, to associate a name and a color with each state.

  • n_states: number of expected terminal states. This parameter is optional - if it’s not provided, this number is estimated from the so-called ‘eigengap heuristic’ of the spectrum of the transition matrix.

  • method: This is only relevant for the estimator GPCCA. It determines the way in which we compute and sort the real Schur decomposition. The default, krylov, is an iterative procedure that works with sparse matrices which allows the method to scale to very large cell numbers. It relies on the libraries SLEPc and PETSc, which you will have to install separately, see our installation instructions. If your dataset is small (<5k cells), and you don’t want to install these at the moment, use method='brandts' [Brandts, 2002]. The results will be the same, the difference is that brandts works with dense matrices and won’t scale to very large cells numbers.

  • weight_connectivities: weight given to cell-cell similarities to account for noise in velocity vectors.

cr.pl.terminal_states(adata)
圖片.png

Identify initial states

cr.tl.initial_states(adata, cluster_key="clusters")
cr.pl.initial_states(adata, discrete=True)
圖片.png

Compute fate maps

一旦知道終端狀態(tài)癌幕,就可以計(jì)算相關(guān)的命運(yùn)圖——對(duì)于每個(gè)細(xì)胞,尋求細(xì)胞朝著每個(gè)確定的終端狀態(tài)發(fā)展的可能性有多大昧穿。
cr.tl.lineages(adata)
cr.pl.lineages(adata, same_plot=False)
圖片.png
可以將上述內(nèi)容聚合成一個(gè)單一的全局命運(yùn)圖勺远,其中將每個(gè)終端狀態(tài)與顏色相關(guān)聯(lián),并使用該顏色的強(qiáng)度來(lái)顯示每個(gè)單個(gè)細(xì)胞的命運(yùn):
cr.pl.lineages(adata, same_plot=True)
圖片.png

Directed PAGA

我們可以使用具有有向邊的 [Wolf et al., 2019] 的改編版本將個(gè)體命運(yùn)圖進(jìn)一步聚合成集群級(jí)別的命運(yùn)圖时鸵。 我們首先使用 CellRank 識(shí)別的 root_key 和 end_key 計(jì)算 scVelo 的潛伏時(shí)間胶逢,它們分別是初始狀態(tài)或終止?fàn)顟B(tài)的概率。
scv.tl.recover_latent_time(
    adata, root_key="initial_states_probs", end_key="terminal_states_probs"
)
Next, we can use the inferred pseudotime along with the initial and terminal states probabilities to compute the directed PAGA.
scv.tl.paga(
    adata,
    groups="clusters",
    root_key="initial_states_probs",
    end_key="terminal_states_probs",
    use_time_prior="velocity_pseudotime",
)
cr.pl.cluster_fates(
    adata,
    mode="paga_pie",
    cluster_key="clusters",
    basis="umap",
    legend_kwargs={"loc": "top right out"},
    legend_loc="top left out",
    node_size_scale=5,
    edge_width_scale=1,
    max_edge_width=4,
    title="directed PAGA",
)
圖片.png

Compute lineage drivers

可以計(jì)算所有譜系或部分譜系的驅(qū)動(dòng)基因饰潜。 還可以通過(guò)指定cluster=...將其限制為某些cluster初坠。 在生成的數(shù)據(jù)框中,還看到了 p 值彭雾、校正后的 p 值(q 值)和相關(guān)統(tǒng)計(jì)量的 95% 置信區(qū)間碟刺。
圖片.png
Afterwards, we can plot the top 5 driver genes (based on the correlation), e.g. for the Alpha lineage
cr.pl.lineage_drivers(adata, lineage="Alpha", n_genes=5)
圖片.png

Gene expression trends

上面演示的功能是 CellRank 的主要功能:計(jì)算初始和終止?fàn)顟B(tài)以及概率命運(yùn)圖。 現(xiàn)在可以使用計(jì)算出的概率來(lái)例如 沿譜系平滑基因表達(dá)趨勢(shì)薯酝。

從細(xì)胞的時(shí)間順序開(kāi)始半沽。 為了得到這個(gè),可以計(jì)算 scVelo 的潛伏時(shí)間吴菠,如前所述抄囚,或者,我們可以只使用 CellRank 的初始狀態(tài)來(lái)計(jì)算 橄务。

# compue DPT, starting from CellRank defined root cell
root_idx = np.where(adata.obs["initial_states"] == "Ngn3 low EP")[0][0]
adata.uns["iroot"] = root_idx
sc.tl.dpt(adata)

scv.pl.scatter(
    adata,
    color=["clusters", root_idx, "latent_time", "dpt_pseudotime"],
    fontsize=16,
    cmap="viridis",
    perc=[2, 98],
    colorbar=True,
    rescale_color=[0, 1],
    title=["clusters", "root cell", "latent time", "dpt pseudotime"],
)
圖片.png

We can plot dynamics of genes in pseudotime along individual trajectories, defined via the fate maps we computed above.

model = cr.ul.models.GAM(adata)
cr.pl.gene_trends(
    adata,
    model=model,
    data_key="X",
    genes=["Pak3", "Neurog3", "Ghrl"],
    ncols=3,
    time_key="latent_time",
    same_plot=True,
    hide_cells=True,
    figsize=(15, 4),
    n_test_points=200,
)
圖片.png
還可以在熱圖中可視化上面計(jì)算的譜系驅(qū)動(dòng)程序幔托。 下面,對(duì) Alpha 譜系執(zhí)行此操作蜂挪,即在偽時(shí)間中平滑假定的 Alpha 驅(qū)動(dòng)程序的基因表達(dá)重挑,將 Alpha 命運(yùn)概率用作細(xì)胞級(jí)別的權(quán)重。 根據(jù)它們?cè)趥螘r(shí)間中的峰值對(duì)基因進(jìn)行排序棠涮,從而揭示了基因表達(dá)事件的級(jí)聯(lián)谬哀。
cr.pl.heatmap(
    adata,
    model,
    genes=adata.varm['terminal_lineage_drivers']["Alpha_corr"].sort_values(ascending=False).index[:100],
    show_absorption_probabilities=True,
    lineages="Alpha",
    n_jobs=1,
    backend="loky",
)
圖片.png

生活很好,有你更好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載严肪,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者史煎。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驳糯,隨后出現(xiàn)的幾起案子篇梭,更是在濱河造成了極大的恐慌,老刑警劉巖酝枢,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恬偷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡帘睦,警方通過(guò)查閱死者的電腦和手機(jī)袍患,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)坦康,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诡延,你說(shuō)我怎么就攤上這事滞欠。” “怎么了肆良?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵仑撞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我妖滔,道長(zhǎng)隧哮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任座舍,我火速辦了婚禮沮翔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曲秉。我一直安慰自己采蚀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布承二。 她就那樣靜靜地躺著榆鼠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亥鸠。 梳的紋絲不亂的頭發(fā)上妆够,一...
    開(kāi)封第一講書(shū)人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音负蚊,去河邊找鬼神妹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛家妆,可吹牛的內(nèi)容都是我干的鸵荠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼伤极,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛹找!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哨坪,我...
    開(kāi)封第一講書(shū)人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庸疾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后齿税,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體彼硫,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年凌箕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拧篮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牵舱,死狀恐怖串绩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芜壁,我是刑警寧澤礁凡,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站慧妄,受9級(jí)特大地震影響顷牌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜塞淹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一窟蓝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饱普,春花似錦运挫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冯袍,卻和暖如春匈挖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背康愤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工关划, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翘瓮。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓贮折,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親资盅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子调榄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容