前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CNS图表复现18—细胞亚群的比例展示

CNS图表复现18—细胞亚群的比例展示

作者头像
生信技能树jimmy
发布2020-12-11 10:06:04
2.1K0
发布2020-12-11 10:06:04
举报
文章被收录于专栏:单细胞天地

分享是一种态度

在前面的教程 CNS图表复现05—免疫细胞亚群再分类 ,我提到到免疫细胞通常是以CD45阳性为标志,第一次分群规则是 :

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

这样挑出来的immune (CD45+,PTPRC),细胞亚群继续细分可以成为: B细胞,T细胞,巨噬细胞,树突细胞等等。不过这个时候的分群就没有那么死板的规则了,很多灵活调整的余地

文章展示的一个简单的亚群分布如下:

原文的免疫细胞细分亚群

作者依据自己的生物学背景做了一些自适应的调整, 见:CNS图表复现06—根据CellMarker网站进行人工校验免疫细胞亚群

我们也可以使用如下代码检查自己的免疫细胞细分亚群的结果:

代码语言:javascript
复制
rm(list=ls())
options(stringsAsFactors = F)
library(Seurat)
library(ggplot2)

### 来源于:CNS图表复现02—Seurat标准流程之聚类分群的step1-create-sce.R
load(file = 'first_sce.Rdata')

### 来源于 step2-anno-first.R 
load(file = 'phe-of-first-anno.Rdata')

sce=sce.first
table(phe$immune_annotation)
sce
cells.use <- row.names(sce@meta.data)[which(phe$immune_annotation=='immune')]
length(cells.use)
sce <-subset(sce, cells=cells.use)  
sce 

# 实际上这里需要重新对sce进行降维聚类分群,为了节省时间
# 我们直接载入前面的降维聚类分群结果,但是并没有载入tSNE哦
## 来源于:CNS图表复现05—免疫细胞亚群再分类 
load(file = 'phe-of-subtypes-Immune-by-manual.Rdata')
sce@meta.data=phe
DimPlot(sce,reduction = "tsne",label=T, group.by = "immuSub") 
table(phe$immuSub)
genes_to_check = c("PTPRC","CD19",'PECAM1','MME','CD3G', 'CD4', 'CD8A' )
p <- DotPlot(sce, features = genes_to_check,
             assay='RNA',group.by = 'immuSub')  
p

本来是23514个细胞,挑出来了13792个免疫细胞。然后,可以看到,单个基因都不能绝对的区分某个细胞亚群:

自己的免疫细胞细分亚群标记基因混淆

调整的空间还很大,一些标记基因混淆,其实亚群可以更加细致,然后合并同类亚群,总之实际操作会非常耗费时间,这里就不展开讲解了。并不需要与原文一模一样的。

查看各个单细胞的表型信息

这13792个免疫细胞的表型信息如下所示:

代码语言:javascript
复制
> as.data.frame(table(phe$biopsy_time_status))
           Var1 Freq
1         Early 2550
2 off treatment 4068
3            PD 5389
4            PR  613
> as.data.frame(table(phe$biopsy_site))
     Var1 Freq
1 Adrenal  566
2   Brain    9
3   Liver 1944
4      LN 3279
5    lung 1172
6    Lung 4850
7  Pleura 1972

通常情况下我们并不会比较不同免疫细胞的比例差异,就好像我们做基因表达量差异分析,很少会比较不同基因之间的表达量,因为基因本来就是不同的功能,管家基因的表达量本来就是超级高,无需跟其它基因比较。我们更关心的是同一个基因在不同的组的表达量变化,同理,我们想关心的也是不同的组的某个细胞亚群比例的变化。而在这个文章里面,就是:

原文的细胞亚群在不同处理组的比例差异

首先我们可以使用前面的gplots包的balloonplot可视化方法:

代码语言:javascript
复制
library(gplots)
tab.1=table(phe$biopsy_time_status,phe$immuSub) 
balloonplot(tab.1)

如下所示:

第一次摸索差异

文章是 residual disease (RD) 和 on therapy progressive disease (PD),以及 patients before initiating systemic targeted therapy (TKI naive [TN]), 这3组。确实很诡异,但是作者提供的细胞表型列太多了了,看到我眼花缭乱,只好继续摸索,发现还有一个analysis列,就是3组:

