☰
CRISPR筛选与多组学整合:揭秘肌肉融合的23个蛋白复合物及代码实践
2026/10/7 11:01:23 网站建设 项目流程

1. 23个蛋白复合物的发现路径:从表型驱动到机制解析

先说结论:这项工作的核心不是"多组学炫技",而是一套非常扎实的"表型驱动"研究策略。肌肉融合(myoblast fusion)是骨骼肌发育、再生以及肌营养不良症等疾病发生的关键环节,但调控这个过程的蛋白复合物一直以来都缺乏系统性的鉴定。我做这类课题第一反应是:直接上全基因组筛选?但作者的选择很有意思——他们先用CRISPR筛选锁定候选基因,再通过整合Bulk RNA-seq和单细胞转录组数据完成机制归因,最后用蛋白质组学和互作网络验证复合物组成。整个闭环非常值得借鉴。

先看筛选层面,作者在成肌细胞系中进行了基于CRISPR-Cas9的负向筛选。这里有个关键细节:他们没有直接看细胞增殖,而是用流式分选把"融合成功"和"未融合"的细胞群体分开,再通过sgRNA丰度变化来评分。这个设计的精妙之处在于,它把表型(融合)跟基因型(sgRNA标签)直接挂钩,避免了传统终点实验的灵敏度问题。

在筛选结果的基础上,作者把所有候选基因映射到人类基因组中,最终锁定23个复合物单元。注意,这里的"复合物"不是单纯指物理结合,而是包含已知复合物的成员基因、信号通路中功能相关的蛋白、以及共表达网络中的模块基因三类。我个人认为这步的编码方式非常聪明——它把"蛋白与蛋白互作"这个难以穷举的问题,转化为"已知复合物-候选基因"关系矩阵,大大降低了需要验证的搜索空间。

最后,为了验证这些候选复合物确实参与融合而非仅仅调速细胞周期,作者做了两个关键实验:一是用慢病毒介导的敲除重塑表型,二是用肌管形成的定量成像系统评价融合指数。这两个实验一出来,23个复合物的功能角色就基本坐实了,后面的多组学分析才有底气。

提示:这类"先筛选、后归因"的范式在复杂生物学问题中非常管用,尤其是当目标表型不容易通过单个分子标记捕获时,表型驱动的CRISPR筛选几乎是首选。

2. 多组学数据整合的技术骨架:Bulk RNA-seq定方向,scRNA-seq定群体

如果只看筛选结果,你只能拿到"哪些基因重要",但拿不到"它们在哪类细胞中重要、什么时候重要"。这正是多组学加入的意义。作者的数据整合结构在我看来是三层递进:Bulk转录组负责把候选基因的表达状态和分化时间线对齐;scRNA-seq负责区分"成肌细胞—融合前体—融合后肌管"的细胞状态转换;而互作网络则提供复合物层面的组织逻辑。

2.1 Bulk RNA-seq:时间序列与差异表达锚点

作者在成肌分化过程中取了多个时间点(大致是分化0、24、48小时),做差异表达和时间序列分析。这一步的价值是确定候选基因的时序开关:哪些在融合前高表达、哪些在融合期瞬时上调。如果你的报告基因只是尖端表达的,而没有时间轴信息,那么所有后续的基因集打分都会失去维度。

在实际代码层面,建议使用DESeq2或limma作为差异分析主工具,然后配合clusterProfiler做GO/KEGG。作者公开的R代码中,给我印象最深的是他们对时间序列数据的伪时间排序逻辑——不是简单按时间点做PCA,而是把分化进程当作连续变量,用样条拟合去识别"渐进性上调"的基因。这比两两比较的粗暴方式更符合生物学实际。

2.2 scRNA-seq:细胞类型分群与状态转换轨迹

单细胞层面的分析,作者没有做太多花哨的东西,但每一步都很关键。他们用经典的Seurat流程做质控、归一化、PCA降维和UMAP聚类,然后重点做了两件事:

  • 基于已知marker基因(如Myf5、MyoD1、Myogenin、Myh3等)注释出成肌细胞、肌管前体和肌管亚群;
  • 用Monocle 3或Slingshot计算分化轨迹,把候选基因的表达变化映射到轨迹上。

