首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >偶尔不用人工智能大模型还蛮有成就感的

偶尔不用人工智能大模型还蛮有成就感的

作者头像
生信菜鸟团
发布2025-11-19 19:37:08
发布2025-11-19 19:37:08
630
举报
文章被收录于专栏:生信菜鸟团生信菜鸟团

看到了2025年10月的单细胞转录组文献是公开了表达量矩阵的:《A cellular and spatial atlas of TP53-associated tissue remodeling defines a multicellular tumor ecosystem in lung adenocarcinoma》,但是不是我们常见的GEO数据库啦。文章里面的 WES, scRNA-seq and ST data 都可以在Zenodo (https://doi.org/10.5281/zenodo.16546233

我首先使用人工智能大模型帮我汇总了这个研究的组学方面,就是系统刻画了 TP53 突变型 vs 野生型肺腺癌(LUAD)单细胞转录组 + 空间转录组 + 多重免疫荧光 + 全外显子组多组学图谱:


📊 1. 数据规模与实验设计

项目

详情

样本来源

23 例初治 NSCLC 患者(21 例吸烟),切除原发肿瘤

技术平台

10x Chromium 3′ scRNA-seq(v2/v3)

细胞总数

166,821 个高质量细胞(质控后)

TP53 分组

TP53mut(n=8) vs TP53WT(n=10)

配对数据

WES(肿瘤+PBMC)、空间转录组(Visium,20 张切片)、mIF(42 张)

细胞类型

11 大类 → 恶性、T/NK、B、髓系、内皮、周细胞、成纤维等


🧬 2. 单细胞分析流程与关键结果

✅ 细胞类型注释
  • 使用 Seurat v4标准流程:SCTransform → Harmony 批次校正 → PCA → Louvain 聚类
  • 基于经典 marker 基因将 166k 细胞划分为 11 大类,再细分:
    • 恶性细胞:33,377 个(18 个表达程序)
    • 髓系:21,125 个(16 个亚群)
    • T/NK:40,293 个(13 亚群)
    • 成纤维/周细胞:32,717 个(13 亚群)
    • 内皮:15,320 个(9 亚群)
✅ 恶性细胞程序分析(核心)
  • 整合聚类 → 18 个共享表达程序(CC、hypoxia、pEMT、 glycolysis、AT2-like、抗原递呈等)
  • TP53mut 特征
    • ↓ AT2-like 程序(肺泡身份丢失)
    • ↑ 细胞周期、糖酵解、缺氧、部分 EMT 程序
    • ↑ 信号熵(entropy,细胞可塑性指标)
✅ 基质与免疫微环境差异

细胞类型

TP53mut 特征

内皮细胞

↓ 气胞(aerocyte)与动脉内皮;血管生成受抑制

周细胞

显著减少

CAF

↑ COL1A2⁺ 炎症性 CAF(CAF.COLs);↑ TGFB2-TGFBR2 信号

巨噬细胞

↓ FABP4⁺ 肺泡样 TAM;↑ SPP1⁺ TAM(与缺氧/EMT 共表达)

T 细胞

↑ 耗竭型 CD8(PDCD1⁺CTLA4⁺TIGIT⁺);↑ CXCL13⁺ TFH;↑ GZMK⁺ CD8


🧭 3. 空间转录组解析(Visium)

  • 20 张切片(6 例肿瘤),使用 Tangram将 scRNA-seq 映射到空间
  • 发现“NMF7”多细胞生态位
    • 富含 SPP1⁺ TAM + COL1A2⁺ CAF + 肌成纤维
    • 缺氧、EMT 程序空间共定位
    • 位于肿瘤边缘,血管稀少
  • 配体-受体空间共表达
    • SEMA3A–NRP1EPHB2–EFNB1(抑制血管生成)
    • TGFB2–TGFBR2(EMT 驱动)
    • PVR–TIGIT(免疫检查点)

🧪 4. 功能验证与外部队列复现

  • TCGA(n=510)+ CPTAC(n=110)
    • 所有 TP53mut 相关表达特征在 bulk RNA/蛋白水平一致
  • KP vs K 小鼠模型(TP53mut vs WT):
    • 同样观察到 ↑ 熵、↓ AT2、↑ 缺氧/EMT
  • A549 Perturb-seq(过表达 50+ TP53 突变体):
    • impactful II 类突变(DNE/LOF)诱导最强恶性程序与熵增

📌 5. 临床意义

  • 免疫治疗反应
    • TP53mut LUAD 在 SU2C-MARK 队列中接受抗 PD-1 治疗有 更长 PFS
    • 空间/mIF 证实 PDL1⁺肿瘤与 PD1⁺CD8⁺ T 细胞共定位显著增加
  • 提出可靶向生态位
    • SPP1–CD44(巨噬细胞-肿瘤)
    • PVR–TIGIT(肿瘤-T 细胞)
    • TGFB2–TGFBR2(CAF-肿瘤)

✅ 一句话总结

本文通过 166k 单细胞 + 空间转录组揭示:TP53 突变型 LUAD 恶性细胞丧失 AT2 身份、获得高熵/可塑性,并构建以 SPP1⁺巨噬-COL1A2⁺成纤维为核心的 缺氧-EMT 生态位,伴随 PVR-TIGIT/PDL1-PD1免疫检查点富集,为 TP53mut 肿瘤提供更优免疫治疗响应的生物学基础。


可以 读取作者给出来的单细胞转录组文件,然后自己进行第一层次降维聚类分群后,跟作者的单细胞亚群注释信息对比一下。不过我们这里为了简化处理,直接对比作者自己的第一层次降维聚类分群和第二层次的命名:

代码语言:javascript
复制
load('Data_for_Github/all.merge.Rda')
phe = all@meta.data
pdf('celltype-vs-subtype.pdf',width = 12,height = 15)
gplots::balloonplot(table(phe$celltype,phe$subtype))
dev.off()

很容易看到第一层次的每个亚群是如何细分成为第二层次的多个亚群的:

第一层次的每个亚群是如何细分成为第二层次的多个亚群

如果想让上面的图好看一点,就需要简单的排序。以前我是让人工智能大模型帮我想解决方案,但是这次我动了一下我的小脑袋瓜,发现也可以自己写出来。

代码语言:javascript
复制
x = phe$subtype
y = phe$celltype
tbl =  table(x,y)
df = dcast(as.data.frame(tbl),x~y)
#View(df)
rownames(df)=df[,1]
df=df[,-1]
n=10^(10*(ncol(df):1))
#View(t(t(df)*n))
pos=order(rowSums( t(t(df)*n) ));pos
rownames(df)[pos] 
phe$subtype = factor(phe$subtype,levels = rownames(df)[pos] )

可以看到,效果还是很不错的, 排序的清清楚楚啦!

虽然我的脑袋瓜子想出来了这么好的代码,但是我嘴笨不知道如何解释,这个时候仍然是可以求助于人工智能大模型。 下面这段 R 代码的核心任务是: phe$subtype的 levels 重新排个序,使得在“加权后的总 abundance”越大的 group 越靠前(即后面画图时排在热图上方)。 权重由 n = 10^(10*(ncol(df):1))给出——列号越靠后(即原表最右边的 celltype),权重越大

逐句拆解:


1. 准备列联表

代码语言:javascript
复制
x = phe$subtype        # 行:肿瘤亚型/分组
y = phe$celltype       # 列:细胞类型
tbl = table(x, y)      # 数每种组合的细胞数

2. 把“宽表”变“长表”再变“宽表”(data.frame 形式)

代码语言:javascript
复制
df = dcast(as.data.frame(tbl), x ~ y)
# 结果:行名 = subtype,列名 = celltype,值 = 计数

3. 去掉第一列(subtype 名字),把它设为行名

代码语言:javascript
复制
rownames(df) = df[, 1]
df = df[, -1]          # 现在 df 是纯数值矩阵

4. 生成指数权重向量

代码语言:javascript
复制
n = 10^(10*(ncol(df):1))
# 举例:若有 5 个 celltype,则
# n = c(10^50, 10^40, 10^30, 10^20, 10^10)
# 越靠右的 celltype 权重越高

5. 对每一行(subtype)做加权求和

代码语言:javascript
复制
tmp = t(t(df) * n)     # 每列乘对应权重
score = rowSums(tmp)   # 每行加总,得一个分数

6. 按分数从小到大排,返回位置索引

代码语言:javascript
复制
pos = order(score)     # 分数小的在前

7. 把 subtype 的 levels 改成“分数大的在前”

代码语言:javascript
复制
rownames(df)[pos]      # 查看排序后的名字
phe$subtype = factor(phe$subtype,
                      levels = rownames(df)[pos])
  • 因为 order默认是 升序,而我们要分数大的在前,所以直接把 pos当作新 levels 即可(pos里先放的是原表中得分最小的行号,依次往后)。
  • 之后画热图/柱状图时,就会按这个顺序展示 subtype。

一句话总结

这段代码按“越靠右的 celltype 对排序贡献越大”的规则,把 subtype的 levels 重新排了一遍,以便后续可视化时把“重要”的 group 放在上方。

当然了,这个时候其实桑基图会更好的展示,大家可以试试看!如果不会桑基图的绘图代码,也可以试试看让人工智能大模型帮大家!

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

本文分享自 生信菜鸟团 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📊 1. 数据规模与实验设计
  • 🧬 2. 单细胞分析流程与关键结果
    • ✅ 细胞类型注释
    • ✅ 恶性细胞程序分析(核心)
    • ✅ 基质与免疫微环境差异
  • 🧭 3. 空间转录组解析(Visium)
  • 🧪 4. 功能验证与外部队列复现
  • 📌 5. 临床意义
  • ✅ 一句话总结
  • 1. 准备列联表
  • 2. 把“宽表”变“长表”再变“宽表”(data.frame 形式)
  • 3. 去掉第一列(subtype 名字),把它设为行名
  • 4. 生成指数权重向量
  • 5. 对每一行(subtype)做加权求和
  • 6. 按分数从小到大排,返回位置索引
  • 7. 把 subtype 的 levels 改成“分数大的在前”
  • 一句话总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档