代码语言:javascript
复制
ps=as.data.frame(table(phe$analysis,phe$biopsy_time_status))
ps=ps[ps$Freq>1,]
ps
> ps
         Var1          Var2 Freq
1  grouped_pd         Early 1129
2  grouped_pr         Early 1421
6       naive off treatment 4068
7  grouped_pd            PD 5389
11 grouped_pr            PR  613

也就是说前面的Early组仍然是可以区分成为PD和PR组,再次出图如下:

第二次摸索差异

原文给出来的是条形图,而且是比例,原图的代码是:

代码语言:javascript
复制
if(T){
  library(ggrepel)
  require(qdapTools)
  require(REdaS)
  # 
  metadata <- phe
  # Keep only cells from tissues that are not brain or pleura 
  metadata <- metadata[-which(metadata$biopsy_site=="Brain" | metadata$biopsy_site=="Pleura"),]
  # Convert to factor with logical order 
  metadata$analysis <- factor(metadata$analysis, levels = c("naive", "grouped_pr", "grouped_pd"))
  # Create table and keep selected cell types 
  meta.temp <- metadata[,c("immuSub", "analysis")]
  # Loop over treatment response categories 
  # Create list to store frequency tables 
  prop.table.error <- list()
  for(i in 1:length(unique(meta.temp$analysis))){
    vec.temp <- meta.temp[meta.temp$analysis==unique(meta.temp$analysis)[i],"immuSub"]
    # Convert to counts and calculate 95% CI 
    # Store in list 
    table.temp <- freqCI(vec.temp, level = c(.95))
    prop.table.error[[i]] <- print(table.temp, percent = TRUE, digits = 3)
    # 
  }
  # Name list 
  names(prop.table.error) <- unique(meta.temp$analysis)
  # Convert to data frame 
  tab.1 <- as.data.frame.array(do.call(rbind, prop.table.error))
  # Add analysis column 
  b <- c()
  a <- c()
  for(i in names(prop.table.error)){
    a <- rep(i,nrow(prop.table.error[[1]]))
    b <- c(b,a)
  }
  tab.1$analysis <- b
  # Add common cell names 
  aa <- gsub(x = row.names(tab.1), ".1", "")
  aa <- gsub(x = aa, ".2", "")
  tab.1$cell <- aa
  # 
  # Resort factor analysis 
  tab.1$analysis <- factor(tab.1$analysis, levels = c("naive", "grouped_pr", "grouped_pd"))
  # Rename percentile columns 
  colnames(tab.1)[1] <- "lower"
  colnames(tab.1)[3] <- "upper"
  # 
  p<- ggplot(tab.1, aes(x=analysis, y=Estimate, group=cell)) +
    geom_line(aes(color=cell))+
    geom_point(aes(color=cell)) + facet_grid(cols =  vars(cell)) + 
    theme(axis.text.x = element_text(angle = 45, hjust=1, vjust=0.5), legend.position="bottom") + 
    xlab("") + 
    geom_errorbar(aes(ymin=lower, ymax=upper), width=.2,position=position_dodge(0.05))
  p1<- ggplot(tab.1, aes(x=analysis, y=Estimate, group=cell)) +
    geom_bar(stat = "identity", aes(fill=cell)) + facet_grid(cols =  vars(cell)) + 
    theme_bw() +  
    theme(axis.text.x = element_text(angle = 45, hjust=1, vjust=0.5), legend.position= "none") + 
    xlab("") + 
    geom_errorbar(aes(ymin=lower, ymax=upper), width=.2,position=position_dodge(0.05)) 
  p1
}

首先,我觉得作者的数据转换代码很弱,其次绘图太复杂了,我就懒得解读了。

用我们的数据出图效果是:

作者的代码绘制我们的数据

可以看到,其实与前面的gplots包的balloonplot可视化差不多效果。

也可以具体看病人:

细胞比例变化深入到不同组的具体某个病人

主要是为了说明前面的细胞亚群比例变化,即使深入到具体的某个病人也是如此,绘图细节我这里 就不细讲了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 单细胞天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 查看各个单细胞的表型信息
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档