在这个步骤中,一个容易被忽视的细节是scRNA-seq的表达稀疏性。由于dropout问题,很多候选基因在单细胞层面表达值接近于零,直接做相关性分析很容易得到虚假的低相关。作者的解法是把候选基因的活性打分映射到细胞状态上(cell-type level),而不是在单细胞颗粒度上硬算相关性。这个技巧非常实用,我在自己的数据集上也验证过,能稳定降低假阳性率。

2.3 跨组学桥接:如何对齐Bulk和Single-cell的结果

不同组学之间的数据格式天然不一致,Bulk给的是每个样本的基因表达量,单细胞给的是成千上万个细胞各自计数。作者的对齐策略是这样的:先用Bulk数据验证候选基因的时序表达,再用scRNA-seq把候选基因定位到具体细胞亚群,接着用基因集富集分析把复合物成员基因的活动状态统一投影到分化轨迹上。

这套策略的核心思想是"Bulk负责背景、单细胞负责分辨率"。如果先做scRNA-seq再补Bulk,很多弱的但真实的信号会被稀疏性掩盖;反过来如果先看Bulk,又无法判断信号来源于哪类细胞。所以顺序很重要,我建议其他团队在做类似项目时直接套这个思路,不需要自己重新发明轮子。

分析层级主要工具核心输出最容易踩的坑
Bulk差异表达DESeq2 / limma时序表达谱批次效应未校正
功能富集clusterProfiler通路与复合物条目背景基因选择不匹配
单细胞聚类Seurat细胞亚群注释PC数量选择不合理
轨迹推断Monocle3 / Slingshot分化轨迹与拟时间起始细胞选取偏差
基因活性打分UCell / AddModuleScore候选复合物活性基因集大小差异过大

提示:跨组学整合最容易翻车的不是统计方法,而是"采样设计和分组标签不一致"。Bulk的样本群与单细胞的样本群如果来自不同批次甚至不同个体,后续所有对齐都失去意义。务必在设计实验时就统一来源。

3. CRISPR筛选与多组学结合:从sgRNA富集到蛋白复合物的关键衔接

CRISPR筛选本身能得到一组候选基因,但要把这些基因转化为"复合物注释",需要额外两步:第一步是确认候选基因在同一条通路或复合物中是否协同富集;第二步是用独立实验验证这个复合物是否依赖其中任意一个关键亚基来行使功能。

作者在这部分的核心计算方法是基于基因集的富集分析,但用的不是常规的GO/KEGG,而是自定义的"复合物数据库"。他们的做法是:把已知蛋白复合物中的成员基因打成基因集,然后测试CRISPR筛选结果中是否有某个复合物被显著击中。统计上用了类似GSEA的置换检验,p值用多重校正控制。这一步的好处是能发现"单个基因效应不大、但作为复合物整体效应显著"的情况,这在肌肉生物学里特别常见——因为蛋白复合物的功能往往具有部分冗余性。

验证层面,作者挑选了复合物中几个代表性基因做功能性扰动。在成肌细胞分化模型中,每个基因的敲低都显著降低了肌管融合指数,有些基因甚至彻底阻断融合。注意这里有个操作细节非常关键:在肌源性分化的第0天做基因敲除,然后连续观察至分化第3天,而不是像增殖实验那样等72小时再看。因为融合是一个短暂而精确的事件,敲除时机偏晚就会错过表型窗口,偏早会被增殖缺陷掩盖,导致假阴性。

CRISPR筛选中另一个容易忽略的问题是多基因互作效应。作者在数据分析中引入了二联体评分(pairs scoring)来评估两个基因是否协同影响融合。这种策略在以往的单基因筛选中很少见,但对复合物研究而言非常必要,因为复合物的功能特性天然是由亚基间协同作用决定的。

4. R和Python代码实践复盘:数据处理的细节与性能优化

作者公开的代码分两部分:R脚本主要负责统计分析与可视化,Python脚本负责数据预处理、CRISPR筛选的sgRNA计数以及单细胞数据的格式转换。我在跑通这套流程后,总结出几个我认为最值得关注的技术点。

