前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从空间聚类的角度看结直肠癌肝转移的细胞异质性

从空间聚类的角度看结直肠癌肝转移的细胞异质性

原创
作者头像
追风少年i
发布2023-06-28 15:16:38
3211
发布2023-06-28 15:16:38
举报
作者,Evil Genius
今天分享的内容来自于文献Single-cell and spatial transcriptome analysis reveals the cellular heterogeneity of liver metastatic colorectal cancer, 2023年6月发表于SCIENCE ADVANCES,IF 9.79分,可见随着单细胞空间联合分析的越来越深入,发文的难度也在提升。
首先我们需要确立一个观点,那就是之前我们都在强调单细胞空间的联合分析注释空间转录组,但很多时候过于精细往往会忽略结构的整体作用,所以空间聚类的作用凸显了出来,尤其在组织形态的加持下,当然了,细胞类型的精确匹配也是非常重要,这也是为什么都在提时空组学的原因。
华大的时空组学是目前国内最好的平台,而且匹配了华大研究院专门分析研究时空组学数据,在这里虽然我不是华大的人,但还是很希望有朝一日投入到国产的时空组学研究中去,同时也能离家近一点,希望有机会吧,天津华大研究院,不过目前还是主要10X时空组项目居多。

好了,开始我们今天的结直肠癌的时空研究,其中文献的思路是最主要的。

结直肠癌(CRC)是一种恶性肿瘤,其中部分CRC存在转移性,尤其是肝转移,这也是预后较差的一个指标。转移过程涉及多个步骤,包括癌细胞从原发肿瘤部位逃逸、在血流中存活、在远处部位播散,最终生长为转移性肿瘤。癌细胞和基质细胞之间的交流在促进转移扩散中起着至关重要的作用。这种交流通过分泌细胞因子、生长因子和蛋白酶来重塑肿瘤微环境(TME)。TME是一种复杂的细胞组成,包括不同群体的成纤维细胞和免疫细胞,所有这些细胞在癌症逃避、转移和对治疗的反应中发挥重要作用。所以时空组学的研究就在于发现两种肿瘤之间的区别。

首先第一步,仍然是CRC单细胞全图谱(BD平台),包括原发性CRC和肝转移瘤。包括原发性CC、邻近正常结直肠黏膜(CN)、肝转移(LM)、邻近正常肝组织(LN)和外周血(PB)。

我们这里注意下细胞注释的细节,根据EPCAM和SOX9的表达鉴定肿瘤细胞,根据COL1A1和COL1A2的表达鉴定成纤维细胞,根据PECAM1和CD34的表达鉴定内皮细胞。免疫细胞鉴定为T细胞(CD3)、自然杀伤(NK)细胞(CD56)、B细胞/浆细胞(CD19)、单核细胞/巨噬细胞(CD14)、树突状细胞(dc) (HLA.DRA)和肥大细胞(TPSAB1)。当然这里也要注意细胞分布的样本特异性

第二步就是CRC和肝转移瘤的空间图谱

1、通过苏木素-伊红(he)染色和基因表达特征鉴定每个样本的肿瘤区域(T)和癌旁区域(PT)。 2、癌旁组织和肿瘤组织的差异分析,并对空间数据聚类识别肿瘤的空间异质性。 3、整合单细胞空间的数据,识别空间每个区域的细胞类型组成(这个单细胞空间联合的方法是SPOTlight),ST组织中鉴定出B细胞、T细胞、NK细胞、浆细胞、髓样细胞、肿瘤细胞、成纤维细胞和内皮细胞。这些细胞簇的比例和分数在每个区域都不同。细胞类型在癌区和癌旁有不同的分布模式。

第三步,研究原发性和肝转移肿瘤细胞的异质性

注意这里是研究同一种细胞类型---肿瘤细胞,不同条件下的异质性,之前的内容讲到过,转录因子(TF)分析和GSVA分析主要针对这种情况,以此来鉴别肿瘤细胞前后发生的调控变化。

微环境重塑髓系细胞组成

在肿瘤微环境(TME)中,髓系细胞是由单核/巨噬细胞、传统树突状细胞(cdc)和肥大细胞组成的异质性亚群。髓系细胞在不同部位的分布模式不同,具有器官特异性。

髓系细胞免疫图谱
髓系细胞免疫图谱

CXCL13+ T cells are enriched in liver metastatic tumors

