
做生信分析这些年最直观的感受就是孟德尔随机化、单细胞测序、转录组分析、网络药理学这几个词几乎快成了科研服务圈的四大金刚。打开任何一个学术交流群十个课题咨询里至少有六七个会和它们沾边。不管是准备开题的研究生、想发高分文章的临床医生还是刚入门想做分析业务的技术人员都会遇到同样的问题这些分析到底怎么做数据从哪来参数怎么调结果怎么解读更关键的是它们之间能不能串起来拼成一个完整的故事。这篇文章就从我这几年实际操作的角度把这几大分析模块的技术选型、实操流程和常见坑位一次讲清楚。不会跟你扯虚的全是能做能跑的干货。1. 生信分析服务的核心逻辑与项目拆解1.1 为什么偏偏是这四个分析最火先说第一个问题为什么孟德尔随机化、单细胞测序和转录组、网络药理学这几个方向会集中出现在生信服务里这背后其实对应了三类完全不同的科研需求。孟德尔随机化解决的是因果推断问题。传统的观察性研究经常会被混杂因素和反向因果搞得灰头土脸比如我们发现硒水平低的人更容易得某种病但你没法确定是低硒导致疾病还是疾病本身把硒消耗掉了。孟德尔随机化用遗传变异作为工具变量因为基因型在受精那一刻就定了不受后天环境干扰也不大可能被疾病状态逆转所以它给出的关联更接近因→果的方向。这两年这个方法火得不行就是因为GWAS公共数据积累到了足够的规模任何人都能拿着公开数据做出一套高质量的因果推断分析不需要花一分钱做实验。单细胞测序和转录组分析解决的是机制阐释问题。转录组告诉你哪些基因变了单细胞测序进一步告诉你变了的基因具体在哪种细胞类型里发挥作用。这两个技术结合起来可以让你的课题从现象描述直接升级到机制探索这也是为什么高分文章普遍要求你有机制层面的证据。网络药理学则是中药和天然产物研究的利器。它的核心思想是多成分、多靶点、多通路——一个中药复方里可能包含上百种活性成分每种成分又能作用到多个靶点传统一个药一个靶点的研究模式根本玩不转。网络药理学通过数据库筛选、网络构建和分子对接把哪些成分作用于哪些靶点、参与了哪些通路这个问题用计算的方法快速回答出来是中医药相关SCI论文的标准动作。1.2 分析服务的完整交付闭环我平时接生信分析项目从来不是跑完程序把图丢给客户就完事了。一个合格的分析服务应该是从需求梳理到最终写作支持的全流程闭环。第一步是需求沟通。这个环节最容易被忽略但恰恰是最重要的。客户说我要做孟德尔随机化你得分清楚他是想要一篇纯生信文章还是给自己的临床样本数据补充因果推断证据客户说我要做转录组分析你得知道他的实验设计是两组比较、多组时间序列还是配对设计。不同的目标对应完全不同的分析策略一开始没问清楚后面返工的成本是非常高的。第二步是方案设计。根据需求和手头的数据资源确定分析模块、数据来源、参考数据库版本、主要软件工具。这一步我会出一份详细的分析计划书把每个环节用什么方法、输出什么结果、大约需要多久都定下来。第三步是数据获取与处理。MR分析需要下载GWAS summary数据单细胞测序需要从原始测序数据开始走分析流程网络药理学需要从数据库里收集成分和靶点信息。这个阶段占掉整个项目大约60%的时间大部分问题也都出在数据清理这一步。第四步是结果交付与分析报告撰写。除了必要的图表和原始代码我会额外附上一份结果说明文档把每个图表的含义、关键结论的解读思路、写作时可以用到的表述都写清楚。很多客户对生信分析其实一知半解你光给他图他根本没法写文章所以报告是服务里含金量最高的部分。第五步是售后答疑。分析交付之后客户在投稿、返修甚至写Introduction的时候都可能遇到问题靠谱的服务方应该提供至少一个月左右的技术答疑支持。2. 孟德尔随机化分析核心技术拆解2.1 MR分析的基本原理与三步假设孟德尔随机化说到底就是一句话用遗传变异做工具变量来推断暴露因素和结局之间的因果关系。要保证这个推断成立工具变量必须满足三个核心假设。第一是相关性假设也就是工具变量必须与暴露因素显著相关这个一般通过全基因组关联分析得到的显著位点来保证阈值通常取p 5e-8。第二是独立性假设工具变量不能与混杂因素相关。这个假设没法直接检验只能通过选择那些经过严格质控的SNP、并尽量调整可能的混杂来间接保证。第三是排他性假设工具变量只能通过暴露因素影响结局不能有其他通路。这个可以用MR-Egger截距和MR-PRESSO全局检验来评估是否存在水平多效性。打个比方你就明白了。我们想知道吸烟是否导致肺癌但直接看吸烟者和不吸烟者的肺癌发病率会受到运动习惯、职业暴露、经济水平等一堆因素干扰。如果把基因型当作是否容易成瘾的工具那么带有特定基因变异的人从出生起就更倾向于吸烟。由于基因是随机分配的这些携带者在其他所有特征上跟非携带者没有系统性差异这时候再比较两组人的肺癌发病率得出的关联就干净得多。2.2 数据获取与实操全流程做MR分析最常用的数据源是IEU OpenGWAS数据库里面有数万个公开的GWAS summary数据涵盖了包括FinnGen、UK Biobank等大型队列的各种表型数据。其次是GWAS Catalog这个更偏学术格式也更规范。如果是做药物靶点的MR还可以用eQTLGen、GTEx这些组织特异性的表达数量性状位点数据。实际操作中我一般直接使用R语言里的TwoSampleMR包。它把数据提取、工具变量筛选、数据整合、MR分析、敏感性分析全部封装好了两小时就能跑完一个标准的双样本MR。library(TwoSampleMR) # 从OpenGWAS提取暴露的工具变量 exposure_dat - extract_instruments( outcomes ieu-a-2, clump TRUE, pval 5e-8, r2 0.001, kb 10000 ) # 提取结局数据 outcome_dat - extract_outcome_data( snps exposure_dat$SNP, outcomes ieu-a-299 ) # 数据协调确保暴露和结局的效应等位基因一致 dat - harmonise_data(exposure_dat, outcome_dat) # 执行MR分析 res - mr(dat, method_list c( mr_ivw, mr_egger_regression, mr_weighted_median, mr_weighted_mode )) # 敏感性分析 mr_pleiotropy_test(dat) # 水平多效性检验 mr_singlesnp(dat) # 单个SNP分析 mr_leaveoneout(dat) # 留一法分析其中需要重点解释的是工具变量筛选时的那几个参数。pval 5e-8是GWAS全基因组显著性的经典阈值如果用这个阈值筛出来的SNP太少也可以放宽到1e-5但必须在方法里注明。clump TRUE表示进行连锁不平衡修剪把处于高度连锁不平衡状态的SNP去掉保留最强关联的代表性位点。r2 0.001和kb 10000意味着在10兆碱基范围内两个SNP之间的r²不能超过0.001。这个标准相当严格有的研究也接受r2 0.01但审稿人可能会质疑。工具变量选完之后还要计算F统计量来评估弱工具变量偏倚。F 10是行业公认的标准线。F的计算公式是F (N - k - 1) / k × R² / (1 - R²)其中N是样本量k是工具变量个数R²是工具变量对暴露的解释度。如果一个研究抽出来的SNP整体R²只有0.5%样本量有2万人那么F值大概就是在10附近说明这个工具变量也就是将将能用。低于10的话结果最好不要直接用。2.3 结果解读与审稿人最关心的敏感性分析MR分析的核心结果是IVW方法给出的效应估计值IVW相当于对每个SNP的Wald比值做加权平均权重是SNP与暴露关联方差的倒数。IVW在不存在水平多效性时效率最高但如果数据里混入了多效性SNP结论就可能系统性偏倚。所以审稿人一定会看敏感性分析第一个是异质性检验。用Cochran Q统计量评估各个SNP的效应估计值之间是否一致。如果显示显著异质性就要警惕某些SNP存在多效性。第二个是水平多效性检验。MR-Egger回归的截距项反映的是定向多效性。截距显著不等于零说明工具变量很可能通过暴露以外的通路影响结局此时主要结论可能不可靠。MR-PRESSO则可以直接识别并剔除离群的SNP剔除后再重新分析。第三个是留一法分析。逐个剔除SNP后重新计算效应看看结论是否依赖某一个SNP。如果剔除某个SNP后效应急剧变化说明该位点是结论的支柱需要特别小心。第四个是方向性验证。用Steiger方向性检验确认暴露到结局的方向避免把因果方向搞反。说实话我接过不少MR项目相当一部分最终结论被推翻不是数据算错了而是没有做全套的敏感性分析或者做了但不会解读。记住不完整的敏感性分析比不做分析更危险——审稿人一眼就能看出来。3. 单细胞测序数据分析全流程与避坑实录3.1 质控门槛到底怎么定才算合理单细胞测序数据分析第一个绕不开的环节是细胞质控。所有下游分析的可靠性都建立在你质控做得好不好的基础上。常规的质控指标有三类。第一是每个细胞的UMI总数也就是nCount_RNA。UMI太少说明捕获效率低可能是空液滴或者测序深度不足UMI太高则可能是双细胞或者多细胞被当成了一个。第二是检测到的基因数nFeature_RNA这个指标同样反映捕获质量。第三是线粒体基因比例percent.mt。线粒体基因比例过高说明细胞状态不好甚至已经死亡细胞浆内的RNA降解了只有线粒体内的RNA相对稳定。对于大多数人和小鼠组织percent.mt在20%以下是一个相对安全的门槛但不同组织差别很大。以10x Genomics平台为例上游流程一般先用Cell Ranger做样本拆分、比对和定量然后读进Seurat对象做后续处理library(Seurat) scRNA - Read10X(data.dir filtered_feature_bc_matrix/) obj - CreateSeuratObject(counts scRNA, project sample1, min.cells 3, min.features 200) # 质控过滤 obj[[percent.mt]] - PercentageFeatureSet(obj, pattern ^MT-) obj - subset(obj, subset nFeature_RNA 200 nFeature_RNA 5000 percent.mt 20)需要注意的是质控阈值不要盲抄别人的参数。我曾接过一个项目客户拿的是肿瘤样本的单细胞数据里面大量细胞是肿瘤细胞和成纤维细胞。肿瘤细胞由于染色体拷贝数变异基因表达模式紊乱nFeature_RNA普遍偏高percent.mt也会比正常组织高一些。如果机械套用nFeature_RNA 5000这个阈值会把一大批真实的肿瘤细胞直接滤掉。所以在项目开始前我一定先看数据的分布曲线再结合组织类型和生物学背景合理设定阈值。质控的目的是去除质量差的细胞不是把真实细胞误删。3.2 细胞注释是单细胞分析的最关键一步质控完之后是标准化、高变基因识别、PCA降维、UMAP/tSNE可视化和聚类。这些步骤在Seurat里几乎都是标准流水线参数一般不需要大动。真正拉开差距的是细胞类型注释。细胞注释的策略主要有两种手动注释和自动注释。自动注释就是用SingleR、CellTypist这类工具拿参考数据库里的marker基因表做打分。这个方法快、标准化但时灵时不灵——尤其是对肿瘤样本或稀有细胞类型参考数据库覆盖不全结果经常把细胞类型标错。手动注释则依赖领域知识逐一查看每个cluster的top差异表达基因结合已知的经典marker来判定。比如CD3D、CD3E高表达基本可以判断是T细胞MS4A1、CD79A高表达基本是B细胞LYZ、CD68高表达可能是巨噬细胞。实际操作时我会先用自动注释跑一遍拿到候选标签再对每个cluster手动验证一下marker表达把自动注释明显错误的地方纠正过来。细胞注释完成后就可以做各种下游分析了。最常见的三个方向差异分析与富集分析。比较不同细胞类型、不同处理条件之间的差异表达基因然后做GO/KEGG富集。拟时序分析用monocle3或Slingshot推断细胞分化轨迹。这个分析尤其适合发育生物学或者干性相关研究比如你想证明某个细胞亚群是肿瘤干性群体其他亚群是从它分化出来的拟时序分析就能提供计算层面的支持。细胞通讯分析用CellChat或CellPhoneDB分析细胞间配体-受体相互作用。这个分析能告诉你哪些细胞亚群之间存在显著的信号交流在肿瘤免疫微环境和组织发育类文章中几乎是标配。3.3 单细胞分析中最容易被质疑的三个坑第一个坑是样本量不足。有些客户只做了两三个样本就想得出群体层面的结论这在统计上是站不住脚的。单细胞分析的基本单位依然是生物学重复而不是细胞数。如果你有3个处理组和3个对照组那么组间差异分析就应该以样本为单位做伪bulk分析而非把所有细胞混在一起算否则得到的p值会因为伪重复问题而过于乐观审稿人很容易挑刺。第二个坑是marker基因的特异性。有些marker基因并不是某个细胞类型专有的。典型的就是PTPRC也就是CD45它在所有造血来源的免疫细胞里都表达只适合用来区分免疫细胞和非免疫细胞不能用来细分T细胞和B细胞。做注释的时候最好使用多个marker共同判断单个marker下结论风险很大。第三个坑是doublet的处理。双细胞问题是单细胞数据中不可避免的实验噪声尤其在10x平台上比例可以达到0.8%到8%。现在一般用DoubletFinder或scDblFinder做预测预测出来的doublet最好在质控阶段就排除掉否则它们会形成独立的小cluster注释时很容易被误认为是稀有细胞类型。4. 转录组数据分析流程与实操要点4.1 从fastq到表达矩阵的全链路流程转录组数据分析虽然是老牌分析但每年还是有大量项目在这里翻车。我习惯把整个流程拆成上游和下游两部分。上游是从原始测序数据到表达矩阵一般包括质量评估、过滤、比对和定量下游则是从表达矩阵开始的差异分析和功能富集。先看上游。拿到fastq文件之后第一步要用fastp或Trimmomatic做质控去除低质量碱基和接头污染。这一步很重要因为低质量reads会直接影响后续比对的准确性。质控完成后用STAR或HISAT2做比对。STAR的速度快、准确度高是我处理人和小鼠转录组数据的首选。比对得到的bam文件再用featureCounts或者Salmon做基因水平的定量。# 质控 fastp -i sample_R1.fq.gz -I sample_R2.fq.gz \ -o clean_R1.fq.gz -O clean_R2.fq.gz \ -h sample_fastp.html -j sample_fastp.json # STAR比对 STAR --runThreadN 16 \ --genomeDir genome_index/ \ --readFilesIn clean_R1.fq.gz clean_R2.fq.gz \ --readFilesCommand zcat \ --outSAMtype BAM SortedByCoordinate \ --outBAMsortingThreadN 8 \ --outFileNamePrefix sample_ # featureCounts定量 featureCounts -a annotation.gtf \ -o counts.txt \ -T 8 -p --countReadPairs \ sample_Aligned.sortedByCoord.out.bam比对完之后一定要看一眼比对率。人和小鼠转录组数据一般比对率在80%以上低于70%基本说明数据质量有问题要么是建库过程中样本发生了降解要么是物种注释错了。这个排查要在流程早期完成否则跑到后面全是在垃圾数据上做分析。4.2 差异表达分析阈值设定和统计模型拿到表达矩阵后差异分析首选DESeq2其次是edgeR。DESeq2使用的是负二项分布模型对低表达基因和异常高表达基因的处理比较稳健也不需要手动算标准化因子。library(DESeq2) countData - read.csv(counts.txt, row.names 1, check.names FALSE) colData - data.frame(condition factor(c(ctrl,ctrl,treat,treat))) dds - DESeqDataSetFromMatrix(countData countData, colData colData, design ~ condition) dds - DESeq(dds) res - results(dds, contrast c(condition,treat,ctrl))差异基因的筛选阈值行业标准是|log2FoldChange| 1且padj 0.05。但这里有个很多人没想明白的问题padj是多重检验校正后的p值如果样本量小、差异较弱用padj 0.05可能一个基因都筛不出来。这时候是不是应该放宽到0.1实话说这种临时的阈值调整是可以做的不过要在方法部分写清楚而且最好用GSEA这种不依赖阈值的方法作为补充证据。GSEA和GO/KEGG富集分析的差别在于GO/KEGG看的是哪些通路里的差异基因变多了GSEA看的则是整个基因表达谱按表达量排序后哪些通路的基因整体偏向表达上调或下调。GSEA不需要提前筛选差异基因对效应的敏感度更高很多表达变化小而广泛的通路只有GSEA才能检测出来。我写分析报告时通常两个都做让结果互相印证。4.3 转录组分析常见的批次效应问题批次效应是所有组学数据分析都会遇到的难题。转录组数据尤其明显——不同批次的文库制备、不同测序仪器、不同试剂盒都会在表达谱上留下系统差异。如果实验设计把处理组和对照组安排在同一个批次的样本里那是理想情况。但现实中很多客户是从医院收集临床样本样本本来就是分批收集、分批测序的处理组和对照组天然分布在不同测序批次里。这时候如果直接做差异分析你找到的可能导致一部分是批次差异而不是真实的生物学差异。检测批次效应最直接的办法是做PCA图用批次信息给样本点着色。如果PC1就能把不同批次明显分开说明批次效应很强必须用ComBat-seq或limma的removeBatchEffect做校正。但这里有个大坑校正的时候一定要注意协变量设计把真正的生物学因素比如分组信息作为主要变量保留把批次作为调整变量否则会把真实的生物差异也一并抹掉。5. 网络药理学与多组学整合思路5.1 网络药理学的基本分析框架网络药理学的分析思路其实很直白药物里的活性成分会作用于某些蛋白靶点这些靶点中有一部分恰好跟疾病相关的靶点重合重合的部分就可能是药物治疗疾病的关键作用节点。具体操作分五步第一步筛选药物活性成分和对应靶点。中药成分数据库最常用的是TCMSP它内置了口服生物利用度和类药性两个筛选标准。TCMSP里没有的成分可以用BATMAN-TCM或者ETCM去查。查询之后用SwissTargetPrediction对成分进行靶点预测不过预测出的是结构相似的潜在靶点建议作为候选列表使用别当成确证结论写进文章。第二步收集疾病相关靶点。GeneCards是最常用的数据库它的好处是可以根据相关得分筛选一般把score阈值定在5以上否则靶点数量会非常多后续分析根本没法聚焦。OMIM和TTD作为补充把遗传证据和已知药靶信息也纳入进来。第三步取交集得到药物-疾病的共同靶点然后用STRING数据库做PPI蛋白互作网络分析。STRING会给每个蛋白对打分一般取combined score 0.4作为阈值。第四步把PPI网络导入Cytoscape做可视化用MCODE插件找功能模块用CytoHubba识别hub基因。hub基因就是网络中连接度最高的那些节点通常被认为是药物治疗的关键靶点。第五步对hub基因做GO/KEGG富集分析看看它们集中在哪些生物学过程和信号通路上。5.2 网络药理学如何与转录组、单细胞、MR整合这几年纯网络药理学文章已经很难发一个重要原因是分析内容太单薄、缺乏验证。但是把网络药理学和前面说的几个分析串联起来就是完全不同的叙事逻辑。最常用的整合思路是这样的先用网络药理学锁定候选靶点再用临床转录组数据验证这些靶点是否在疾病状态下确实差异表达接下来用单细胞测序数据确认这些差异表达的靶点主要在哪类细胞里发挥功能最后用孟德尔随机化从遗传学层面验证靶点和疾病之间的因果关系。举个例子。某个治疗糖尿病的中药复方网络药理学筛选出50个潜在靶点。你拿到一个糖尿病患者的转录组数据集发现这50个靶点里有12个在患者和正常人之间存在显著差异表达。接下来用单细胞数据去看发现其中5个靶点主要在胰岛β细胞里高表达。然后你再用这5个基因附近的eQTL位点做MR分析发现其中两个基因的表达水平与糖尿病风险存在显著因果关联。到这一步故事的完整度就非常高了——从药物可能有用一直论证到具体作用于什么细胞、影响什么靶点、与疾病风险是否存在因果关联。这个整合思路恰恰也解决了单个方法的局限性。网络药理学最大的问题是预测性太强、假阳性高转录组能提供真实表达数据的支持单细胞告诉你细胞类型特异性的背景MR从遗传因果层面做终极验证。每一层都在补上前面一层的短板。6. 常见问题与排查技巧实录6.1 孟德尔随机化分析中的典型问题问题一从OpenGWAS提取工具变量时提示API连接失败或者输出为空。这个很常见尤其在国内网络环境下IEU数据库的API时好时坏。我的处理方法是先检查本地网络再用R包自带的下载函数多试几次。还是不行就手动去OpenGWAS网站下载对应数据的完整GWAS结果文件然后自己完成工具变量筛选、LD clumping这一步虽然麻烦但可控性强。问题二MR分析结果显著但暴露和结局来自同一队列或者包含重叠样本。这种情况容易产生样本重叠偏倚审稿人提出质疑时处理方式是在文章里讨论这一局限有条件的可以做敏感性分析来评估偏倚方向。另外选用不同来源的数据集做验证分析也是常规操作。问题三结局是二分类变量时OR值的方向和真实效应相反。很多人分析完发现O型血的人更不容易得新冠的结果跑去和疾病机制对不上其实是效应等位基因的编码方向在协调数据时出了问题。harmonise_data函数会自动对齐等位基因方向但输出结果一定要自己检查A1、A2的对应关系这是新手最容易犯的错误之一。6.2 分析服务项目中的沟通与交付经验最后聊几个我做了这么多分析项目之后特别有感触的经验。第一个经验永远不要把原始数据和代码顺手丢掉。哪怕项目交付了几个月客户可能在审稿人要求下需要补充某个分析或者换一个参数重新跑一遍。我习惯把每个项目的原始数据、处理脚本、环境配置文件全部归档一旦客户有需求几十分钟就能重新出结果。不归档的后果是几个月后客户拿着审稿意见找你你看着一堆命名混乱的文件根本想不起来当初怎么处理后数据重新处理既费时间又容易出错。第二个经验是写清楚方法学描述。很多客户直接把你生成的表格和参数描述粘贴到文章方法部分所以交付的文件里最好有一份方法段落模板写明软件版本、数据库版本、筛选阈值、统计方法。Word里默认拼写的错误也是问题经常发现客户把版本号抄错这时候就需要在交付说明里特别标明需要核对的关键参数。第三个经验是不要过度承诺。生信分析是计算层面的证据不是湿实验的金标准。比如单细胞注释只是基于marker基因的计算推断最终确认还得靠免疫荧光或流式实验。我在项目开始时就会和客户说清楚边界——哪些分析能做什么、不能做什么不然对方拿着计算预测的结果投出去审稿人一句缺乏实验验证就够他折腾很久了。6.3 分析过程中的时间管理与效率技巧生信分析项目多是同时进行多个尤其是不用做实验拿公共数据就能跑的分析排好时间先后可以省下大量等待时间。我的习惯是先跑计算量大的步骤比如单细胞的Cell Ranger比对、STAR比对这些任务一边跑一边做网络药理学靶点筛选这种不占计算资源的步骤。等比对完成了后续的Seurat分析也就顺手了。另外脚本要养成命名规范的习惯。我的处理脚本基本按01_QC.R、02_clustering.R、03_DE_analysis.R这样的格式命名每次运行前检查一遍输出路径避免因为工作目录混乱导致结果写错位置。这个小习惯能在项目多的时候省下大量排错时间。做生信分析服务最核心的工作能力不是写代码而是理解数据、理解生物学问题以及知道每一步分析结果该往哪个方向解释。技术工具更新太快今天流行的包明天可能就被更好的替代但这些底层的逻辑思考能力是始终不会过时的。