scRNA-10X免疫治疗学习笔记-7-其他R包介绍

刘小泽写于19.10.18 笔记目的:根据生信技能树的单细胞转录组课程探索10X Genomics技术相关的分析 课程链接在:http://jm.grazy.cn/index/mulitcourse/detail.html?cid=55 第二单元最后一讲第11讲:单细胞转录组的其他R包介绍

这一次的问题是:分析单细胞转录组一定要用R包吗?

之前在 10X scRNA免疫治疗学习笔记-5-差异分析及可视化 中使用monocle的plot_cell_clusters函数画出了PBMC的第4和第10群两种不同T细胞的差异。那么这个分析一定要用包装好的R包吗?不是的,即使不使用别人做的R包,自己也能利用作图原理画出来

image-20191017233748733

问题的重点不在使用什么包,而是做出这个图的原理是什么

就上面这个图而言,为了分群,首先要有一个表达矩阵,还要设置分群信息(例如上面我们就明确知道要分成两群),然后还要进行PCA的线性降维和tSNE进一步非线性降维。有了这些认识,那么首先使用普通的函数来尝试一下

第一种方式: 不使用R包,使用常规函数

先加载表达矩阵和分群信息
options(warn=-1) 
load('patient1.PBMC_RespD376_for_DEG.Rdata')
# 其中保存了表达矩阵(count_matrix)和分群的信息(cluster)
> count_matrix[1:4,1:4]
              AAACCTGCAACGATGG.3 AAACCTGGTCTCCATC.3 AAACGGGAGCTCCTTC.3 AAAGCAATCATATCGG.3
RP11-34P13.7                   0                  0                  0                  0
FO538757.2                     0                  0                  0                  0
AP006222.2                     0                  0                  0                  0
RP4-669L17.10                  0                  0                  0                  0
> table(cluster)
cluster
  4  10 
636 170 
根据分群因子,赋予不同颜色
# 根据分群因子,赋予不同颜色
color <- cluster
levels(color) <- rainbow(2)
> table(color)
color
#FF0000FF #00FFFFFF 
      636       170 
对表达矩阵过滤
# 首先是对基因过滤,根据标准差将那些在细胞中的表达量没有变化的基因去掉
choosed_count <- count_matrix
choosed_count <- choosed_count[apply(choosed_count, 1, sd)>0,]
# 看到过滤了5000多个基因

image-20191018163308141

# 然后选择变化差异最明显的前1000个基因
choosed_count <- choosed_count[names(head(sort(apply(choosed_count, 1, sd),decreasing = T),1000)),]
然后进行PCA分析

对行进行操作,因此需要转置,另外进行标准化

pca_out <- prcomp(t(choosed_count),scale. = T)
library(ggfortify)
autoplot(pca_out, col=color) +theme_classic()+ggtitle('PCA plot')

image-20191018164924600

PCA的全部结果可以通过str(pca_out)了解,其中坐标的信息在pca_out$x

>  pca_out$x[1:3,1:3]
                          PC1      PC2        PC3
AAACCTGCAACGATGG.3 -1.4940046 6.707691 -0.7655250
AAACCTGGTCTCCATC.3  0.1403445 3.239395  0.2672606
AAACGGGAGCTCCTTC.3 -1.9968613 3.924992 -0.4669826
再用tSNE继续降维
library(Rtsne)
# 利用PCA的前5个主成分
tsne_out <- Rtsne(pca_out$x[,1:6], perplexity = 10,
                    pca = F, max_iter = 2000,
                    verbose = T)
# tSNE的坐标结果保存在tsne_out$Y中
tsnes_cord <- tsne_out$Y
# ggplot作图
colnames(tsnes_cord) <- c('tSNE1','tSNE2')
ggplot(tsnes_cord, aes(x=tSNE1, y = tSNE2)) + geom_point(col=color) + theme_classic()+ggtitle('tSNE plot')

image-20191018165952551


第二种方式:使用Seurat

Seurat V2
PBMC <- CreateSeuratObject(count_matrix, 
                           min.cells = 1, min.features = 0, 
                           project = '10x_PBMC')
PBMC <- AddMetaData(object = PBMC, metadata = apply(count_matrix, 2, sum), col.name = 'nUMI_raw')
PBMC <- AddMetaData(object = PBMC, metadata = cluster, col.name = 'cluster')
VlnPlot(PBMC, features.plot  = c("nUMI_raw", "nGene"), 
        group.by = 'cluster',nCol = 2)

image-20191018170939612

看到第10群细胞的基因数和UMI数比第4群多很多,也就是说它们本身的“起跑线”就有差异,那么最后的PCA结果差异难道是由于基因和UMI数量导致的?

那么如果我们接下来进行校正,会发生什么?

PBMC <- ScaleData(PBMC, vars.to.regress =  c("nUMI_raw", "nGene"),
                  model.use = 'linear',
                  use.umi = F)