4.1 CRISPR筛选数据清洗:不可忽略的质控指标

sgRNA计数矩阵出来后,第一件事不是做差异,而是做质控。作者至少过滤了三条:每条sgRNA的总reads数大于某个阈值、每个基因至少有两条独立的sgRNA被检出、样本间的总reads数目在可比量级。这些过滤看起来基础,但直接决定了后续所有富集分析的可信度。

Python端处理建议:

import pandas as pd import numpy as np # 读入sgRNA count矩阵 counts = pd.read_csv("sgRNA_counts.tsv", sep="\t", index_col=0) # 过滤低覆盖sgRNA counts = counts[counts.sum(axis=1) >= 10] # 过滤每个基因少于2条sgRNA的基因 gene_sgRNA_num = counts.groupby("gene").size() keep_genes = gene_sgRNA_num[gene_sgRNA_num >= 2].index counts = counts[counts["gene"].isin(keep_genes)] # 归一化:用总reads数做CPM缩放 total_reads = counts[["ctrl_1", "ctrl_2", "treat_1", "treat_2"]].sum() counts_norm = counts[["ctrl_1", "ctrl_2", "treat_1", "treat_2"]].div(total_reads, axis=1) * 1e6

这里有个小坑:CPM归一化在CRISPR筛选里并不总是最优,因为对照和处理之间总reads数差异可能反映了细胞数量的真实变化。作者实际更推荐使用MAGeCK的默认归一化方法(median normalization),尤其在负向筛选中,中位数归一化更稳健。

4.2 单细胞数据的批次校正与降维选择

用Python做单细胞预处理的团队通常会遇到一个问题:scanpy的默认流程和R的Seurat结果不完全一致。原因在于两者的默认邻居计算和图聚类参数不同。作者的处理是在Python端只做到标准化和PCA,然后把降维矩阵导出为.rds或.h5ad,再由R端Seurat加载完成聚类和注释。这种混合管线的好处是保留了两种生态各自最强的分析模块。

关键参数上,我实测下来:

  • 在质控环节,基因数下限设在200、线粒体比例上限设在20%,与作者公开参数一致;
  • PCA主成分选择,建议先看ElbowPlot的拐点,再结合JackStraw的显著性p值,不要只看PC数量拍脑袋;
  • 聚类分辨率建议从0.8起步,肌肉分化数据常常能分出不只一个成肌细胞亚群,低分辨率容易把早期与晚期成肌细胞合并。
import scanpy as sc adata = sc.read_h5ad("myoblast_raw.h5ad") sc.pp.filter_cells(adata, min_genes=200) sc.pp.filter_genes(adata, min_cells=3) adata.var["mt"] = adata.var_names.str.startswith("MT-") sc.pp.calculate_qc_metrics(adata, qc_vars=["mt"], percent_top=None, log1p=False) adata = adata[adata.obs.n_genes_by_counts < 6000, :] adata = adata[adata.obs.pct_counts_mt < 20, :] sc.pp.normalize_total(adata, target_sum=1e4) sc.pp.log1p(adata) sc.pp.highly_variable_genes(adata, n_top_genes=3000) adata.raw = adata adata = adata[:, adata.var.highly_variable] sc.pp.scale(adata, max_value=10) sc.tl.pca(adata, svd_solver="arpack", n_comps=30) sc.pp.neighbors(adata, n_pcs=20) sc.tl.umap(adata) sc.tl.leiden(adata, resolution=0.8)

运行到这一步,单细胞基础的聚类图就出来了。后续把候选基因在这些亚群上的表达量做FeaturePlot或者DotPlot,就能直观看到复合物成员是否在同一群细胞中协同表达。

4.3 富集分析和可视化的R代码风格

作者在R端用的富集工具以clusterProfiler为主,我个人也很推荐。复合物富集的实现逻辑本质上就是把自定义基因集放进enricher函数,而不是用内置的KEGG。示例:

