說在前面
免疫檢查點(diǎn)抑制劑是腫瘤治療的革命性藥物推正,然而目前還不清楚為什么一些患者對檢查點(diǎn)抑制劑療法有反應(yīng),而另一些則沒有嘱支。在Sade-Feldman等人2018年的一項(xiàng)Cell研究中袁滥,作者描述了免疫檢查點(diǎn)封鎖前后黑色素瘤患者免疫細(xì)胞的單細(xì)胞轉(zhuǎn)錄譜,目的是確定與檢查點(diǎn)治療成功或失敗相關(guān)的因素革屠。他們的研究表明,在腫瘤組織中發(fā)現(xiàn)的兩種CD8 T細(xì)胞狀態(tài)之間的平衡(本質(zhì)上是記憶型和耗盡型)與檢查點(diǎn)封鎖后的腫瘤退化有關(guān)排宰。特別是似芝,腫瘤中TCF7+ CD8 T細(xì)胞的浸潤程度預(yù)示著ICB應(yīng)答和更好的生存時(shí)間。
那么本期推文板甘,Immugent就通過實(shí)操使用ProjecTILs党瓮,來對各種腫瘤浸潤T細(xì)胞亞型進(jìn)行鑒定,從而對ICB治療效果進(jìn)行預(yù)測盐类,這也同時(shí)可以檢測利用小鼠參考圖譜預(yù)測人的單細(xì)胞數(shù)據(jù)的效果寞奸。
代碼實(shí)現(xiàn)
第一步還是要先準(zhǔn)備輸入數(shù)據(jù)。
library(ggplot2)
library(ProjecTILs)
library(gridExtra)
cached.object <- "SadeFeldman.seurat.rds"
if (!file.exists(cached.object)) {
library(GEOquery)
geo_acc <- "GSE120575"
datadir <- "input/SadeFeldman"
gse <- getGEO(geo_acc)
series <- paste0(geo_acc, "_series_matrix.txt.gz")
system(paste0("mkdir -p ", datadir))
getGEOSuppFiles(geo_acc, baseDir = datadir)
## Load expression matrix and metadata
exp.mat <- read.delim(sprintf("%s/%s/GSE120575_Sade_Feldman_melanoma_single_cells_TPM_GEO.txt.gz",
datadir, geo_acc), header = F, sep = "\t")
genes <- exp.mat[c(-1, -2), 1]
cells <- as.vector(t(exp.mat[1, 2:16292]))
samples <- as.factor(t(exp.mat[2, 2:16292]))
exp.mat <- exp.mat[c(-1, -2), 2:16292]
colnames(exp.mat) <- cells
rownames(exp.mat) <- genes
meta <- read.delim(sprintf("%s/%s/GSE120575_patient_ID_single_cells.txt.gz",
datadir, geo_acc), header = T, sep = "\t", skip = 19, nrows = 16291)
meta <- meta[, 1:7]
treat <- factor(ifelse(grepl("Post", samples), "Post", "Pre"))
response <- factor(meta$characteristics..response)
therapy <- factor(meta$characteristics..therapy)
## Create Seurat object and add meta data
query.object <- CreateSeuratObject(counts = exp.mat, project = "SadeFeldman",
min.cells = 10)
rm(exp.mat)
query.object@meta.data$Sample <- samples
query.object@meta.data$Time <- treat
query.object@meta.data$Response <- response
query.object@meta.data$Therapy <- therapy
saveRDS(query.object, file = cached.object)
} else {
query.object <- readRDS(cached.object)
}
query.object <- subset(query.object, subset = Time == "Pre")
table(query.object$Sample)
下面就是常規(guī)的ProjecTILs流程在跳,需要注意的是和上一期使用的參考數(shù)據(jù)是不一樣的枪萄。
ref <- load.reference.map()
query.projected <- make.projection(query.object, ref = ref)
plot.projection(ref, query.projected)
query.projected <- cellstate.predict(ref = ref, query = query.projected)
table(query.projected$functional.cluster)
query.list <- SplitObject(query.projected, split.by = "Response")
plot.states.radar(ref, query = query.list, min.cells = 50, genes4radar = c("Foxp3",
"Cd4", "Cd8a", "Tcf7", "Ccr7", "Gzmb", "Pdcd1", "Havcr2", "Tox", "Entpd1", "Cxcr5",
"Ifng", "Cxcl13", "Xcl1", "Itgae"))
data(Hs2Mm.convert.table)
which.genes <- c("TCF7", "GZMB", "CD8B", "PDCD1", "ITGAE")
Hs2Mm.convert.table[Hs2Mm.convert.table$Gene.HS %in% which.genes, ]
query.list <- SplitObject(query.projected, split.by = "Response")
pll <- list()
pll[[1]] <- plot.projection(ref, query.list[["Responder"]]) + ggtitle("Responder")
pll[[2]] <- plot.statepred.composition(ref, query.list[["Responder"]], metric = "Percent") +
ggtitle("Responder") + ylim(0, 40)
pll[[3]] <- plot.projection(ref, query.list[["Non-responder"]]) + ggtitle("Non-responder")
pll[[4]] <- plot.statepred.composition(ref, query.list[["Non-responder"]], metric = "Percent") +
ggtitle("Non-responder") + ylim(0, 40)
grid.arrange(grobs = pll, ncol = 2, nrow = 2, widths = c(1.5, 1))
which.types <- table(query.projected$functional.cluster) > 20
stateColors_func <- c("#edbe2a", "#A58AFF", "#53B400", "#F8766D", "#00B6EB", "#d1cfcc",
"#FF0000", "#87f6a5", "#e812dd")
states_all <- levels(ref$functional.cluster)
names(stateColors_func) <- states_all
cols_use <- stateColors_func[names(which.types)][which.types]
# Responder vs non Responder
query.projected$functional.cluster <- factor(query.projected$functional.cluster,
levels = states_all)
query.list <- SplitObject(query.projected, split.by = "Response")
norm.c <- table(query.list[["Non-responder"]]$functional.cluster)/sum(table(query.list[["Non-responder"]]$functional.cluster))
norm.q <- table(query.list[["Responder"]]$functional.cluster)/sum(table(query.list[["Responder"]]$functional.cluster))
foldchange <- norm.q[which.types]/norm.c[which.types]
foldchange <- sort(foldchange, decreasing = T)
tb.m <- melt(foldchange)
colnames(tb.m) <- c("Cell_state", "Fold_change")
pll <- list()
ggplot(tb.m, aes(x = Cell_state, y = Fold_change, fill = Cell_state)) + geom_bar(stat = "identity") +
scale_fill_manual(values = cols_use) + geom_hline(yintercept = 1) + scale_y_continuous(trans = "log2") +
theme(axis.text.x = element_blank(), legend.position = "left") + ggtitle("Responder vs. Non-responder")
利用投射函數(shù)的同源映射功能,在上面的結(jié)果中Immugent展示了如何利用參考小鼠TIL圖譜猫妙,直接分析人類腫瘤浸潤的scRNA-seq數(shù)據(jù)瓷翻。基因表達(dá)譜證實(shí)了T細(xì)胞在主要的CD4+和CD8+類型,以及更具體的亞型(CD8_Tex, CD8_Tpex, Naive-like, Follicular helper, Th1, and T regulatory CD4+ cells)中進(jìn)行準(zhǔn)確的映射齐帚。
小結(jié)
對有應(yīng)答和無應(yīng)答的黑色素瘤患者在基線時(shí)TILs的轉(zhuǎn)錄譜和細(xì)胞狀態(tài)的比較證實(shí)了Sade-Feldman等人的原始結(jié)論妒牙,即TCF7+ CD8 TILs的頻率與檢查點(diǎn)治療的反應(yīng)性相關(guān)。然而对妄,與反應(yīng)相關(guān)的TCF7+ CD8 TIL群體似乎對應(yīng)的是一種幼稚狀態(tài)湘今,而不是先前在小鼠癌癥和慢性感染模型中表征的(PD-1+ TOX+)前體耗盡狀態(tài)。此外饥伊,這種幼稚樣TIL群體不太可能具有腫瘤特異性象浑,特別是在克隆擴(kuò)增缺乏強(qiáng)有力證據(jù)的情況下,因?yàn)镻D-1- CD8 TIL中腫瘤反應(yīng)細(xì)胞的頻率在黑色素瘤腫瘤中非常低琅豆。這似乎與其他研究不一致愉豺,這些研究表明PD-1+耗盡樣CD8 T細(xì)胞的存在可以預(yù)測黑色素瘤和非小細(xì)胞肺癌對檢查點(diǎn)封鎖的反應(yīng)。然而茫因,在這個(gè)數(shù)據(jù)集中蚪拦,來自有應(yīng)答者和無應(yīng)答者的大多數(shù)腫瘤都包含一個(gè)表達(dá)PD-1 (PDCD1)、CD39 (ENTPD1)冻押、CXCL13驰贷、CD103 (ITGAE)的耗竭型CD8 T細(xì)胞,即使在無應(yīng)答者中這種細(xì)胞的頻率更高洛巢。
因此括袒,腫瘤中PD-1+ CD8 T細(xì)胞的存在可能是治療成功所必需的,但還不夠稿茉。其他因素锹锰,包括CD8 TIL浸潤總量、空間分布等漓库,可能與幼稚型CD8 TIL的存在有關(guān)恃慧,并與改善的反應(yīng)有關(guān)。例如渺蒿,我們還能觀察到痢士,應(yīng)答的腫瘤中Th1樣和幼稚樣CD4 T細(xì)胞的頻率較高,而調(diào)節(jié)性CD4 T細(xì)胞的頻率較低茂装,這可能也有助于免疫治療后抗腫瘤反應(yīng)的改善怠蹂。
總之,在穩(wěn)定圖譜的背景下少态,對人類T細(xì)胞數(shù)據(jù)的投射分析提供了一個(gè)穩(wěn)定的框架來比較不同組和條件下的樣本褥蚯,并給出了與免疫治療反應(yīng)相關(guān)的T細(xì)胞狀態(tài)的更完整的細(xì)胞構(gòu)成。雖然通過上面的結(jié)果已經(jīng)證明况增,穩(wěn)健的同源信號可以通過將人類數(shù)據(jù)投影到參考小鼠圖譜中來提取,但人-小鼠圖譜繪制也將有利于構(gòu)建穩(wěn)定的人類圖譜训挡,其中個(gè)體間的可變性是一個(gè)主要障礙澳骤。
好啦歧强,本期分享到這就結(jié)束啦,我們下期再會为肮。