# 这个FindVariableGenes其实和前面的找top1000 sd基因目的一样,就是为了增加分析的有效性,认为高变化的基因存储的信息更值得关注
PBMC <- FindVariableGenes(object = PBMC, mean.function = ExpMean, 
                          dispersion.function = LogVMR, 
                          x.low.cutoff = 0.0125, x.high.cutoff = 3, 
                          y.cutoff = 0.5)
length(PBMC@var.genes)
PBMC <- RunPCA(object = PBMC, pc.genes = PBMC@var.genes)
PBMC <- RunTSNE(object = PBMC, dims.use = 1:20)
TSNEPlot(PBMC, group.by='cluster')

image-20191018171912944

这次结果发现,这两群就分不开了。从这里也反映出一些问题:本文的这个热图真的是由于生物学因素导致的吗?

猜想:可能这两群细胞本身表达的基因数量就不同,就是有一些基因在这群细胞表达,在那一群不表达

image-20191014180608595

Seurat V3
PBMC_V3 <- CreateSeuratObject(counts = count_matrix,
                                 min.cells = 1, 
                                 min.features = 0, 
                                 project = "10x_PBMC_V3")
PBMC_V3 <- AddMetaData(object = PBMC_V3, metadata = apply(count_matrix, 2, sum), col.name = 'nUMI_raw')
PBMC_V3 <- AddMetaData(object = PBMC_V3, metadata = cluster, col.name = 'cluster')
VlnPlot(PBMC_V3, features =  c("nUMI_raw", "nFeature_RNA"), ncol = 2,group.by = 'cluster')
# 同样也进行校正一下
PBMC_V3 <- ScaleData(object = PBMC_V3, vars.to.regress =  c("nUMI_raw", "nFeature_RNA"), 
                     model.use = 'linear', use.umi = FALSE)

PBMC_V3 <- FindVariableFeatures(object = PBMC_V3, mean.function = ExpMean, 
                                dispersion.function = LogVMR, 
                                mean.cutoff = c(0.0125,3), 
                                dispersion.cutoff = c(0.5,Inf))
length(VariableFeatures(object = PBMC_V3))
PBMC_V3 <- RunPCA(PBMC_V3, features = VariableFeatures(object = PBMC_V3))
pbmc_tsne <- RunTSNE(PBMC_V3, dims = 1:20)
DimPlot(pbmc_tsne, reduction = "tsne",group.by='cluster')

第三种方式:使用monocle

library(monocle) 
# 1.表达矩阵
expr_matrix <- as.matrix(count_matrix)
# 2.细胞信息
sample_ann <- data.frame(cells=names(count_matrix),  
                         cellType=cluster)
rownames(sample_ann)<- names(count_matrix)
# 3.基因信息
gene_ann <- as.data.frame(rownames(count_matrix))
rownames(gene_ann)<- rownames(count_matrix)
colnames(gene_ann)<- "genes"
# 然后转换为AnnotatedDataFrame对象
pd <- new("AnnotatedDataFrame",
          data=sample_ann)
fd <- new("AnnotatedDataFrame",
          data=gene_ann)
# 最后构建CDS对象
sc_cds <- newCellDataSet(
  expr_matrix, 
  phenoData = pd,
  featureData =fd,
  expressionFamily = negbinomial.size(),
  lowerDetectionLimit=0.5)

cds=sc_cds
cds <- detectGenes(cds, min_expr = 1)
expressed_genes <- row.names(subset(cds@featureData@data,
                                    num_cells_expressed >= 1))
length(expressed_genes)
cds <- cds[expressed_genes,]

cds <- estimateSizeFactors(cds)
cds <- estimateDispersions(cds)
disp_table <- dispersionTable(cds) # 挑有差异的
unsup_clustering_genes <- subset(disp_table, mean_expression >= 0.1) # 挑表达量不太低的
cds <- setOrderingFilter(cds, unsup_clustering_genes$gene_id)  # 准备聚类基因名单
# 进行降维
cds <- reduceDimension(cds, max_components = 2, num_dim = 6,
                       reduction_method = 'tSNE', verbose = T)
# 进行聚类
cds <- clusterCells(cds, num_clusters = 4) 
# Distance cutoff calculated to 1.812595  
plot_cell_clusters(cds, 1, 2, color = "cellType")

image-20191018174047501


第四种方式:使用scater

suppressMessages(library(scater))
## 创建 scater 要求的对象
# 在导入对象之前,最好是将表达量数据存为矩阵
sce <- SingleCellExperiment(
  assays = list(counts = as.matrix(count_matrix)), 
  colData = data.frame(cluster)
)
# 预处理
exprs(sce) <- log2(calculateCPM(sce ) + 1)
# 降维
sce <- runPCA(sce)
plotReducedDim(sce, use_dimred = "PCA", 
               colour_by= "cluster")

image-20191018174754369

set.seed(1000)
sce <- runTSNE(sce, perplexity=10)
plotTSNE(sce, 
         colour_by= "cluster")

image-20191018174803346

Yunze Liu
Yunze Liu
Bioinformatics Sharer

Co-founder of Bioinfoplanet(生信星球)

Next
Previous

Related