作者,Evil Genius
2025年诺贝尔奖陆续颁布了,其中医学或生理学奖颁给了Treg细胞的发现。
研究共同阐明,由FOXP3 基因主导编码的转录因子是CD4+CD25+调节性T细胞 其谱系确立、发育及免疫抑制功能行使的核心分子枢纽。该突破性发现不仅为自身免疫病、器官移植及肿瘤免疫等领域的病理机制提供了全新的分子阐释,更推动了以靶向调节性T细胞为核心的免疫治疗新策略的蓬勃发展。
其中在单细胞空间的分析中,这也是一种非常重要的T细胞亚群。
Treg通过多种机制在肿瘤微环境中主动抑制抗肿瘤免疫,是驱动肿瘤免疫逃逸的关键角色。
其具体分子与细胞机制如下:
免疫抑制性细胞因子的分泌:Treg通过释放TGF-β 和IL-10 等关键免疫抑制因子,直接抑制效应性T细胞与自然杀伤细胞的活化和增殖,从而在肿瘤局部营造一个功能性的免疫抑制微环境。
细胞表面分子的调控作用:
-
CTLA-4:Treg结构性高表达CTLA-4,其与抗原呈递细胞上的CD80/CD86结合亲和力远高于CD28。通过此“反刺激信号”竞争性消耗共刺激分子,并诱导IDO等酶类的产生,导致APC功能耗竭,从而间接抑制T细胞活化。
-
PD-1/PD-L1轴:虽然多种T细胞均表达PD-1,但Treg在肿瘤微环境中可通过此通路进一步增强其抑制功能。同时,Treg自身也能表达PD-L1,直接抑制效应T细胞。
-
LAG-3:Treg表达的LAG-3可与MHC II类分子结合,传递抑制信号,干扰DC的正常功能。
-
代谢干扰:Treg通过高表达CD25(IL-2受体α链),以高亲和力“窃取”肿瘤微环境中的IL-2,而IL-2是效应T细胞存活与功能所必需的,从而导致效应T细胞因细胞因子匮乏而凋亡或失能。此外,Treg还能通过释放胞外酶CD39和CD73,将ATP催化为具有免疫抑制作用的腺苷,通过A2A受体通路抑制免疫反应。
-
细胞毒性作用:部分Treg可通过释放颗粒酶 和穿孔素,直接裂解活化的效应性T细胞及APC。
综上所述,Treg通过多维度、协同作用的机制,在肿瘤微环境中扮演了“免疫刹车”的角色。其浸润程度与多种癌症的不良预后显著相关。因此,靶向Treg(如抗CTLA-4抗体、抗CCR4抗体、靶向CD25的免疫毒素等)已成为增强现有免疫检查点抑制剂疗效、逆转肿瘤免疫逃逸的重要策略。
当然了,其中2025年的诺贝尔奖截止到8号已经产生了2位,其中坂口志文的故事听了之后感觉非常励志。
其中我们看一下科研人员的定义:科研人员是指在科研机构、高等院校或企业中,具备扎实的专业知识,从事科学研究、技术开发、科学实验或技术创新等工作的人员。
其中最核心的就是科学研究和技术创新,但是这背后是国家综合实力的竞争,人我们国家肯定不缺,哪怕顶尖的人才估计至少也是百万级别,例如江苏的人才引进把获得诺贝尔奖作为评价的标准,各类人才肯定“人满为患”,但是如何很好的利用起来,这个就要看领导人的智慧了。
这里不得不再骂那些拖欠工资、不顾别人死活的老板们,作为老板都如此的无道德底线,那还能要求牛马做什么贡献呢?
今天我们分享文献
知识积累
心肌梗死(MI)是一种急性疾病,其特征是因局部缺氧导致心肌组织细胞死亡,引发细胞组成与组织结构的剧烈改变。
时空组学。
结果1、急性心肌梗死的单细胞分辨率空间转录组分析
通过对急性心肌梗死小鼠模型开展单细胞分辨率空间转录组分析,研究系统揭示了梗死区域细胞组成的动态重构过程:髓系细胞在梗死4天内由对照组的4%急剧上升至28%,呈现跨心内膜的大规模浸润特征;心脏成纤维细胞比例从6.6%增至30.8%,预示早期瘢痕形成;而健康心肌细胞则从57.9%锐减至10%。研究首次通过空间多组学技术证实,心内膜通过上调血管性血友病因子(vWF)等黏附分子,构成免疫细胞浸润的新路径。
结果2、基于空间转录组数据的细胞邻域分析揭示急性心肌梗死的动态时空变化
MISTy细胞邻域分析。
细胞邻域分析发现并证实了心内膜细胞与髓系细胞之间非常规的空间关联,提示免疫细胞向梗死区的浸润可能是通过心内膜及心内膜下Nppa阳性梗死区(统称为心内膜梗死区)这一途径介导的。
结果3、基于高通量抗体成像技术证实急性心肌梗死中免疫细胞经心内膜层浸润
基于高通量抗体成像技术的独立验证表明,在急性心肌梗死发生24小时内,表达CCR2的髓系单核/巨噬细胞会通过心内膜层进行快速浸润:心梗后4小时即可观察到该细胞群附着于心内膜,24小时时浸润达到峰值(细胞间距缩短至中位24微米),同时发现心内膜梗死区是该时段内髓系细胞特异性聚集的主要区域。这一发现通过像素级表型分析和空间距离量化,证实了心内膜是免疫细胞早期浸润的关键途径。
在心外膜层中,CCR2+单核/巨噬细胞或直接附着于心外膜表面,或紧密聚集于心外膜血管周围。综合多项技术与定量方法的分析结果,分析明确揭示了非再灌注条件下急性心肌梗死早期髓系细胞通过不同细胞层进行渐进式浸润的规律,并首次发现了免疫细胞可经由心内膜梗死区这一全新路径浸润左心室梗死区域。
结果4、心内膜层空间蛋白质组学揭示vWF参与免疫细胞浸润过程
通过激光显微切割与空间蛋白质组学分析,研究首次揭示急性心肌梗死中心内膜区域存在显著的空间异质性:梗死区心内膜特异性上调血管性血友病因子(vWF),而远端心内膜则无此变化;该现象在人类心肌梗死样本中得到验证,证实vWF是心内膜响应局部炎症的关键介质,为靶向干预免疫细胞经心内膜浸润提供了精准治疗靶点。
结果5、vWF功能性阻断调控免疫细胞浸润与梗死修复进程
通过功能性阻断实验证实,vWF是调控髓系细胞经心内膜浸润的关键分子机制:抗体阻断vWF可显著减少心内膜梗死区CCR2+单核/巨噬细胞浸润,但意外的是,这种抑制反而导致心肌修复受损、室壁变薄及心功能恶化,表明vWF介导的免疫细胞浸润在急性心梗后组织修复过程中具有保护性作用。
最后看一下细胞共定位的分析方法
library(tidyverse)
library(mistyR)
library(rlist)
library(FNN)
library(future)
library(cowplot)
library(igraph)
library(ClusterR)
plan(multisession, workers = 8)
# MISTy ----
all.data <- read_tsv("molcart.misty_celltype_table.tsv")
samples <- all.data %>%
pull(sample_ID) %>%
unique()
cts <- all.data %>%
pull(anno_cell_type_lv2) %>%
unique()
cts.names <- make.names(cts, allow_ = FALSE)
samples %>% walk(\(sample){
sample.cells <- all.data %>%
filter(sample_ID == sample) %>%
pull(anno_cell_type_lv2) %>%
map(~ .x == cts) %>%
list.rbind() %>%
`colnames<-`(cts.names) %>%
as_tibble()
sample.pos <- all.data %>%
filter(sample_ID == sample) %>%
select(X_centroid, Y_centroid)
#l <- ceiling(knn.dist(sample.pos, 1) %>% mean())
#l <- 20/0.138
#l <- 50/0.138
l <- 100/0.138
misty.views.cts <- create_initial_view(sample.cells) %>%
add_paraview(sample.pos, l) %>%
rename_view(paste0("paraview.", l), "paraview") %>%
select_markers("intraview", where(~ sd(.) != 0))
run_misty(misty.views.cts, sample, "results_cts_100.sqm", bypass.intra = TRUE)
})
# Output ----
interaction_communities_info <- function(misty.results, concat.views, view,
trim = 0, trim.measure = "gain.R2",
cutoff = 1, resolution = 1) {
inv <- sign((stringr::str_detect(trim.measure, "gain") |
stringr::str_detect(trim.measure, "RMSE", negate = TRUE)) - 0.5)
targets <- misty.results$improvements.stats %>%
dplyr::filter(
measure == trim.measure,
inv * mean >= inv * trim
) %>%
dplyr::pull(target)
view.wide <- misty.results$importances.aggregated %>%
filter(view == !!view) %>%
pivot_wider(
names_from = "Target", values_from = "Importance",
id_cols = -c(view, nsamples)
) %>% mutate(across(-c(Predictor,all_of(targets)), \(x) x = NA))
mistarget <- setdiff(view.wide$Predictor, colnames(view.wide)[-1])
mispred <- setdiff(colnames(view.wide)[-1], view.wide$Predictor)
if(length(mispred) != 0){
view.wide.aug <- view.wide %>% add_row(Predictor = mispred)
} else {
view.wide.aug <- view.wide
}
if(length(mistarget) != 0){
view.wide.aug <- view.wide.aug %>%
bind_cols(mistarget %>%
map_dfc(~tibble(!!.x := NA)))
}
A <- view.wide.aug %>%
column_to_rownames("Predictor") %>%
as.matrix()
A[A < cutoff | is.na(A)] <- 0
## !!! Was buggy
G <- graph.adjacency(A[,rownames(A)], mode = "plus", weighted = TRUE) %>%
set.vertex.attribute("name", value = names(V(.))) %>%
delete.vertices(which(degree(.) == 0))
Gdir <- graph.adjacency(A[,rownames(A)], "directed", weighted = TRUE) %>%
set.vertex.attribute("name", value = names(V(.))) %>%
delete.vertices(which(degree(.) == 0))
C <- cluster_leiden(G, resolution_parameter = resolution, n_iterations = -1)
mem <- membership(C)
Gdir <- set_vertex_attr(Gdir, "community", names(mem), as.numeric(mem))
# careful here the first argument is the predictor and the second the target,
# it might need to come from different view
corrs <- as_edgelist(Gdir) %>% apply(1, \(x) cor(
concat.views[[view]][, x[1]],
concat.views[["intraview"]][, x[2]]
)) %>% replace_na(0)
Gdir <- set_edge_attr(Gdir, "cor", value = corrs)
return(Gdir)
}
groups <- samples %>% str_extract("(?<=sample_).+(?=_r)") %>% unique()
misty.results.g <- groups %>% map(~ collect_results("results_cts_100.sqm", .x))
names(misty.results.g) <- groups
dir.create("misty_figures_100")
misty.results.g %>% iwalk(\(misty.results, cond){
plot.list <- list()
plot_improvement_stats(misty.results, "gain.R2")
plot.list <- list.append(plot.list, last_plot())
plot_interaction_heatmap(misty.results, "paraview", cutoff = 0.5, clean = TRUE, trim = 5)
plot.list <- list.append(plot.list, last_plot())
plot_grid(plotlist = plot.list, ncol = 2)
ggsave(paste0("misty_figures_100/", cond, "_stats.pdf"), width = 10, height = 10)
})
dir.create("graphs", recursive = TRUE)
names(misty.results.g) %>% walk(\(g){
concat.views <- samples %>% str_subset(g) %>% map(\(sample){
sample.cells <- all.data %>%
filter(sample_ID == sample) %>%
pull(anno_cell_type_lv2) %>%
map(~ .x == cts) %>%
list.rbind() %>%
`colnames<-`(cts.names) %>%
as_tibble()
sample.pos <- all.data %>%
filter(sample_ID == sample) %>%
select(X_centroid, Y_centroid)
#l <- ceiling(knn.dist(sample.pos, 1) %>% mean())
#l <- 20/0.138
#l <- 50/0.138
l <- 100/0.138
misty.views.cts <- create_initial_view(sample.cells) %>%
add_paraview(sample.pos, l) %>%
rename_view(paste0("paraview.", l), "paraview") %>%
select_markers("intraview", where(~ sd(.) != 0))
}) %>% list.clean() %>% reduce(\(acc, nxt){
list(
intraview = bind_rows(acc[["intraview"]], nxt[["intraview"]]),
paraview = bind_rows(acc[["paraview"]], nxt[["paraview"]])
)
}, .init = list(intraview = NULL, paraview = NULL))
out <- interaction_communities_info(misty.results.g[[g]], concat.views,
view = "paraview", trim = 5, cutoff = 0.5)
write_graph(out, paste0("graphs/para.100.", g, ".graphml"), "graphml")
})
cellular_neighborhoods <- function(sample.cells, sample.pos, n, k){
misty.views <- create_initial_view(sample.cells) %>% add_paraview(sample.pos, family = "constant", l = n)
clust <- KMeans_rcpp(misty.views[[paste0("paraview.",n)]], k)
return(clust$clusters)
}
生活很好,有你更好