Python单细胞复现2022||03-多样本整合分析

单个样本分析接上一篇:Python图文复现2022||02-数据介绍与下载,结合视频观看效果更佳~

视频相关代码如下:

读取数据

先定义一个函数,批量运行多个样本:这里一定要注意缩进问题

def pp(csv_path):
    adata = sc.read_csv(csv_path).T
    sc.pp.filter_genes(adata, min_cells = 10)
    sc.pp.highly_variable_genes(adata, n_top_genes = 2000, subset = True, flavor = 'seurat_v3')
    scvi.model.SCVI.setup_anndata(adata)
    vae = scvi.model.SCVI(adata)
    vae.train()
    solo = scvi.external.SOLO.from_scvi_model(vae)
    solo.train()
    df = solo.predict()
    df['prediction'] = solo.predict(soft = False)
    df.index = df.index.map(lambda x: x[:-2])
    df['dif'] = df.doublet - df.singlet
    doublets = df[(df.prediction == 'doublet') & (df.dif > 1)]
    adata = sc.read_csv(csv_path).T
    adata.obs['Sample'] = csv_path.split('_')[2] #'raw_counts/GSM5226574_C51ctr_raw_counts.csv'
    adata.obs['doublet'] = adata.obs.index.isin(doublets.index)
    adata = adata[~adata.obs.doublet]
    sc.pp.filter_cells(adata, min_genes=200) #get rid of cells with fewer than 200 genes
    #sc.pp.filter_genes(adata, min_cells=3) #get rid of genes that are found in fewer than 3 cells
    adata.var['mt'] = adata.var_names.str.startswith('mt-')  # annotate the group of mitochondrial genes as 'mt'
    adata.var['ribo'] = adata.var_names.isin(ribo_genes[0].values)
    sc.pp.calculate_qc_metrics(adata, qc_vars=['mt', 'ribo'], percent_top=None, log1p=False, inplace=True)
    upper_lim = np.quantile(adata.obs.n_genes_by_counts.values, .98)
    adata = adata[adata.obs.n_genes_by_counts < upper_lim]
    adata = adata[adata.obs.pct_counts_mt < 20]
    adata = adata[adata.obs.pct_counts_ribo < 2]
    return adata

这个过程比较久,会依次读取GSE171524数据集中的26例样本,并进行上面的函数里面定义的分析。

这个过程中就可以跑去听听视频了。

import os
# 注意dir改成自己的路径
dir = '/path/data/GSE171524/'
out = []
for file in os.listdir(dir+'raw_counts/'):
    out.append(pp(dir + 'raw_counts/' + file))

将多个样本连接合并在一起,合并后共有105264个细胞:

adata = sc.concat(out)
adata

AnnData object with n_obs × n_vars = 105264 × 29236
    obs: 'Sample', 'doublet', 'n_genes', 'n_genes_by_counts', 'total_counts', 'total_counts_mt', 'pct_counts_mt', 'total_counts_ribo', 'pct_counts_ribo'
    var: 'n_cells'

过滤并保存:

sc.pp.filter_genes(adata, min_cells = 10)

from scipy.sparse import csr_matrix
adata.X = csr_matrix(adata.X)
adata.X
adata.write_h5ad(dir+'combined.h5ad')

预处理

先读取上次保存的数据:105264的细胞

import scanpy as sc
import scvi
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 注意dir改成自己的路径
dir = '/path/data/GSE171524/'
adata = sc.read_h5ad(dir+'combined.h5ad')
adata

AnnData object with n_obs × n_vars = 105264 × 29236
    obs: 'Sample', 'doublet', 'n_genes', 'n_genes_by_counts', 'total_counts', 'total_counts_mt', 'pct_counts_mt', 'total_counts_ribo', 'pct_counts_ribo'
    var: 'n_cells'

每个样本中的各种指标统计:

adata.obs.groupby('Sample').count()

共26个样本:

image-20221001224829602.png

低表达过滤以及数据标准化

sc.pp.filter_genes(adata, min_cells = 100)
adata.layers['counts'] = adata.X.copy()
sc.pp.normalize_total(adata, target_sum = 1e4)
sc.pp.log1p(adata)
adata.raw = adata

# 查看每个细胞的指标
adata.obs.head()

结果图:

image-20221001225018337.png

去Sample间的批次以及聚类

这个过程运行时间也会有丢丢长

scvi.model.SCVI.setup_anndata(adata, layer = "counts", categorical_covariate_keys=["Sample"], continuous_covariate_keys=['pct_counts_mt', 'total_counts', 'pct_counts_ribo'])

model = scvi.model.SCVI(adata)

#may take a while without GPU
model.train()

adata.obsm['X_scVI'] = model.get_latent_representation()
adata.layers['scvi_normalized'] = model.get_normalized_expression(library_size = 1e4)
sc.pp.neighbors(adata, use_rep = 'X_scVI')
sc.tl.umap(adata)
sc.tl.leiden(adata, resolution = 0.5)
sc.pl.umap(adata, color = ['leiden', 'Sample'], frameon = False)
plt.savefig(dir+"01-intergration_umap.png")

结果图:

image-20221002000706224.png

保存数据:

adata.write_h5ad(dir + 'integrated.h5ad')

差异表达分析

使用没有矫正的数据做差异表达分析

# 更改聚类数
sc.tl.leiden(adata, resolution = 1)
sc.tl.rank_genes_groups(adata, 'leiden')

