前些天我们公众号弄了一个活动,详见:春节期间单细胞转录组数据分析全免费,收到了上百个需求, 本来呢我们自己就算是春节前后14天不吃不喝不眠不休也不可能完成这么多单细胞数据处理。好在我灵机一动,想起来了前面两个月培养的一百多个在线实习生,毕竟教了他们R语言,转录组,以及单细胞转录组。
所以我写了一个还算是比较自动化的单细胞转录组数据处理代码,如果是我自己的,可以在十几分钟就完成复现文章的第一层次降维聚类分群图,比如数据集:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE190856
这个数据集针对的是脓毒症心肌病(sepsis-induced cardiomyopathy,SICM),是2023年1月浙江大学医学院方向明团队在Nature Metabolism上发表的,文章标题是:《TREM2-hi resident macrophages protect the septic heart by maintaining cardiomyocyte homeostasis》,重要的研究结论是高表达髓系细胞触发受体2(triggering receptor expressed on myeloid cells-2,TREM2)的心脏常驻巨噬细胞与SICM病理过程密切相关。让我们一起来看看这个GSE190856的脓毒症小鼠模型单细胞转录组数据吧。
首先呢, 研究团队做单细胞转录组的时候,筛选了免疫细胞,所以降维聚类分群后主要是免疫细胞亚群进行细分,包括淋巴系(T,B,NK细胞)和髓系(单核,树突,巨噬,粒细胞)的两大类作为第二次细分亚群:

主要是免疫细胞亚群
因为是标准的10x技术的单细胞转录组,使用作者在GEO上面给每个样品都是一个压缩包:
GSM5733020_H001.tar.gz 76.2 Mb
GSM5733021_H002.tar.gz 59.0 Mb
GSM5733022_H003.tar.gz 42.1 Mb
GSM5733023_H004.tar.gz 100.7 Mb
GSM5733024_H005.tar.gz 57.2 Mb
GSM5733025_H006.tar.gz 74.3 Mb
GSM5733026_H007.tar.gz 88.7 Mb
GSM5733027_H008.tar.gz 99.3 Mb
GSM5733028_H009.tar.gz 80.3 Mb
GSM5733029_H011.tar.gz 79.7 Mb
压缩包解压后就是10x的标准文件,所以很简单的读取方式,每个样品的文件夹都是 Read10X 读取,并且 CreateSeuratObject,多个样品成为了一个 列表 :
rm(list=ls())
options(stringsAsFactors = F)
source('scRNA_scripts/lib.R')
###### step1:导入数据 ######
# 付费环节 800 元人民币
dir='GSE190856_RAW/'
samples=list.files( dir )
samples
# samples = head(samples,10)
sceList = lapply(samples,function(pro){
# pro=samples[1]
print(pro)
sce =CreateSeuratObject(counts = Read10X(file.path(dir,pro )) ,
project = gsub('^GSM[0-9]*_','',pro) ,
min.cells = 5,
min.features = 500 )
return(sce)
})
names(sceList)
# gsub('^GSM[0-9]*','',samples)
sce.all=merge(x=sceList[[1]],
y=sceList[ -1 ],
add.cell.ids = gsub('_gene_cell_exprs_table.txt.gz','',gsub('^GSM[0-9]*_','',samples) ) )
as.data.frame(sce.all@assays$RNA@counts[1:10, 1:2])
head(sce.all@meta.data, 10)
table(sce.all$orig.ident)
质量控制其实每个数据集不一样的,取决于单细胞转录组来源的技术,特殊情况下需要个性化的修改 scRNA_scripts/qc.R 里面的代码:
###### step2:QC质控 ######
dir.create("./1-QC")
setwd("./1-QC")
# 如果过滤的太狠,就需要去修改这个过滤代码
source('../scRNA_scripts/qc.R')
sce.all.filt = basic_qc(sce.all)
print(dim(sce.all))
print(dim(sce.all.filt))
setwd('../')
但是多样品整合,以及后续的降维聚类分群这个代码在任意单细胞转录组数据集都是大概率不需要修改的:
sp='human'
###### step3: harmony整合多个单细胞样品 ######
dir.create("2-harmony")
getwd()
setwd("2-harmony")
source('../scRNA_scripts/harmony.R')
# 默认 ScaleData 没有添加"nCount_RNA", "nFeature_RNA"
# 默认的
sce.all.int = run_harmony(sce.all.filt)
setwd('../')
###### step4: 降维聚类分群和看标记基因库 ######
# 原则上分辨率是需要自己肉眼判断,取决于个人经验
# 为了省力,我们直接看 0.1和0.8即可
table(Idents(sce.all.int))
table(sce.all.int$seurat_clusters)
table(sce.all.int$RNA_snn_res.0.1)
table(sce.all.int$RNA_snn_res.0.8)
getwd()
dir.create('check-by-0.1')
setwd('check-by-0.1')
sel.clust = "RNA_snn_res.0.1"
sce.all.int <- SetIdent(sce.all.int, value = sel.clust)
table(sce.all.int@active.ident)
source('../scRNA_scripts/check-all-markers.R')
setwd('../')
getwd()
dir.create('check-by-0.8')
setwd('check-by-0.8')
sel.clust = "RNA_snn_res.0.8"
sce.all.int <- SetIdent(sce.all.int, value = sel.clust)
table(sce.all.int@active.ident)
source('../scRNA_scripts/check-all-markers.R')
setwd('../')
getwd()
前面强调了研究团队做单细胞转录组的时候,筛选了免疫细胞,所以降维聚类分群后主要是免疫细胞亚群进行细分,包括淋巴系(T,B,NK细胞)和髓系(单核,树突,巨噬,粒细胞)的两大类作为第二次细分亚群,但是我发现里面仍然是有少量的 上皮细胞,内皮细胞,成纤维细胞 :
celltype=data.frame(ClusterID=0:9 ,
celltype= 0:9)
#定义细胞亚群
celltype[celltype$ClusterID %in% c( 5 ),2]='Bcells'
celltype[celltype$ClusterID %in% c( 7 ),2]='Tcells'
celltype[celltype$ClusterID %in% c( 0,2,8 ),2]='Mac'
celltype[celltype$ClusterID %in% c( 4 ),2]='cycle'
celltype[celltype$ClusterID %in% c( 3 ),2]='fibro'
celltype[celltype$ClusterID %in% c( 9 ),2]='epi'
celltype[celltype$ClusterID %in% c( 1 ),2]='endo'
celltype[celltype$ClusterID %in% c( 6 ),2]='mono'
这样的话,就跟我给大家准备的基因列表主要是针对肿瘤单细胞的第一层次降维聚类分群 , 是:
参考我前面介绍过 CNS图表复现08—肿瘤单细胞数据第一次分群通用规则,这3大单细胞亚群构成了肿瘤免疫微环境的复杂。
而且可以看到,里面的 内皮细胞和成纤维细胞占比还不少哦,不过上皮细胞确实很稀少了。

内皮细胞和成纤维细胞占比还不少
另外值得一提的是文章里面的单核细胞和中性粒细胞也是泾渭分明,但是在我的复现里面没有体现出来。毕竟是数据分析的每个环节都有大量的参数是可以调整的。。。
首先,有可能是单细胞转录组前面的质量控制环节,因为仅仅是写公众号,所以我通常是使用了默认过滤参数,而中性粒细胞它本身很容易被过滤掉。。。。
其次,也有可能是因为我偷个懒,仅仅是使用了 0.1的分辨率进行命名,因为命名这个步骤是纯人工 操作。除非0.1确实分群太粗狂了,我们才选择0.8 ,就耗费更多的时间啦。
所以我使用了去年的笔记:在你的髓系里面加上中性粒吧,看了看里面的基因在这个数据集的情况:

髓系基因
现在有点难判断了。