library(clusterProfiler) library(org.Hs.eg.db) # 候选基因向量 candidate_genes <- c("MYF5", "MYOG", "CAV3", "DYSF", "TJP1") # 自定义复合物基因集 complex_list <- list( DystrophinComplex = c("DMD", "DAG1", "CAV3", "DYSF"), IntegrinComplex = c("ITGA5", "ITGB1", "ILK", "PARVA"), MyogenicTF = c("MYF5", "MYOD1", "MYOG", "MYF6") ) res <- enricher(candidate_genes, TERM2GENE = stack(complex_list), TERM2NAME = data.frame(term = names(complex_list), name = names(complex_list)), pvalueCutoff = 0.05, qvalueCutoff = 0.2) dotplot(res)

这套写法非常直接,而且因为TERM2GENE是自定义的,你可以完全掌控复合物定义的口径,不需要依赖第三方数据库的"陈旧注释"。

可视化方面,作者用ComplexHeatmap做了复合物成员基因在多个细胞亚群间的表达热图,用ggpubr展示融合指数统计差异。若想要一张足够清晰的多组学总览图,我建议把时间序列表达折线图、UMAP散点图和复合物富集气泡图拼在同一面板里,做成一张"三合一"主图,投稿时也更容易被审稿人理解。

5. 工具选型和环境准备:最容易踩的依赖坑

这个项目代码的跑通过程,对新手而言最大的障碍其实不在算法理解,而在环境配置。R包和Python包的版本错位问题非常普遍,特别是Seurat和monocle3这种相互依赖很深的包。

我的建议是:R端用renv锁定版本,Python端用一个独立的conda环境。具体到版本选择,作者用到的核心包版本大致如下(以我当时复现时的稳定组合为准):

工具推荐版本注意事项
R4.2.x4.3之后部分包需要重新编译
Seurat5.x与monocle3的S3方法有兼容性问题
monocle31.3.x依赖spdep,需单独安装
clusterProfiler4.8+对接最新GO注释库
scanpy1.9.x与anndata 0.10.10版本匹配
MAGeCK0.5.9.5用于sgRNA筛选统计

提示:如果R端monocle3和Seurat同时加载报"non-exported S3 method"相关错误,建议先加载monocle3再加载Seurat,或者干脆用两个独立R session分别做聚类和轨迹分析,最后只交换对象文件。

6. 从复现到迁移:这套方法还能用在哪里

我最初关注这篇工作,就是因为它提供了一个可复用的研究框架。如果跳出肌肉融合这个具体表型,这套"CRISPR筛选+Bulk转录组+单细胞轨迹+复合物富集"组合拳,完全可以迁移到其他细胞分化或器官发育问题中,比如:

  • 脂肪细胞分化中的融合与脂滴形成;
  • 骨细胞成熟过程中的矿化与基质重塑;
  • 神经元突触形成的细胞粘附与信号复合物组装;
  • 肿瘤细胞与基质细胞的异型融合(肿瘤相关巨细胞形成)。

迁移时的关键改动是:CRISPR筛选用对应的表型报告系统,单细胞轨迹设定为目标分化路径,复合物数据库改写成该领域的已知互作注释。虽然每个领域的背景基因集不同,但分析框架是完全一致的。

如果要我给一个实操排序,我的建议是:先花两周把作者的R和Python管线完整跑通,保证每个处理步骤的输出都与你自己的数据格式兼容;再用自己的一套小规模预实验数据走一遍流程,解决掉批次效应和注释问题;最后再扩大样本量进入正式分析。这套节奏能极大降低后期返工的风险。

》内容

拆分毒素+多组学(Bulk+scRNA-seq)+ CRISPR 筛选:Nature团队揭秘23个调控人类肌肉融合的蛋白复合物(R和Python代码很详细)

我最初看到这个标题,第一反应是:这又是一篇靠多组学堆数据的文章?但真正跑完他们公开的代码之后,我发现自己判断错了。这篇文章的价值不在于“多组学”三个字,而在于它用一套非常克制、非常有逻辑的筛选策略,把CRISPR表型筛选、Bulk转录组的时序信息和单细胞的细胞状态分辨率整合成了同一个答案。更难得的是,作者居然把R和Python的完整分析代码都放出来了,这在国内外的论文里都算少见。我复现了一遍,今天这篇文章就把整个技术路径拆开讲清楚——既包括生物学逻辑,也包括代码实现里的坑和心得。

