肿瘤单细胞转录组的第一层次降维聚类分群

2023-11-16 11:07:24 浏览数 (2)

主要的分析就是第一层次降维聚类分群,然后大概认识一下有什么亚群,以及比例差异情况,最后就是把每个亚群都细分一下做同样的分析即可。

认识GEO数据库里面的单细胞转录组数据文件格式

我们《生信菜鸟团》的单细胞周更专辑作者分享过好几次了基础文件读取技巧啦,详见:读取不同格式的单细胞转录组数据及遇到问题的解决办法。其中最常见的就是使用Read10X读取3个文件,但是Read10X读取3个文件还得注意版本,而且必须保证3个文件名字完全一样,要么是

代码语言:javascript复制
barcodes.tsv.gz  features.tsv.gz  matrix.mtx.gz

或者说是:

代码语言:javascript复制
barcodes.tsv  genes.tsv  matrix.mtx

只有这样才能把表达量矩阵读入进去。而这个数据集是如下所示的文件:

代码语言:javascript复制
GSM5699777_TD1_barcodes.tsv.gz 73.7 Kb
GSM5699777_TD1_features.tsv.gz 297.6 Kb
GSM5699777_TD1_matrix.mtx.gz 71.4 Mb


GSM5699778_TD2_barcodes.tsv.gz 86.0 Kb
GSM5699778_TD2_features.tsv.gz 297.6 Kb
GSM5699778_TD2_matrix.mtx.gz 77.3 Mb

所以是需要改名的!

整理和组织文件夹

代码语言:javascript复制
├── [4.0K]  TD1
│   ├── [ 74K]  barcodes.tsv.gz
│   ├── [298K]  features.tsv.gz
│   └── [ 71M]  matrix.mtx.gz
├── [4.0K]  TD2
│   ├── [ 86K]  barcodes.tsv.gz
│   ├── [298K]  features.tsv.gz
│   └── [ 77M]  matrix.mtx.gz

如下所示:

组织文件夹

构建Seurat对象

包的Read10X函数是可以读取单个样品的一个文件夹路径,但是我们是需要循环读取每个文件夹,所以是lapply这样的读取方式:

代码语言:javascript复制
dir='GSE189357_RAW/outputs/' 
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]*_','',
                                         gsub('filtered_feature_bc_matrix','',pro) )  ,# pro, #
                          min.cells = 5,
                          min.features = 500 )
  return(sce)
}) 
sce.all=merge(x=sceList[[1]],
              y=sceList[ -1 ],
              add.cell.ids =  gsub('^GSM[0-9]*_','',
                                   gsub('filtered_feature_bc_matrix','',samples))    ) 

这个seurat对象的结构非常复杂,值得细细品读!

质量控制:

值得注意是我们依赖于这个V4的版本的Seurat流程做出来了大量的公共数据集的单细胞转录组降维聚类分群流程,100多个公共单细胞数据集全部的处理,链接:https://pan.baidu.com/s/1MzfqW07P9ZqEA_URQ6rLbA?pwd=3heo

下面的scRNA_scripts文件夹的r代码都在上面的百度云网盘链接(https://pan.baidu.com/s/1MzfqW07P9ZqEA_URQ6rLbA?pwd=3heo)里面哦:

代码语言:javascript复制
###### 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('../')

如果是Seurat版本问题,参考我们前面的降级方式:假如你不喜欢最新版的Seurat包的单细胞理念

整合后再降维聚类分群

单细胞的每个样品其实都是批次,原则上这样的批次是不可以矫正的,所以这个时候我们把这个步骤称作是整合。

代码语言:javascript复制
 wc -l scRNA_scripts/*
 
     368 scRNA_scripts/check-all-markers.R
      48 scRNA_scripts/harmony.R
      14 scRNA_scripts/lib.R
     102 scRNA_scripts/qc.R

scRNA_scripts文件夹的r代码都在上面的百度云网盘链接(https://pan.baidu.com/s/1MzfqW07P9ZqEA_URQ6rLbA?pwd=3heo)里面哈。

确定分辨率

我们默认会看看 0.1和0.8这两个分辨率的情况:

代码语言:javascript复制
# 为了省力,我们直接看  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()

如下所示的0.1分辨率群就很少:

0.1分辨率群就很少

如下所示的0.8分辨率群就很多:

0.8分辨率群就很多

在上面的0.1的分辨率下面,b细胞和plasma细胞是没办法区分的,但是在0.8的分辨率下面可以看到2群是b细胞但是13群是plasma细胞。

人工注释单细胞亚群

肺癌单细胞数据集也有好几十个了,拿到表达量矩阵后的第一层次降维聚类分群通常是:

  • immune (CD45 ,PTPRC),
  • epithelial/cancer (EpCAM ,EPCAM),
  • stromal (CD10 ,MME,fibo or CD31 ,PECAM1,endo)

参考我前面介绍过 CNS图表复现08—肿瘤单细胞数据第一次分群通用规则,这3大单细胞亚群构成了肿瘤免疫微环境的复杂。所以是很容易降维聚类分群啦,我们都是人工命名,比如上面的0.1的分辨率下面就可以人工判断给出来下面的亚群名字:

代码语言:javascript复制
  #定义细胞亚群        
  celltype[celltype$ClusterID %in% c( 0 ),2]='Tcells' 
  celltype[celltype$ClusterID %in% c( 2 ),2]='Bcells' 
  celltype[celltype$ClusterID %in% c( 1   ),2]= 'myeloids' # 
  celltype[celltype$ClusterID %in% c( 4 ),2]='mast'
  celltype[celltype$ClusterID %in% c( 5 ),2]='endo'
  
  celltype[celltype$ClusterID %in% c(6),2]='fibro'  
  celltype[celltype$ClusterID %in% c(8),2]='cycle'  
   
  celltype[celltype$ClusterID %in% c( 3,7,9 ),2]='epi'   

0 人点赞