Cell新发现,比较喜欢学习这种新的细胞类型的发现和验证过程,还有生信代码学

文摘   2024-11-22 13:51   北京  

不设置🌟有时会收不到公众号内容,code一段时间后会失效,代码在文末

一直没太留意过成纤维细胞,看到的大部分报道都是肿瘤相关的成纤维细胞,能形成免疫抑制的肿瘤微环境,对预后不利。今天的这个维母细胞网状细胞却恰恰相反,它主要是分泌CCL19和CCL21,能够与T细胞形成特殊的环境。可以看看咱们的单细胞数据有没有这一群

揭示肺癌肿瘤微环境中的“免疫保护堡垒”:纤维母细胞网状细胞的关键角色

肺癌作为全球癌症死亡的主要原因之一,其治疗和研究一直面临复杂挑战。然而,近日发表于《Cell》杂志的一项开创性研究指出,一种名为纤维母细胞网状细胞(Fibroblastic Reticular Cells, FRCs)的特殊细胞,可能在增强抗肿瘤免疫中扮演关键角色,为非小细胞肺癌(NSCLC)的治疗提供了新思路。

FRCs构建免疫微环境:提供“抗癌护盾”

该研究由瑞士圣加伦免疫生物学研究所的Onder博士团队主导,结合高分辨率显微技术和单细胞转录组学分析,首次证实FRCs通过分泌CCL19等化学因子,在肺癌肿瘤微环境中建立了专属的T细胞免疫小环境。这些环境不仅有助于肿瘤浸润T细胞的激活,还支持它们维持长期的抗肿瘤活性。

研究团队发现,肿瘤中的FRCs与传统的淋巴器官中的FRCs具有相似的功能,能够通过组织特异性分化和复杂的分子网络,与CD8+ T细胞等免疫细胞紧密互动,形成了由三级淋巴结构(TLS)和T细胞轨道组成的互联网络。这种网络不仅增强了抗肿瘤T细胞的浸润深度,还大大提升了肿瘤的免疫控制能力。

从“前体细胞”到“保护者”:揭示FRCs的起源与分化路径

通过对肿瘤微环境中FRCs的单细胞转录组分析,研究揭示了这些细胞主要来源于血管周围的前体细胞。进一步的细胞谱系追踪实验表明,这些前体细胞在肿瘤发展过程中逐步分化为CCL19表达的FRCs亚型,包括支持T细胞轨道的“PRC”(血管周围网状细胞)和构建TLS的“TRC”(T细胞区网状细胞)。

这一发现为FRCs在肿瘤免疫调控中的核心地位提供了直接证据,也为未来靶向调控肿瘤微环境中FRCs的治疗策略提供了理论基础。

实验验证:缺失FRCs会削弱抗肿瘤免疫

为了验证FRCs在肿瘤免疫中的实际作用,研究团队使用了特定基因敲除的小鼠模型,在剔除肿瘤中FRCs的情况下观察到了显著的抗肿瘤免疫减弱现象。这不仅表现为肿瘤浸润的CD8+ T细胞数量减少,也导致了肿瘤的进一步扩展。

值得注意的是,研究还通过病毒载体疫苗模型发现,外源性增强FRCs的功能能够显著改善肿瘤的免疫微环境,促进抗肿瘤T细胞的活性。这一结果表明,FRCs的存在对于肿瘤的免疫控制具有至关重要的作用。

未来展望:FRCs的潜力与挑战

尽管这项研究揭示了FRCs在肺癌抗肿瘤免疫中的核心作用,但研究团队也指出,FRCs在不同肿瘤类型中的功能可能存在差异,尚需进一步探索。例如,目前的单细胞数据未能充分检测到CXCL13表达的细胞,而该化学因子对T细胞和B细胞的协同作用至关重要。未来,结合更精确的分子与成像技术,可能会揭示更多有关FRCs在肿瘤免疫中的复杂角色。

从临床角度来看,这项研究为NSCLC免疫治疗带来了新希望。通过靶向调控肿瘤微环境中的FRCs,或有望进一步提升免疫检查点抑制剂等疗法的效果。同时,这一发现也为开发新型免疫疗法提供了全新靶点。


下面是分析这个细胞这戏部分的代码,也有很多marker可以参考