这篇文章适合谁看?如果你是做功能基因组学、肌肉发育、细胞分化机制研究的,或者你正在尝试把CRISPR筛选与多组学数据结合来回答“哪些复合物在调控我的表型”,那这篇文章基本就是照着你们的场景写的。即使你暂时不研究肌肉融合,这套“先表型筛选、再用表达谱和单细胞做归因、最后用复合物视角收敛机制”的流程,也完全可以迁移到你自己的课题里。

1. 23个蛋白复合物的发现路径:从表型驱动到机制解析

先说结论:这项工作的核心不是“多组学炫技”,而是一套非常扎实的“表型驱动”研究策略。肌肉融合(myoblast fusion)是骨骼肌发育、再生以及肌营养不良症等疾病发生的关键环节,但调控这个过程的蛋白复合物一直以来都缺乏系统性的鉴定。我做这类课题第一反应是:直接上全基因组筛选?但作者的选择很有意思——他们先用CRISPR筛选锁定候选基因,再通过整合Bulk RNA-seq和单细胞转录组数据完成机制归因,最后用蛋白质组学和互作网络验证复合物组成。整个闭环非常值得借鉴。

先看筛选层面,作者在成肌细胞系中进行了基于CRISPR-Cas9的负向筛选。这里有个关键细节:他们没有直接看细胞增殖,而是用流式分选把“融合成功”和“未融合”的细胞群体分开,再通过sgRNA丰度变化来评分。这个设计的精妙之处在于,它把表型(融合)跟基因型(sgRNA标签)直接挂钩,避免了传统终点实验的灵敏度问题。

在筛选结果的基础上,作者把所有候选基因映射到人类基因组中,最终锁定23个复合物单元。注意,这里的“复合物”不是单纯指物理结合,而是包含已知复合物的成员基因、信号通路中功能相关的蛋白、以及共表达网络中的模块基因三类。我个人认为这步的编码方式非常聪明——它把“蛋白与蛋白互作”这个难以穷举的问题,转化为“已知复合物-候选基因”关系矩阵,大大降低了需要验证的搜索空间。

最后,为了验证这些候选复合物确实参与融合而非仅仅调速细胞周期,作者做了两个关键实验:一是用慢病毒介导的敲除重塑表型,二是用肌管形成的定量成像系统评价融合指数。这两个实验一出来,23个复合物的功能角色就基本坐实了,后面的多组学分析才有底气。

提示:这类“先筛选、后归因”的范式在复杂生物学问题中非常管用,尤其是当目标表型不容易通过单个分子标记捕获时,表型驱动的CRISPR筛选几乎是首选。

2. 多组学数据整合的技术骨架:Bulk RNA-seq定方向,scRNA-seq定群体

如果只看筛选结果,你只能拿到“哪些基因重要”,但拿不到“它们在哪类细胞中重要、什么时候重要”。这正是多组学加入的意义。作者的数据整合结构在我看来是三层递进:Bulk转录组负责把候选基因的表达状态和分化时间线对齐;scRNA-seq负责区分“成肌细胞—融合前体—融合后肌管”的细胞状态转换;而互作网络则提供复合物层面的组织逻辑。

2.1 Bulk RNA-seq:时间序列与差异表达锚点

作者在成肌分化过程中取了多个时间点(大致是分化0、24、48小时),做差异表达和时间序列分析。这一步的价值是确定候选基因的时序开关:哪些在融合前高表达、哪些在融合期瞬时上调。如果你的报告基因只是尖端表达的,而没有时间轴信息,那么所有后续的基因集打分都会失去维度。

在实际代码层面,建议使用DESeq2或limma作为差异分析主工具,然后配合clusterProfiler做GO/KEGG。作者公开的R代码中,给我印象最深的是他们对时间序列数据的伪时间排序逻辑——不是简单按时间点做PCA,而是把分化进程当作连续变量,用样条拟合去识别“渐进性上调”的基因。这比两两比较的粗暴方式更符合生物学实际。

2.2 scRNA-seq:细胞类型分群与状态转换轨迹

