單細胞分析的 Python 包 Scanpy(圖文詳解)

一谬莹、安裝

Conda 安裝使用圖文詳解(2021版)

scanpy 單細胞分析包圖文詳解 01 | 深入理解 AnnData 數(shù)據(jù)結(jié)構(gòu)

pip install scanpy
conda install -y -c conda-forge leidenalg

二掷邦、使用

1钠右、準備工作

# 載入包
import numpy as np
import pandas as pd
import scanpy as sc

# 設(shè)置
sc.settings.verbosity = 3             # 設(shè)置日志等級: errors (0), warnings (1), info (2), hints (3)
sc.logging.print_header()
sc.settings.set_figure_params(dpi=80, facecolor='white')

# 用于存儲分析結(jié)果文件的路徑
results_file = 'write/pbmc3k.h5ad'

# 載入文件
adata = sc.read_10x_mtx(
    './filtered_gene_bc_matrices/hg19/',  # mtx 文件目錄
    var_names='gene_symbols',             # 使用 gene_symbols 作為變量名
    cache=True)                           # 寫入緩存,可以更快的讀取文件

2杀赢、預(yù)處理

顯示在所有細胞中在每個單細胞中產(chǎn)生最高計數(shù)分數(shù)的基因

sc.pl.highest_expr_genes(adata, n_top=20, )
image.png

過濾低質(zhì)量細胞樣本

過濾在少于三個細胞中表達,或一個細胞中表達少于200個基因的細胞樣本

sc.pp.filter_cells(adata, min_genes=200)
sc.pp.filter_genes(adata, min_cells=3)

過濾包含線粒體基因和表達基因過多的細胞

線粒體基因的轉(zhuǎn)錄本比單個轉(zhuǎn)錄物分子大,并且不太可能通過細胞膜逃逸骄酗。因此,檢測出高比例的線粒體基因悦冀,表明細胞質(zhì)量差(Islam et al. 2014; Ilicic et al. 2016)趋翻。

表達基因過多可能是由于一個油滴包裹多個細胞,從而檢測出比正常檢測要多的基因數(shù)盒蟆,因此要過濾這些細胞踏烙。

adata.var['mt'] = adata.var_names.str.startswith('MT-')  # 將線粒體基因標記為 mt
sc.pp.calculate_qc_metrics(adata, qc_vars=['mt'], percent_top=None, log1p=False, inplace=True)
sc.pl.violin(adata, ['n_genes_by_counts', 'total_counts', 'pct_counts_mt'],
             jitter=0.4, multi_panel=True)
image.png

生成的三張小提琴圖代表:表達基因的數(shù)量,每個細胞包含的表達量历等,線粒體基因表達量的百分比讨惩。

過濾

sc.pl.scatter(adata, x='total_counts', y='pct_counts_mt')
sc.pl.scatter(adata, x='total_counts', y='n_genes_by_counts')
image.png

過濾線粒體基因表達過多或總數(shù)過多的細胞,也就是紅框標識的樣本寒屯。

# 獲取線粒體基因占比在 5% 以下的細胞樣本
adata = adata[adata.obs.pct_counts_mt < 5, :]
# 獲取表達基因數(shù)在 2500 以下的細胞樣本
adata = adata[adata.obs.n_genes_by_counts < 2500, :]

3荐捻、檢測特異性基因

歸一化

# 歸一化,使得不同細胞樣本間可比
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)

存儲數(shù)據(jù)

將 AnnData 對象的 .raw 屬性設(shè)置為歸一化和對數(shù)化的原始基因表達寡夹,以便以后用于基因表達的差異測試和可視化处面。這只是凍結(jié)了 AnnData 對象的狀態(tài)。

adata.raw = adata

識別特異性基因

# 計算
sc.pp.highly_variable_genes(adata, min_mean=0.0125, max_mean=3, min_disp=0.5)
# 繪制特異性基因散點圖
sc.pl.highly_variable_genes(adata)
image.png

獲取只有特異性基因的數(shù)據(jù)集

# 獲取只有特異性基因的數(shù)據(jù)集
adata = adata[:, adata.var.highly_variable]
# 回歸每個細胞的總計數(shù)和表達的線粒體基因的百分比的影響菩掏。
sc.pp.regress_out(adata, ['total_counts', 'pct_counts_mt'])
# 將每個基因縮放到單位方差魂角。閾值超過標準偏差 10。
sc.pp.scale(adata, max_value=10)

4患蹂、主成分分析(Principal component analysis)

通過運行主成分分析 (PCA) 來降低數(shù)據(jù)的維數(shù)或颊,可以對數(shù)據(jù)進行去噪并揭示不同分群的主因素砸紊。