在适应性免疫应答中,T细胞尤其是CD8+ T细胞和CD4+ T细胞发挥主导作用。分析中发现CD8+ T细胞和CD4+ T细胞都包含一个表达CXCL13的cluster,CXCL13是已知与CXCR5相互作用的趋化因子。与正常肝组织(LN)相比,CD8_CXCL13细胞在肝转移(LM)中显著升高,而在正常结直肠黏膜(CN)、LN和外周血(PB)中很少检测到。进一步分析CXCL13+ T细胞亚群的特征。基因集变异分析(Gene set variation analysis, GSVA)显示CD8_CXCL13亚群富集T细胞增殖通路,而CD4_CXCL13亚群富集G2-M检查点通路,表明这两个亚群的增殖特性。对每个cluster内的基因表达进行的分析表明,CD8_CXCL13细胞高水平表达ITGAE,这是组织驻留记忆T (TRM)细胞的标志物。

CD8_CXCL13和CD4_CXCL13细胞在结直肠癌LM中表达上调,其机制可能与高增殖能力有关。

CXCL13+ T细胞与结直肠癌患者的良好预后相关

在TME中富集的CXCL13+ T细胞是一个肿瘤反应性的亚群,有助于改善CRC患者的预后。

Distinct subsets of fibroblasts exist in the primary and liver metastatic tumors of CRC

成纤维细胞是肿瘤微环境(TME)中基质非免疫细胞的主要类型,在多种肿瘤中表现出显著的异质性。在这项研究中,研究人员旨在表征原发性结直肠癌(CC)和肝转移(LM)肿瘤中的成纤维细胞亚群。观察到所有的成纤维细胞都高表达ACTA2,这是一种广泛认可的癌症相关成纤维细胞(CAFs)的标志物。

分析揭示了结直肠癌原发肿瘤和肝转移肿瘤之间不同的表型特征和不同比例的成纤维细胞亚群。这些发现强调了TME在不同癌症环境中的细胞异质性

The F3-expressing fibroblast subset enriched in the primary tumors secretes protumor factors and is associated with poor prognosis of CRC patients

为了了解在CC和LM中富集的不同成纤维细胞如何促进肿瘤微环境(TME)的重塑,研究者进一步分析了F2_MCAM和F4_F3亚群的特征。F2_MCAM亚群富集了参与NOTCH信号通路的JAG1和NOTCH3。另一方面,F4_F3亚群表现出C3和CXCL1的富集,表明其参与补体和炎症反应通路。此外,F4_F3高表达MMP2和MMP3,这可能有助于细胞外基质的组织。此外,F4_F3亚群富集了与血管生成和肿瘤侵袭相关的肿瘤因子,包括VEGFA, NRG1, HGF, GDF15, AREG和BMP2。

进一步分析发现F4_F3成纤维细胞和肿瘤细胞之间存在相互作用,特别是通过NRG1和ERBB3通路。ERBB3主要表达于肿瘤细胞,可与ERBB2形成异源二聚体,促进肿瘤细胞增殖和对结直肠癌靶向治疗西妥昔单抗的耐药。空间转录组学(ST)分析显示F4_F3成纤维细胞与周围erbb3阳性的肿瘤细胞NRG1共定位

在CC中富集的F4_F3成纤维细胞亚群与肿瘤因子的分泌、参与NRG1-ERBB3通路以及CRC患者较差的预后相关。这些发现阐明了成纤维细胞在TME形成中的作用及其对肿瘤进展和患者结局的影响

The MCAM-expressing fibroblast in TME of LM modulates the generation of CD8_CXCL13 cells through the Notch signaling pathway

研究探讨了Notch信号通路在CD8_CXCL13和CD4_CXCL13亚群中对CXCL13表达的调节作用。我们发现Notch信号转录因子RBPJ在两个亚群中均优先表达。RBPJ在LM中的表达与CXCL13、ITGAE呈正相关,而在CC中未观察到。CD8_CXCL13和CD4_CXCL13亚群主要表达NOTCH1受体。对Notch配体的分析表明,它们主要表达于成纤维细胞和内皮细胞。具体而言,F2_MCAM子集富集了JAG1, F5_COCH子集富集了DLL1, E2_DLL4子集富集了DLL4、JAG1和JAG2。