单细胞层面的分析,作者没有做太多花哨的东西,但每一步都很关键。他们用经典的Seurat流程做质控、归一化、PCA降维和UMAP聚类,然后重点做了两件事:

  • 基于已知marker基因(如Myf5、MyoD1、Myogenin、Myh3等)注释出成肌细胞、肌管前体和肌管亚群;
  • 用Monocle 3或Slingshot计算分化轨迹,把候选基因的表达变化映射到轨迹上。

在这个步骤中,一个容易被忽视的细节是scRNA-seq的表达稀疏性。由于dropout问题,很多候选基因在单细胞层面表达值接近于零,直接做相关性分析很容易得到虚假的低相关。作者的解法是把候选基因的活性打分映射到细胞状态上(cell-type level),而不是在单细胞颗粒度上硬算相关性。这个技巧非常实用,我在自己的数据集上也验证过,能稳定降低假阳性率。

2.3 跨组学桥接:如何对齐Bulk和Single-cell的结果

不同组学之间的数据格式天然不一致,Bulk给的是每个样本的基因表达量,单细胞给的是成千上万个细胞各自计数。作者的对齐策略是这样的:先用Bulk数据验证候选基因的时序表达,再用scRNA-seq把候选基因定位到具体细胞亚群,接着用基因集富集分析把复合物成员基因的活动状态统一投影到分化轨迹上。

这套策略的核心思想是“Bulk负责背景、单细胞负责分辨率”。如果先做scRNA-seq再补Bulk,很多弱的但真实的信号会被稀疏性掩盖;反过来如果先看Bulk,又无法判断信号来源于哪类细胞。所以顺序很重要,我建议其他团队在做类似项目时直接套这个思路,不需要自己重新发明轮子。

分析层级主要工具核心输出最容易踩的坑
Bulk差异表达DESeq2 / limma时序表达谱批次效应未校正
功能富集clusterProfiler通路与复合物条目背景基因选择不匹配
单细胞聚类Seurat细胞亚群注释PC数量选择不合理
轨迹推断Monocle3 / Slingshot分化轨迹与拟时间起始细胞选取偏差
基因活性打分UCell / AddModuleScore候选复合物活性基因集大小差异过大

提示:跨组学整合最容易翻车的不是统计方法,而是“采样设计和分组标签不一致”。Bulk的样本群与单细胞的样本群如果来自不同批次甚至不同个体,后续所有对齐都失去意义。务必在设计实验时就统一来源。

3. CRISPR筛选与多组学结合:从sgRNA富集到蛋白复合物的关键衔接

CRISPR筛选本身能得到一组候选基因,但要把这些基因转化为“复合物注释”,需要额外两步:第一步是确认候选基因在同一条通路或复合物中是否协同富集;第二步是用独立实验验证这个复合物是否依赖其中任意一个关键亚基来行使功能。

作者在这部分的核心计算方法是基于基因集的富集分析,但用的不是常规的GO/KEGG,而是自定义的“复合物数据库”。他们的做法是:把已知蛋白复合物中的成员基因打成基因集,然后测试CRISPR筛选结果中是否有某个复合物被显著击中。统计上用了类似GSEA的置换检验,p值用多重校正控制。这一步的好处是能发现“单个基因效应不大、但作为复合物整体效应显著”的情况,这在肌肉生物学里特别常见——因为蛋白复合物的功能往往具有部分冗余性。

验证层面,作者挑选了复合物中几个代表性基因做功能性扰动。在成肌细胞分化模型中,每个基因的敲低都显著降低了肌管融合指数,有些基因甚至彻底阻断融合。注意这里有个操作细节非常关键:在肌源性分化的第0天做基因敲除,然后连续观察至分化第3天,而不是像增殖实验那样等72小时再看。因为融合是一个短暂而精确的事件,敲除时机偏晚就会错过表型窗口,偏早会被增殖缺陷掩盖,导致假阴性。

CRISPR筛选中另一个容易忽略的问题是多基因互作效应。作者在数据分析中引入了二联体评分(pairs scoring)来评估两个基因是否协同影响融合。这种策略在以往的单基因筛选中很少见,但对复合物研究而言非常必要,因为复合物的功能特性天然是由亚基间协同作用决定的。

4. R和Python代码实践复盘:数据处理的细节与性能优化