# 繪制 PCA 圖
sc.pl.pca(adata, color='CST3')
image.png

檢查單個 PC 對數(shù)據(jù)總方差的貢獻,這可以提供給我們應(yīng)該考慮多少個 PC 以計算細胞的鄰域關(guān)系的信息囱挑,例如用于后續(xù)的聚類函數(shù) sc.tl.louvain() 或 tSNE 聚類 sc.tl.tsne()醉顽。

sc.pl.pca_variance_ratio(adata, log=True)
image.png

5、領(lǐng)域圖平挑,聚類圖(Neighborhood graph)

使用數(shù)據(jù)矩陣的 PCA 表示來計算單元格的鄰域圖游添。為了重現(xiàn) Seurat 的結(jié)果,我們采用以下值通熄。

建議使用 UMAP 唆涝,它可能比 tSNE 更忠實于流形的全局連通性,因此能更好地保留軌跡唇辨。

sc.pp.neighbors(adata, n_neighbors=10, n_pcs=40)
sc.tl.umap(adata)
# 如果設(shè)置了 adata 的 .raw 屬性時廊酣,下圖顯示了“raw”(標準化、對數(shù)化但未校正)基因表達矩陣赏枚。
sc.pl.umap(adata, color=['CST3', 'NKG7', 'PPBP'])
image.png

為了繪制縮放矯正的基因表達聚類圖亡驰,需要使用 use_raw=False 參數(shù)。

sc.pl.umap(adata, color=['CST3', 'NKG7', 'PPBP'], use_raw=False)
image.png

目前還沒有計算出各個細胞類群饿幅,下面進行聚類

Leiden 圖聚類

# 計算
sc.tl.leiden(adata)
# 繪制
sc.pl.umap(adata, color=['leiden'])

6凡辱、檢索標記基因

先計算每個 leiden 分群中高度差異基因的排名,取排名前 25 的基因栗恩。

默認情況下透乾,使用 AnnData 的 .raw 屬性。

T-test

最簡單和最快的方法是 t 檢驗磕秤。

sc.tl.rank_genes_groups(adata, 'leiden', method='t-test')
sc.pl.rank_genes_groups(adata, n_genes=25, sharey=False)
image.png

Wilcoxon rank-sum

Wilcoxon rank-sum (Mann-Whitney-U) 檢驗的結(jié)果非常相似乳乌,還可以使用其他的差異分析包,如 MAST亲澡、limma钦扭、DESeq2 和 diffxpy。

sc.tl.rank_genes_groups(adata, 'leiden', method='wilcoxon')
sc.pl.rank_genes_groups(adata, n_genes=25, sharey=False)
# 保存這次的數(shù)據(jù)結(jié)果
adata.write(results_file)

邏輯回歸

sc.tl.rank_genes_groups(adata, 'leiden', method='logreg')
sc.pl.rank_genes_groups(adata, n_genes=25, sharey=False)

使用邏輯回歸對基因進行排名 Natranos et al. (2018)床绪,這里使用多變量方法客情,而傳統(tǒng)的差異測試是單變量 Clark et al. (2014)

image.png

除了僅由 t 檢驗發(fā)現(xiàn)的 IL7R 和由其他兩種方法發(fā)現(xiàn)的 FCER1A 之外,所有標記基因都在所有方法中都得到了重現(xiàn)癞己。

Louvain Group Markers Cell Type
0 IL7R CD4 T cells
1 CD14, LYZ CD14+ Monocytes
2 MS4A1 B cells
3 CD8A CD8 T cells
4 GNLY, NKG7 NK cells
5 FCGR3A, MS4A7 FCGR3A+ Monocytes
6 FCER1A, CST3 Dendritic Cells
7 PPBP Megakaryocytes

根據(jù)已知的標記基因膀斋,定義一個標記基因列表供以后參考:

marker_genes = ['IL7R', 'CD79A', 'MS4A1', 'CD8A', 'CD8B', 'LYZ', 'CD14',
                'LGALS3', 'S100A8', 'GNLY', 'NKG7', 'KLRB1',
                'FCGR3A', 'MS4A7', 'FCER1A', 'CST3', 'PPBP']

載入數(shù)據(jù)

# 使用 Wilcoxon Rank-Sum 測試結(jié)果重新加載已保存的對象
adata = sc.read(results_file)

獲取聚類分組和分數(shù)

result = adata.uns['rank_genes_groups']
groups = result['names'].dtype.names
pd.DataFrame(
    {group + '_' + key[:1]: result[key][group]
    for group in groups for key in ['names', 'pvals']}).head(5)