交互作用分析显示,E2_DLL4内皮细胞亚群与CXCL13+ T细胞的交互作用最强,而F2_MCAM成纤维细胞亚群与CD8_CXCL13和CD4_CXCL13通过JAG1-NOTCH1相互作用。研究人员推测,F2_MCAM亚群由于其在TME中的分布模式,参与了CXCL13+ T细胞中Notch信号的激活。患者分析显示,F2_MCAM-high组在LM中CD8_CXCL13亚群比例更高。同样,F2_MCAM在LM中的浸润评分与CD8_CXCL13亚群的浸润评分相关,而在CC中则不相关。

空间转录组学(ST)分析证实了F2_MCAM和CD8_CXCL13在LM中的浸润相关。此外,与CC相比,Notch信号通路在LM中的相互作用强度更高,可能是由于在LM中F2_MCAM亚群的比例更高。此外,本研究还通过预测RBPJ在CXCL13启动子上的结合位点,探讨了Notch信号通路对CXCL13表达的潜在调节作用,提示RBPJ可能是一个影响CXCL13表达的转录因子。

研究结果表明Notch信号通路在CD8_CXCL13和CD4_CXCL13亚群中调节CXCL13的表达,其中F2_MCAM成纤维细胞亚群在CXCL13+ T细胞中激活Notch信号通路中起关键作用。成纤维细胞、Notch信号和CXCL13表达之间的相互作用为TME的复杂性及其对抗肿瘤免疫的影响提供了见解。

Intercellular interaction network in ST tissues(通讯分析居然放在了最后,分析方法采用了cellphoneDB)

原发肿瘤和肝转移肿瘤间质室内的细胞相互作用。VEGFA-NRP1和VEGFA-NRP2配体-受体对在原发性和肝转移性肿瘤中均有富集,表明它们参与了肿瘤的发生和进展。此外,分析发现原发肿瘤(CC)和肝转移肿瘤(LM)之间富集的配体-受体对不同。具体而言,ERBB3-NRG1对在原发肿瘤亚群C1和C3中富集,而在肝转移肿瘤亚群L1和L2中缺失,表明其在原发肿瘤的发展和转移中具有潜在作用。

方法需要注意的地方

SCENIC分析

最后,附上图中绘制堆叠小提琴图的代码

source 脚本

代码语言:javascript
复制
library(Seurat)
library(Rmisc)
library(ggplot2)