### Load packages```{r libraries}suppressPackageStartupMessages({  library(here)  library(purrr)  library(dplyr)  library(stringr)  library(patchwork)  library(Seurat)  library(Matrix)  library(dittoSeq)  library(gridExtra)  library(gsubfn)  library(ggsci)})```
## **Stroma cells in NSCLC**
## Set directory```{r set directory}basedir <- here()```
### Read Stroma cell data```{r read stroma cell data}data <- readRDS(paste0(basedir,"/data/Human/NSCLC_stroma_total.rds"))```
### Define color palette```{r color vector}cols<- pal_igv()(51)names(cols) <- c(0:50)```
### NSCLC Stroma cells (Supplementary Figure 1K-1L){.tabset}#### Patients
```{r umap per patient}# Total fibroblasts and endothelial cells across NSCLC patientscolors_pID <-c("#F8766D","#00C08B","#00B4F0","#0ADD08","#B79F00")names(colors_pID) <-c("NSCLC#2","NSCLC#3","NSCLC#4","NSCLC#6","NSCLC#7")
DimPlot(data, reduction = "tsne", group.by = "patient", cols=colors_pID)+ theme_bw() + theme(axis.text = element_blank(), axis.ticks = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + xlab("tSNE1") + ylab("tSNE2") + ggtitle("Patients")
```
#### Origin```{r umap per origin}# Total fibroblasts and endothelial cells isolated from SM, CM and unaffected lung (LU)colors_origin <-c("red","blue" ,"#33CC00FF") names(colors_origin) <- c("Subpleural Margin","Lung (unaffected)","Central Margin")
DimPlot(data, reduction = "tsne", group.by = "origin", cols=colors_origin )+ theme_bw() + theme(axis.text = element_blank(), axis.ticks = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + xlab("tSNE1") + ylab("tSNE2") + ggtitle("Origin")```
#### COL1A2```{r feature plot COL1A2}FeaturePlot(data, reduction = "tsne", features = get_full_gene_name('COL1A2',data),raster=FALSE, cols=c("lightgrey", "darkred")) + ggtitle("CAF/FB(COL1A2)")```
#### PECAM1```{r feature plot PECAM1}FeaturePlot(data, reduction = "tsne", features = get_full_gene_name('PECAM1',data),raster=FALSE, cols=c("lightgrey", "darkred")) + ggtitle("EC(PECAM1)")```
#### Cell type```{r umap per cell type}palet <- cols[4:10]names(palet) <- c("CAF2","CAF1", "EC", "FB" ,"Meso","SMC/PC")
DimPlot(data, reduction = "tsne", group.by = "cell_type", cols= palet)+ theme_bw() + theme(axis.text = element_blank(), axis.ticks = element_blank(), panel.grid.minor = element_blank(), panel.grid.major = element_blank()) + xlab("TSNE1") +ylab("TSNE2") ```
### Dotplots (Supplementary Figure 1M and 1P) {.tabset}#### Cell type assignment ```{r dotplot stroma}data_conv <-datadata_conv <-Remove_ensebl_id(data_conv)
Idents(data_conv) <- data_conv$cell_typelevels(data_conv)<-levels(data_conv)[order(match(levels(data_conv),c("CAF2","FB","CAF1","SMC/PC","Meso","EC")))]data_conv$cell_type <- factor(as.character(data_conv@active.ident), levels = rev(c("CAF2","FB","CAF1","SMC/PC","Meso","EC")))
gene_list <-c("COL1A2","POSTN","MMP2","PDPN","PDGFRA","PDGFRB","ACTA2","RGS5","KRT19","PECAM1")
gg <- dittoDotPlot(data_conv, vars = gene_list, group.by = "cell_type", size = 9,legend.size.title = "% expressed",scale = FALSE,summary.fxn.color = mean, max = 6.5, min = 0 , min.color = "#D1E5F0" , max.color = "#631879FF")
gg + ggtitle("Celltype assignment")```
#### Chemokines```{r dotplot chemokines}gene_list <-c("CCL19","CCL21","CCL3","CCL5","CCL8","CXCL10","CXCL3","CXCL9")
gg <- dittoDotPlot(data_conv, vars = gene_list, group.by = "cell_type", size = 9,legend.size.title = "% expressed",scale = FALSE,summary.fxn.color = mean, min.percent = 0.02, max.percent = 0.7, max = 1.6, min = 0 ,min.color = "#D1E5F0" , max.color = "#631879FF")
gg + ggtitle("Chemokines")```
### Stacked Barplots (Supplementary Figure 1N and 1O) {.tabset}#### Number of cells per patient ```{r stacked barplot cells per patient}df <-data@meta.data %>% count(patient, cell_type) %>% # Group by patient and cell_type, then count number in each group mutate(pct=n/sum(n)) # Calculate percent within each patient
df$cell_type <- factor(df$cell_type, levels=names(palet))df$patient <- factor(df$patient, levels=c("NSCLC#2", "NSCLC#3" ,"NSCLC#4" ,"NSCLC#6" ,"NSCLC#7"))
ggplot(df, aes(patient, n, fill=cell_type)) + geom_bar(stat="identity") + theme( axis.line = element_line(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank()) + scale_y_continuous(expand = c(0, 0))+ labs(y= "Cells", x= " ") + scale_fill_manual(values = palet)
```
#### Number of cells per origin```{r stacked barplot cells per origin}df <-data@meta.data %>% count(origin, cell_type) %>% # Group by orign and cell_type, then count number in each group mutate(pct=n/sum(n)) # Calculate percent within each patient
df$cell_type <- factor(df$cell_type, levels=names(palet))df$origin <- factor(df$origin, levels=c("Lung (unaffected)", "Subpleural Margin", "Central Margin"))
ggplot(df,aes(origin, n, fill=cell_type)) + geom_bar(stat="identity") + theme( axis.line = element_line(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank()) + scale_y_continuous(expand = c(0, 0))+ labs(y= "Cells", x= " ") + scale_fill_manual(values = palet)```
```{r deallocate memory NSCLC stroma data, include=FALSE}remove(data)```
## **CCL19`r knitr::asis_output("\U207A")` FRCs in NSCLC**
### Read CCL19`r knitr::asis_output("\U207A")` FRC data```{r read CCL19 FRC data}NSCLC_CCL19_data <- readRDS(paste0(basedir,"/data/Human/NSCLC_CCL19_FRCs_CAFs.rds"))```
### CCL19`r knitr::asis_output("\U207A")` fibroblasts (Figure 1K)```{r umap CCL19 FRCs)}#Define color paletpalet_CCL19_FRC <- c("#1B9E77", "#54B0E4","#E3BE00", "#E41A1C")names(palet_CCL19_FRC) <- c("CAF2/TRC","CAF1/PRC","AdvFB" ,"SMC/PC")
palet_CCL19_FRC <- palet_CCL19_FRC[names(palet_CCL19_FRC) %in% unique(NSCLC_CCL19_data$cell_type)]
DimPlot(NSCLC_CCL19_data, reduction = "umap", group.by = "cell_type",cols = palet_CCL19_FRC)+ theme_bw() + theme(axis.text = element_blank(), axis.ticks = element_blank(), panel.grid.minor = element_blank(), panel.grid.major = element_blank()) + xlab("UMAP1") + ylab("UMAP2") + ggtitle(paste0("CCL19", "\U207A ", "fibroblasts"))
```
### Dotplot (Figure 1L)```{r dotplot}data_conv <-NSCLC_CCL19_data
data_conv <-Remove_ensebl_id(data_conv)
Idents(data_conv) <- data_conv$cell_typelevels(data_conv)<-levels(data_conv)[order(match(levels(data_conv),c("SMC/PC","CAF1/PRC","AdvFB","CAF2/TRC")))]data_conv$cell_type <- factor(as.character(data_conv@active.ident), levels = rev(c("SMC/PC","CAF1/PRC","AdvFB","CAF2/TRC")))
gene_list <-c("CCL19","CCL21","PDPN","FAP","POSTN","CLU","LEPR","CD34","SULF1","DPT","ICAM1","VCAM1","ACTA2","MYH11","MCAM","NOTCH3","RGS5","DES","AIFM2")
dittoDotPlot(data_conv, vars = gene_list, group.by = "cell_type", size = 8,legend.size.title = "Expression (%)",scale = FALSE) + ylab(" ") + ggtitle(paste0("CCL19", expression("\u207A"), " fibroblasts"))
```
### Signatures {.tabset}#### SLO-PRC (Figure 1M)```{r sign SLO-PRC}SLO_PRC <-list("CCL19","CCL21","ITGA1","ITGA7","MCAM","CNN1","NOTCH3","ACTA2","PDGFRB","ANGPT2")object <- AddModuleScore(object = data_conv, features = SLO_PRC, name = "SLO_PRC_signature",ctrl = 20)FeaturePlot(object = object, features = "SLO_PRC_signature10",min.cutoff = -1, max.cutoff = 2.5) + ggtitle("SLO-PRC signature")```
#### SLO-TRC (Figure 1N)```{r sign SLO-TRC}SLO_TRC <-c("CCL19","CCL21","PDPN","ICAM1","VCAM1","LUM","PDGFRA","TNFSF13B")object <- AddModuleScore(object = data_conv, features = SLO_TRC, name = "SLO_TRC_signature",ctrl = 20)FeaturePlot(object = object, features = "SLO_TRC_signature8",min.cutoff = -1, max.cutoff = 2.5) + ggtitle("SLO-TRC signature")```
### Signatures (Supplementary Figure 1Q) {.tabset}#### CCL21```{r feature plot CCL21}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('CCL21',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("CCL21")```
#### ACTA2```{r feature plot ACTA2}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('ACTA2',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("ACTA2")```
#### ITGA1```{r feature plot ITGA1}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('ITGA1',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("ITGA1")```
#### NOTCH3```{r feature plot NOTCH3}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('NOTCH3',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("NOTCH3")```
#### MCAM```{r feature plot MCAM}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('MCAM',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("MCAM")```
#### CCL19```{r feature plot CCL19}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('CCL19',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("CCL19")```
#### PDPN```{r feature plot PDPN}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('PDPN',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("PDPN")```
#### ICAM1```{r feature plot ICAM1}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('ICAM1',NSCLC_CCL19_data)[2],raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("ICAM1")```
#### VCAM1```{r feature plot VCAM1}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('VCAM1',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("VCAM1")```
#### LUM```{r feature plot LUM}FeaturePlot(NSCLC_CCL19_data, reduction = "umap", features = get_full_gene_name('LUM',NSCLC_CCL19_data),raster=FALSE, cols=c("lightgrey", "darkred"), min.cutoff = 0, max.cutoff = 4.5) + ggtitle("LUM")```
### Extract NSCLC TRC and PRC```{r subset NSCLC TRC PRC}NCLS_FRCS <- subset(NSCLC_CCL19_data, cell_type %in% c("CAF2/TRC","CAF1/PRC"))
#Preprocessingresolution <- c(0.1, 0.25, 0.4, 0.6,0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0)NCLS_FRCS <- FindVariableFeatures(NCLS_FRCS, selection.method = "vst", nfeatures = 2000)NCLS_FRCS <- ScaleData(NCLS_FRCS)NCLS_FRCS <- RunPCA(object = NCLS_FRCS, npcs = 30, verbose = FALSE,seed.use = 8734)NCLS_FRCS <- RunTSNE(object = NCLS_FRCS, reduction = "pca", dims = 1:20, seed.use = 8734)NCLS_FRCS <- RunUMAP(object = NCLS_FRCS, reduction = "pca", dims = 1:20, seed.use = 8734)NCLS_FRCS <- FindNeighbors(object = NCLS_FRCS, reduction = "pca", dims = 1:20, seed.use = 8734)for(k in 1:length(resolution)){ NCLS_FRCS <- FindClusters(object = NCLS_FRCS, resolution = resolution[k], random.seed = 8734)}
```
```{r deallocate memory CCL19 data, include=FALSE}remove(NSCLC_CCL19_data)```
### CCL19`r knitr::asis_output("\U207A")` TRC and PRC```{r umap CCL19 TRC PRC, include=FALSE}#Define color palettepalet <- palet_CCL19_FRC[names(palet_CCL19_FRC) %in% unique(NCLS_FRCS$cell_type)]
DimPlot(NCLS_FRCS, reduction = "umap", group.by = "cell_type",cols = palet)+ theme_bw() + theme(axis.text = element_blank(), axis.ticks = element_blank(), panel.grid.minor = element_blank(), panel.grid.major = element_blank()) + xlab("UMAP1") + ylab("UMAP2")```
### Save NSCLC CCL19`r knitr::asis_output("\U207A")` TRC PRC data```{r save CCL19 TRC PRC}#saveRDS(NCLS_FRCS, paste0(basedir,"/data/Human/NSCLC_CCL19_TRC_PRC_CAFs.rds"))```
### Session info```{r session info}sessionInfo()date()```

  • 后苔↩️之前贴子的岸号即可霍得之前的代码,全部代码回复今日关键词:241122

原文,引文:

Onder L, Papadopoulou C, Lütge A, Cheng HW, Lütge M, Perez-Shibayama C, Gil-Cruz C, De Martin A, Kurz L, Cadosch N, Pikor NB, Rodriguez R, Born D, Jochum W, Leskow P, Dutly A, Robinson MD, Ludewig B. Fibroblastic reticular cells generate protective intratumoral T cell environments in lung cancer. Cell.

生信钱同学
北京大学在读博士生,记录自己的学习日常🌞分享生信知识:如单细胞和空间测序、多组学分析、宏基因组、病理组学、影像组学等生物信息学、机器学习和深度学习内容🌬
 最新文章