image.png

Group 1 與 Group 2 比較,進行差異分析

sc.tl.rank_genes_groups(adata, 'leiden', groups=['0'], reference='1', method='wilcoxon')
sc.pl.rank_genes_groups(adata, groups=['0'], n_genes=20)
image.png
sc.pl.rank_genes_groups_violin(adata, groups='0', n_genes=8)
image.png

Group 0 與其余組的比較進行差異分析

adata = sc.read(results_file)
sc.pl.rank_genes_groups_violin(adata, groups='0', n_genes=8)
image.png

跨類群比較基因

sc.pl.violin(adata, ['CST3', 'NKG7', 'PPBP'], groupby='leiden')
image.png

根據(jù)已知的細胞標記痹雅,注釋細胞類型

new_cluster_names = [
    'CD4 T', 'CD14 Monocytes',
    'B', 'CD8 T',
    'NK', 'FCGR3A Monocytes',
    'Dendritic', 'Megakaryocytes']
adata.rename_categories('leiden', new_cluster_names)
sc.pl.umap(adata, color='leiden', legend_loc='on data', title='', frameon=False, save='.pdf')
image.png

可視化每個類群的標記基因

氣泡圖顯示:

sc.pl.dotplot(adata, marker_genes, groupby='leiden');
image.png

小提琴圖顯示

sc.pl.stacked_violin(adata, marker_genes, groupby='leiden', rotation=90);
image.png

7却嗡、保存數(shù)據(jù)

保存壓縮文件

如果只想將其用于可視化的人共享此文件假残,減少文件大小的一種簡單方法是刪除縮放和校正的數(shù)據(jù)矩陣姥卢。

adata.write(results_file, compression='gzip')

保存為 h5ad 數(shù)據(jù)

adata.raw.to_adata().write('./write/pbmc3k_withoutX.h5ad')

讀取使用 adata = sc.read_h5ad('./write/pbmc3k_withoutX.h5ad')

導(dǎo)出數(shù)據(jù)子集

# 導(dǎo)出聚類數(shù)據(jù)
adata.obs[['n_counts', 'louvain_groups']].to_csv('./write/pbmc3k_corrected_louvain_groups.csv')
# 導(dǎo)出PCA數(shù)據(jù)
adata.obsm.to_df()[['X_pca1', 'X_pca2']].to_csv('./write/pbmc3k_corrected_X_pca.csv')

8、番外

我之前在處理較多數(shù)據(jù)量的時候赂苗,會有些地方不一樣,具體每個數(shù)據(jù)集的處理也會有比較大的自由度贮尉,比如:

在檢測線粒體基因時拌滋,這里在質(zhì)控時,已經(jīng)把線粒體基因直接剔除猜谚。

image.png

在做 UMAP 時败砂,可以看到一些類群間的聯(lián)系和軌跡。

image.png

做 TSNE時魏铅,可以看到類群間比較干凈利索昌犹,整體比較“飽滿”。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末览芳,一起剝皮案震驚了整個濱河市斜姥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌路操,老刑警劉巖疾渴,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千贯,死亡現(xiàn)場離奇詭異屯仗,居然都是意外死亡,警方通過查閱死者的電腦和手機搔谴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門魁袜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敦第,你說我怎么就攤上這事峰弹。” “怎么了芜果?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵鞠呈,是天一觀的道長。 經(jīng)常有香客問我右钾,道長蚁吝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任舀射,我火速辦了婚禮窘茁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脆烟。我一直安慰自己山林,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布邢羔。 她就那樣靜靜地躺著驼抹,像睡著了一般桑孩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上框冀,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天洼怔,我揣著相機與錄音,去河邊找鬼左驾。 笑死镣隶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诡右。 我是一名探鬼主播安岂,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帆吻!你這毒婦竟也來了域那?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤猜煮,失蹤者是張志新(化名)和其女友劉穎次员,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體王带,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡淑蔚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了愕撰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刹衫。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搞挣,靈堂內(nèi)的尸體忽然破棺而出带迟,到底是詐尸還是另有隱情,我是刑警寧澤囱桨,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布仓犬,位于F島的核電站,受9級特大地震影響舍肠,放射性物質(zhì)發(fā)生泄漏搀继。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一貌夕、第九天 我趴在偏房一處隱蔽的房頂上張望律歼。 院中可真熱鬧,春花似錦啡专、人聲如沸险毁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畔况。三九已至鲸鹦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跷跪,已是汗流浹背馋嗜。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吵瞻,地道東北人葛菇。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像橡羞,于是被迫代替她去往敵國和親眯停。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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