####**** function part ****####
stacked_violin_plot=function(gene,seurat_object,cluster=NULL,limits.max=7,
         width=13,height=10.3,flip=T,filename="",text.size=10,Mean=T,
         col=colors){
  if(length(cluster)>0){
    seurat_object=subset(seurat_object,idents = cluster)
  }
  ave_expression=AverageExpression(seurat_object,assays = "RNA")$RNA
  ave_expression=log2(ave_expression+1)
  data_matrix=seurat_object@assays$RNA@data
  plot.list=list()
  #g=gene[5]
  no=1
  gene=c(gene[1],gene,gene[length(gene)])
  for (g in gene) {
      ave_gene_choose=ave_expression[which(rownames(ave_expression)==g),]
      data_matrix_choose=data_matrix[which(rownames(data_matrix)==g),]
      #data_matrix_choose=as.data.frame(data_matrix_choose)
      df=data.frame(expression=as.numeric(data_matrix_choose),cluster=as.character(seurat_object@active.ident))
      mean=vector()
      ave_gene_choose=as.data.frame(ave_gene_choose)
      if(Mean==T){
        for (i in df$cluster) {
          mean=c(mean,ave_gene_choose[i,])
        }
        df[,"mean"]=as.data.frame(mean)
        df=as.data.frame(df)
      }
    
  if(!flip){
    df[,"cluster"]=factor(df$cluster,levels=levels(seurat_object))
    if(Mean==F){
      p <- ggplot(df, aes(x=cluster, y=expression, fill= cluster, color=cluster))+
        geom_violin(scale="width") +
        labs(title=paste(g), y ="Expression", x="Cluster")+
        #theme_classic() +
        scale_fill_manual(values = col)+
        scale_color_manual(values = col)+
        theme(axis.title.y =  element_blank())+
        #theme(axis.ticks.y =  element_blank())+
        #theme(axis.line.y =   element_blank())+
        #theme(axis.text.y =   element_blank())+
        theme(axis.title.x = element_blank())+
        theme(legend.position="none" )
    }else{
      p <- ggplot(df, aes(x=cluster, y=expression, fill= mean, color=mean))+
        geom_violin(scale="width") +
        labs(title=paste(g), y ="Expression", x="Cluster")+
        #theme_classic() +
        scale_color_gradientn(colors = c("#FFFF00", "#FFD000","#FF0000","#360101"),
                              limits=c(0,limits.max))+
        scale_fill_gradientn(colors = c("#FFFF00", "#FFD000","#FF0000","#360101"),
                             limits=c(0,limits.max))+
        theme(axis.title.y =  element_blank())+
        #theme(axis.ticks.y =  element_blank())+
        #theme(axis.line.y =   element_blank())+
        #theme(axis.text.y =   element_blank())+
        theme(axis.title.x = element_blank())+
        theme(legend.position="none" )
    }
    
    if(no!=length(gene)){
      p<-p+
        theme( axis.line.x=element_blank(),
               axis.text.x = element_blank(),
               axis.ticks.x = element_blank())
    }else{
      p<-p+
        theme(axis.text.x = element_text(size = 10,vjust = 0.5,face = "bold",color = "black"))
    }
    #p<-p+theme(plot.title = element_text(size=text.size,face="bold",hjust = 0.5))
    p=p+theme(panel.border = element_rect(fill = "NA",size = 0.5,color = "black"),
              panel.background = element_blank(),
              panel.grid = element_blank())
    if(no==1){
      plot.margin=unit(c(0.2, 0.5, 0.2, 0.5), "cm")
      p=p+theme(legend.title = element_text(size = 9,face = "bold"), 
            legend.text  = element_text(size = 9,face = "bold"),
            legend.key.size = unit(1, "lines"))
      legend.position="none"
    }else if(no==length(gene)){
      plot.margin=unit(c(-0.3, 0.5, 0.2, 0.5), "cm")
      legend.position="none"
    }else{
      plot.margin=unit(c(-0.74, 0.5, 0, 0.5), "cm")
      legend.position="none"
    }
    p=p+xlab("") + ylab(g) + ggtitle("") +
      theme(legend.position = legend.position,
            #axis.text.x = element_blank(),
            axis.text.y = element_blank(),
            #axis.ticks.x = element_blank(),
            axis.ticks.y = element_blank(),
            axis.title.y = element_text(size=text.size,face="bold",hjust = 0.5),
            plot.margin = plot.margin )
    
    if(length(plot.list)==0){
      plot.list=list(p)
    }else{
      plot.list=c(plot.list,list(p))
    }
    no=no+1
  }else{
    ####******########
    df$cluster=factor(df$cluster,levels=rev(levels(seurat_object)))
    if(Mean==F){
      p <- ggplot(df, aes(x=cluster, y=expression, fill= cluster, color=cluster))+
        geom_violin(scale="width") +
        labs(title=paste(g), y ="Expression", x="Cluster")+
        #theme_classic() +
        scale_fill_manual(values = col)+
        scale_color_manual(values = col)+
        theme(axis.title.y =  element_blank())+
        #theme(axis.ticks.y =  element_blank())+
        #theme(axis.line.y =   element_blank())+
        #theme(axis.text.y =   element_blank())+
        theme(axis.title.x = element_blank())+
        theme(legend.position="right")
    }else{
      p <- ggplot(df, aes(x=cluster, y=expression, fill= mean, color=mean))+
        geom_violin(scale="width") +
        labs(title=paste(g), y ="Expression", x="Cluster")+
        #theme_classic() +
        scale_color_gradientn(colors = c("#FFFF00", "#FFD000","#FF0000","#360101"),
                              limits=c(0,limits.max))+
        scale_fill_gradientn(colors = c("#FFFF00", "#FFD000","#FF0000","#360101"),
                             limits=c(0,limits.max))+
        theme(axis.title.y =  element_blank())+
        #theme(axis.ticks.y =  element_blank())+
        #theme(axis.line.y =   element_blank())+
        #theme(axis.text.y =   element_blank())+
        theme(axis.title.x = element_blank())+
        theme(legend.position="right")
    }

    
    if(no!=length(gene)){
      p<-p+
        theme( axis.line.x=element_blank(),
               axis.text.x = element_blank(),
               axis.ticks.x = element_blank())
    }else{
      p<-p+
        theme(axis.text.x = element_text(size = 10,vjust = 0.2,face = "bold",color = "black"))
    }
    p<-p+theme(plot.title = element_text(size=4,face="bold",hjust = 0.5,color = "black"))
    p=p+theme(panel.border = element_rect(fill = "NA",size = 0.5,color = "black"),
              panel.background = element_blank(),
              panel.grid = element_blank())
    if(no==1){
      plot.margin=unit(c(0.5, 0.5, 0.5, 0.2), "cm")
      p=p+theme(legend.title = element_text(size = 9,face = "bold"), 
                legend.text  = element_text(size = 9,face = "bold"),
                legend.key.size = unit(0.5, "lines"))
      #legend.position="left"
    }else if(no==length(gene)){
      plot.margin=unit(c(0.5, 0.2, 0.5, 0.3), "cm")
      #legend.position="none"
    }else{
      plot.margin=unit(c(0.5, 0, 0.5, -0.11), "cm")
      #legend.position="none"
    }
    if(no==1){
      p=p+xlab("") + ylab("") +
        theme(legend.position = "none",
              axis.text.x = element_blank(),
              #axis.text.y = element_blank(),
              axis.ticks.x = element_blank(),
              #axis.ticks.y = element_blank(),
              #axis.title.x = element_text(size=10,face="bold",hjust = 0.5),
              plot.title = element_text(colour = "black", face = "bold", 
                                        size = text.size, vjust = 0.2),
              axis.text.y = element_text(size=10,face="bold",hjust = 1,color = "black"),
              plot.margin = plot.margin )+coord_flip()
    }else if(no==length(gene)){
      p=p+xlab("") + ylab("") +
        theme(legend.position = "right",
              axis.text.x = element_blank(),
              axis.text.y = element_blank(),
              axis.ticks.x = element_blank(),
              axis.ticks.y = element_blank(),
              #axis.title.x = element_text(size=10,face="bold",hjust = 0.5),
              plot.title = element_text(colour = "black", face = "bold", 
                                        size = text.size, vjust = 0.2),
              #axis.text.y = element_text(size=10,face="bold",hjust = 1,color = "black"),
              plot.margin = plot.margin )+coord_flip()
    }else{
      p=p+xlab("") + ylab("") +
        theme(legend.position = "none",
              axis.text.x = element_blank(),
              axis.text.y = element_blank(),
              axis.ticks.x = element_blank(),
              axis.ticks.y = element_blank(),
              #axis.title.x = element_text(size=10,face="bold",hjust = 0.5),
              plot.title = element_text(colour = "black", face = "bold", 
                                        size = text.size, vjust = 0.2),
              #axis.text.y = element_text(size=10,face="bold",hjust = 1,color = "black"),
              plot.margin = plot.margin )+coord_flip()
    }
    
    
    if(length(plot.list)==0){
      plot.list=list(p)
    }else{
      plot.list=c(plot.list,list(p))
    }
    no=no+1
  }
  }
  pdf(paste0(filename,"_vln_manual",".pdf"),width = width,height = height)
  if(flip){
    m=multiplot(plotlist = plot.list,cols = length(gene))
  }else{
    m=multiplot(plotlist = plot.list,cols=1)
  }
  dev.off()
}
用法
代码语言:javascript
复制
stacked_violin_plot(gene = c("CD40","CD80","CD86"),col = colors_myeloid,
                    filename = "Figure 3H.CD40",seurat_object = myeloid.combined,
                    Mean = T,flip = F,width = 10,height = 4,legend.position = "right",
                    limits.max = 3)

文章所有的代码放在了这里,大家随意查看下载

链接:https://pan.baidu.com/s/1jlVm6Ojx9Tx-Sh7Zyrv31g?pwd=ZyfO 提取码:ZyfO

生活很好,有你更好

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 作者,Evil Genius
  • 今天分享的内容来自于文献Single-cell and spatial transcriptome analysis reveals the cellular heterogeneity of liver metastatic colorectal cancer, 2023年6月发表于SCIENCE ADVANCES,IF 9.79分,可见随着单细胞空间联合分析的越来越深入,发文的难度也在提升。
  • 华大的时空组学是目前国内最好的平台,而且匹配了华大研究院专门分析研究时空组学数据,在这里虽然我不是华大的人,但还是很希望有朝一日投入到国产的时空组学研究中去,同时也能离家近一点,希望有机会吧,天津华大研究院,不过目前还是主要10X时空组项目居多。
  • CXCL13+ T cells are enriched in liver metastatic tumors
    • 方法需要注意的地方
      • 最后,附上图中绘制堆叠小提琴图的代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档