# 可视化
sc.pl.rank_genes_groups(adata, n_genes=20, sharey=False)
plt.savefig(dir+"02-intergration_rank_genes_groups.png", dpi=300)

部分cluster的top基因:

image-20221002204205291.png
markers = sc.get.rank_genes_groups_df(adata, None)
markers = markers[(markers.pvals_adj < 0.05) & (markers.logfoldchanges > .5)]
markers

# 保存
markers.to_csv(dir+'markers.csv')

差异结果:

image-20221002002640069.png

使用模型标准化后的值做差异表达分析:

markers_scvi = model.differential_expression(groupby = 'leiden')

# 设定阈值
markers_scvi = markers_scvi[(markers_scvi['is_de_fdr_0.05']) & (markers_scvi.lfc_mean > .5)]
markers_scvi

# 保存
markers_scvi.to_csv(dir+'scvi_markers.csv')

结果:

image-20221002003124276.png

重新聚类后的结果可视化:总共得到34个cluster

sc.pl.umap(adata, color = ['leiden'], frameon = False, legend_loc = "on data")
plt.savefig(dir+"02-intergration_umap_1.png")

## 有多少cluster
adata.obs['leiden']

#Name: leiden, Length: 105264, dtype: category
#Categories (34, object): ['0', '1', '2', '3', ..., '30', '31', '32', '33']

结果图:

image-20221002003157201.png

细胞类型注释

文章中进行了三次注释,第一次注释大类,主要为9个类:

image-20221002202142318.png

这几个类的基因文章中没有提供,就用我们自己收集的基因来进行注释好了。

在视频资源中,视频speaker老师给了一张图:是目前免疫细胞分类很详细的一张图了:

https://learn.cellsignal.com/hubfs/landing-pages/2019/18-IMM-18284/18-IMM_18284-Human%20Markers%20PWHO-digital.pdf

image-20221002215228373.png

基因可视化:

markers = ['EPCAM','KRT8','KRT18','KRT19',  # epithelial cells
          'CD68', 'CTSS', 'FCN1','CD163',   # myeloid cells
          'ACTA2', 'DCN', 'ACTB' , # fibroblasts
          'PECAM1','CD34','VWF',   # endothelial cells
          'PTPRC','CD3D','CD3E','CD3G','CD8A', 'CD4', # T and natural killer (NK) lymphocytes
          'CD79A', 'MS4A1','CD19',  # B lymphocytes and plasma cells
          'SNAP25', 'SYT1',         # neuronal cells
          'CPA3',                   # mast cells
          'CST3', 'LAMP3', 'HLA-DQB2', 'HLA-DPB1', 'BIRC3', # antigen-presenting cells (APCs; primarily dendritic cells) 
          'MKI67','TOP2A', # Cycling
           'HBB','HBD'     # Erythroid
          ]

# 看某一个基因的表达情况
markers[markers.names=="HBB"]
markers[markers.group=="30"]

#, layer = 'scvi_normalized'
# , vmax = 5
sc.pl.umap(adata, color = ["HBB"], frameon = False, layer = 'scvi_normalized', vmax =4)
plt.savefig(dir+"03-intergration_umap_Erythroid_1.png")

一marker为基础,绘制如下类似图,vmax参数可以进行调整让结果看起来更明显,注视不出来的可以看看每个cluster高表达的基因,查一查功能就立马可以推断出来了:

image-20221002003232078.png

结合marker表达以及cluster特异性高表达基因:

image-20221003010745511.png

细胞注释如下:

for x in range(0,35):
    print(f'"{x}":"", ')

cell_type = {"0":"T Cell",
"1":"Epithelial Cell",
"2":"Myeloid Cell",
"3":"Fibroblast",
"4":"Myeloid Cell",
"5":"T Cell",
"6":"Myeloid Cell",
"7":"Epithelial Cell",
"8":"Endothelial",
"9":"Fibroblast",
"10":"Myeloid Cell",
"11":"pDC",
"12":"Epithelial Cell",
"13":"Fibroblast",
"14":"Fibroblast",
"15":"Epithelial Cell",
"16":"Epithelial Cell",
"17":"Myeloid Cell",
"18":"Epithelial Cell",
"19":"Epithelial Cell",
"20":"Neuronal Cell",
"21":"Epithelial Cell",
"22":"B Cell",
"23":"Mast Cell",
"24":"T Cell",
"25":"pDC",
"26":"Myeloid Cell",
"27":"Endothelial",
"28":"Fibroblast",
"29":"Myeloid Cell",
"30":"Erythroid",
"31":"B Cell",
"32":"Neuronal Cell",
"33":"Myeloid Cell"
}
adata.obs['cell type'] = adata.obs.leiden.map(cell_type)
sc.pl.umap(adata, color = ['cell type'], frameon = False, legend_loc = "on data")
plt.tight_layout()
plt.savefig(dir+"04-intergration_umap_anno.png", dpi=300)

adata
adata.uns['scvi_markers'] = markers_scvi
adata.uns['markers'] = markers

# 保存
adata.write_h5ad(dir + 'integrated_anno.h5ad')
model.save(dir + 'model.model')

细胞注释结果如下:

image-20221003011549203.png

这里注释出来了一串文献中没有的红细胞。

下次进行详细注释~~~

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

推荐阅读更多精彩内容