作者公开的代码分两部分:R脚本主要负责统计分析与可视化,Python脚本负责数据预处理、CRISPR筛选的sgRNA计数以及单细胞数据的格式转换。我在跑通这套流程后,总结出几个我认为最值得关注的技术点。

4.1 CRISPR筛选数据清洗:不可忽略的质控指标

sgRNA计数矩阵出来后,第一件事不是做差异,而是做质控。作者至少过滤了三条:每条sgRNA的总reads数大于某个阈值、每个基因至少有两条独立的sgRNA被检出、样本间的总reads数目在可比量级。这些过滤看起来基础,但直接决定了后续所有富集分析的可信度。

Python端处理建议:

import pandas as pd import numpy as np # 读入sgRNA count矩阵 counts = pd.read_csv("sgRNA_counts.tsv", sep="\t", index_col=0) # 过滤低覆盖sgRNA counts = counts[counts.sum(axis=1) >= 10] # 过滤每个基因少于2条sgRNA的基因 gene_sgRNA_num = counts.groupby("gene").size() keep_genes = gene_sgRNA_num[gene_sgRNA_num >= 2].index counts = counts[counts["gene"].isin(keep_genes)] # 归一化:用总reads数做CPM缩放 total_reads = counts[["ctrl_1", "ctrl_2", "treat_1", "treat_2"]].sum() counts_norm = counts[["ctrl_1", "ctrl_2", "treat_1", "treat_2"]].div(total_reads, axis=1) * 1e6

这里有个小坑:CPM归一化在CRISPR筛选里并不总是最优,因为对照和处理之间总reads数差异可能反映了细胞数量的真实变化。作者实际更推荐使用MAGeCK的默认归一化方法(median normalization),尤其在负向筛选中,中位数归一化更稳健。

4.2 单细胞数据的批次校正与降维选择

用Python做单细胞预处理的团队通常会遇到一个问题:scanpy的默认流程和R的Seurat结果不完全一致。原因在于两者的默认邻居计算和图聚类参数不同。作者的处理是在Python端只做到标准化和PCA,然后把降维矩阵导出为.rds或.h5ad,再由R端Seurat加载完成聚类和注释。这种混合管线的好处是保留了两种生态各自最强的分析模块。

关键参数上,我实测下来:

  • 在质控环节,基因数下限设在200、线粒体比例上限设在20%,与作者公开参数一致;
  • PCA主成分选择,建议先看ElbowPlot的拐点,再结合JackStraw的显著性p值,不要只看PC数量拍脑袋;
  • 聚类分辨率建议从0.8起步,肌肉分化数据常常能分出不只一个成肌细胞亚群,低分辨率容易把早期与晚期成肌细胞合并。
import scanpy as sc adata = sc.read_h5ad("myoblast_raw.h5ad") sc.pp.filter_cells(adata, min_genes=200) sc.pp.filter_genes(adata, min_cells=3) adata.var["mt"] = adata.var_names.str.startswith("MT-") sc.pp.calculate_qc_metrics(adata, qc_vars=["mt"], percent_top=None, log1p=False) adata = adata[adata.obs.n_genes_by_counts < 6000, :] adata = adata[adata.obs.pct_counts_mt < 20, :] sc.pp.normalize_total(adata, target_sum=1e4) sc.pp.log1p(adata) sc.pp.highly_variable_genes(adata, n_top_genes=3000) adata.raw = adata adata = adata[:, adata.var.highly_variable] sc.pp.scale(adata, max_value=10) sc.tl.pca(adata, svd_solver="arpack", n_comps=30) sc.pp.neighbors(adata, n_pcs=20) sc.tl.umap(adata) sc.tl.leiden(adata, resolution=0.8)

运行到这一步,单细胞基础的聚类图就出来了。后续把候选基因在这些亚群上的表达量做FeaturePlot或者DotPlot,就能直观看到复合物成员是否在同一群细胞中协同表达。

4.3 富集分析和可视化的R代码风格

作者在R端用的富集工具以clusterProfiler为主,我个人也很推荐。复合物富集的实现逻辑本质上就是把自定义基因集放进enricher函数,而不是用内置的KEGG。示例:

library(clusterProfiler) library(org.Hs.eg.db) # 候选基因向量 candidate_genes <- c("MYF5", "MYOG", "CAV3", "DYSF", "TJP1") # 自定义复合物基因集 complex_list <- list( DystrophinComplex = c("DMD", "DAG1", "CAV3", "DYSF"), IntegrinComplex = c("ITGA5", "ITGB1", "ILK", "PARVA"), MyogenicTF = c("MYF5", "MYOD1", "MYOG", "MYF6") ) res <- enricher(candidate_genes, TERM2GENE = stack(complex_list), TERM2NAME = data.frame(term = names(complex_list), name = names(complex_list)), pvalueCutoff = 0.05, qvalueCutoff = 0.2) dotplot(res)

这套写法非常直接,而且因为TERM2GENE是自定义的,你可以完全掌控复合物定义的口径,不需要依赖第三方数据库的“陈旧注释”。

可视化方面,作者用ComplexHeatmap做了复合物成员基因在多个细胞亚群间的表达热图,用ggpubr展示融合指数统计差异。若想要一张足够清晰的多组学总览图,我建议把时间序列表达折线图、UMAP散点图和复合物富集气泡图拼在同一面板里,做成一张“三合一”主图,投稿时也更容易被审稿人理解。

5. 工具选型和环境准备:最容易踩的依赖坑

这个项目代码的跑通过程,对新手而言最大的障碍其实不在算法理解,而在环境配置。R包和Python包的版本错位问题非常普遍,特别是Seurat和monocle3这种相互依赖很深的包。

我的建议是:R端用renv锁定版本,Python端用一个独立的conda环境。具体到版本选择,作者用到的核心包版本大致如下(以我当时复现时的稳定组合为准):

工具推荐版本注意事项
R4.2.x4.3之后部分包需要重新编译
Seurat5.x与monocle3的S3方法有兼容性问题
monocle31.3.x依赖spdep,需单独安装
clusterProfiler4.8+对接最新GO注释库
scanpy1.9.x与anndata 0.10.10版本匹配
MAGeCK0.5.9.5用于sgRNA筛选统计

提示:如果R端monocle3和Seurat同时加载报“non-exported S3 method”相关错误,建议先加载monocle3再加载Seurat,或者干脆用两个独立R session分别做聚类和轨迹分析,最后只交换对象文件。

6. 从复现到迁移:这套方法还能用在哪里

我最初关注这篇工作,就是因为它提供了一个可复用的研究框架。如果跳出肌肉融合这个具体表型,这套“CRISPR筛选+Bulk转录组+单细胞轨迹+复合物富集”组合拳,完全可以迁移到其他细胞分化或器官发育问题中,比如:

  • 脂肪细胞分化中的融合与脂滴形成;
  • 骨细胞成熟过程中的矿化与基质重塑;
  • 神经元突触形成的细胞粘附与信号复合物组装;
  • 肿瘤细胞与基质细胞的异型融合(肿瘤相关巨细胞形成)。

迁移时的关键改动是:CRISPR筛选用对应的表型报告系统,单细胞轨迹设定为目标分化路径,复合物数据库改写成该领域的已知互作注释。虽然每个领域的背景基因集不同,但分析框架是完全一致的。

如果要给一个实操排序,我的建议是:先花两周把作者的R和Python管线完整跑通,保证每个处理步骤的输出都与你自己的数据格式兼容;再用自己的一套小规模预实验数据走一遍流程,解决掉批次效应和注释问题;最后再扩大样本量进入正式分析。这套节奏能极大降低后期返工的风险。

我个人在实际复现中还有一个体会:这类多组学项目最耗时间的往往不是建模,而是“对齐”——把不同数据源的细胞注释梳理成同一个表型语言。作者花了大量精力把成肌细胞、融合前体、肌管这些状态从UMAP和轨迹上一一对应到Bulk的时序分化轴上,这一步一旦打通,后面的富集分析就是水到渠成。如果你也想做类似的课题,我建议尽早开始整理你的注释体系,不要等到分析后期再来补。只要这一步做扎实,23个复合物的结论完全可以复现,甚至在你自己的体系里发现新的功能模块。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询