3. 组学数据预处理与标准化工程

多组学药物重定位分析的第一步,不是建模,而是把来自转录组、蛋白质组、代谢组等不同平台的原始测量值,转换成彼此可比、可联合分析的数值空间。不同平台产生的数据在量纲、动态范围、缺失机制和批次效应上差异极大:RNA-seq 的原始 read count 受基因长度和测序深度双重影响,质谱蛋白质组的 LFQ 强度跨越 5~6 个数量级,代谢组峰强度则同时受离子化效率和上样量波动影响。如果直接把这些数值拼接进同一个特征矩阵,后续的相似性度量、网络推断和重定位打分都会被量纲主导,得到看似显著却不可复现的结论。本节围绕归一化、对数转换、缺失值插补、离群样本检测四个核心环节,给出可落地的处理逻辑与自动化脚本设计思路。

一、归一化:先消除技术性尺度差异

转录组层面最常用的是 TPM 与 FPKM。两者都先按基因长度归一化,再按测序深度归一化,区别在于归一化的顺序:FPKM 先除以基因长度(kb)再除以总测序深度(百万 reads),TPM 则先除以基因长度得到 rate,再除以所有 rate 之和并乘以 10⁶。这一顺序差异导致同一基因在两种度量下的数值不同,但 TPM 的每个样本总和恒为 10⁶,样本间可比性更好,因此跨样本比较优先使用 TPM。示例:某基因 count 为 2000,长度 2 kb,样本总 count 为 4×10⁷,则 FPKM ≈ (2000/2)/(40) = 25;若该样本所有基因 rate 之和为 8×10⁵,则 TPM ≈ (1000/8×10⁵)×10⁶ = 1250。数值不同,但排序关系一致。

蛋白质组 LFQ 强度通常先做 log2 转换,再按样本中位数或总强度归一化,以校正上样量和离子化效率差异。代谢组峰强度则常用中位数归一化、概率商归一化(PQN)或内标归一化。PQN 的核心是:先计算每个代谢物在所有样本中的中位数作为参考谱,再对每个样本求其与参考谱的比值中位数作为校正因子,最后用该因子除原始强度。相比简单中位数归一化,PQN 对样本中大量不变代谢物更稳健。

二、对数转换:压缩动态范围、稳定方差

对数转换不是可选项,而是多数组学数据的默认前置步骤。log2 转换能把乘性误差转为加性误差,使高丰度特征不再主导距离计算,同时让近似对数正态的分布更接近对称。转录组 TPM 通常做 log2(TPM+1),加 1 是为了避免零值取对数无定义;蛋白质组 LFQ 强度一般直接 log2,因为质谱强度本身已是正值且很少为零;代谢组峰强度在归一化后同样建议 log2 或 log10。需要注意:对数转换应在归一化之后、插补之前进行,否则插补值会被量纲扭曲。

三、缺失值插补:区分机制再选方法

缺失值处理的关键是先判断缺失机制。转录组中的零值多为真实低表达或未检出,属于“生物学零”;蛋白质组和代谢组中的缺失则常分为两类:完全随机缺失(MCAR)和低丰度导致的随机缺失(MNAR)。对 MNAR,简单用均值或中位数插补会系统性高估低丰度特征,推荐使用下限插补,例如用该特征最小观测值的 1/5 或全局最小值的 0.2 倍填充。对 MCAR,可用 KNN 或随机森林插补,利用特征间相关性恢复缺失值。实践中建议:缺失率 > 50% 的特征直接剔除;缺失率 20%~50% 的特征用下限插补并标记;缺失率 < 20% 的特征用 KNN 插补。所有插补决策必须记录在日志中,便于复现。

四、离群样本检测:多指标交叉判断

离群样本会严重拉偏后续的差异分析和网络推断。建议同时观察三类指标:一是样本间相关性热图,若某样本与其余样本的 Pearson 相关系数中位数低于 0.8,需警惕;二是 PCA 或 UMAP 投影,若某样本远离同类样本簇超过 3 倍四分位距,视为候选离群;三是层次聚类树,若某样本在很早就单独分叉,也提示异常。三类指标中至少两类同时报警,才判定为离群并考虑剔除。剔除前应回溯原始数据,确认是否为批次、降解或标注错误,而非真实生物学变异。

多组学预处理与标准化流水线 原始测量值 → 归一化 → 对数转换 → 缺失插补 → 离群检测 → 标准化矩阵 转录组 raw count / FPKM 蛋白质组 LFQ intensity 代谢组 峰强度 / 峰面积 其他组学 甲基化 / 突变等 ① 归一化:消除技术性尺度差异 TPM / FPKM 中位数 / 总强度 PQN / 内标 平台专用方法 ② 对数转换:压缩动态范围、稳定方差 log2(TPM+1) | log2(LFQ) | log2(峰强度) ③ 缺失值插补:先判机制,再选方法 缺失率 > 50% → 剔除 20%~50% → 下限插补 < 20% → KNN 插补 ④ 离群检测:相关性 + PCA + 聚类,两类报警才剔除 输出:标准化特征矩阵 + 处理日志

五、标准化流程自动化脚本设计

把上述步骤固化为脚本,是保证多组学重定位分析可复现的关键。脚本应遵循“配置驱动 + 分步执行 + 日志留痕”的原则。下面给出一个 Python 脚本骨架,使用 YAML 配置文件描述每个组学的处理参数,主流程按组学类型分派到对应处理函数。

# config.yaml
transcriptome:
  input: "data/rna_counts.csv"
  normalize: "tpm"
  gene_length_col: "length"
  log: "log2_tpm_plus1"
  missing:
    drop_threshold: 0.5
    impute: "knn"
    knn_k: 10
proteome:
  input: "data/protein_lfq.csv"
  normalize: "median"
  log: "log2"
  missing:
    drop_threshold: 0.5
    impute: "min_factor"
    min_factor: 0.2
metabolome:
  input: "data/metab_peak.csv"
  normalize: "pqn"
  log: "log2"
  missing:
    drop_threshold: 0.5
    impute: "knn"
    knn_k: 5
outlier:
  corr_threshold: 0.8
  pca_mad: 3
  min_votes: 2

主脚本读取配置后,依次执行:加载矩阵 → 按组学类型归一化 → 对数转换 → 缺失率过滤与插补 → 合并为统一特征矩阵 → 离群样本检测 → 输出标准化矩阵与日志。每一步都写入 preprocess.log,记录样本数、特征数、缺失率、插补方法、离群判定结果。这样,当后续重定位结果出现异常时,可以快速定位是归一化参数、插补策略还是样本剔除导致的。

建议在脚本中固定随机种子(如 random_state=42),并对 KNN 插补和随机森林插补保留插补前后分布对比图,便于人工复核。
不要对已经 log 转换的数据再次做中位数归一化,也不要在插补后再做 log 转换。顺序错误会引入不可逆的数值扭曲,且难以通过后续分析察觉。

完成上述流程后,得到的标准化矩阵应满足:各样本整体分布对齐、特征动态范围压缩、缺失值有明确处理记录、离群样本有判定依据。这份矩阵才是后续差异分析、共表达网络和药物重定位打分的可靠输入。工程上,建议把该脚本封装为可配置的 CLI 工具,支持 --config 指定配置文件、--dry-run 仅检查数据质量、--report 输出 HTML 质量报告,使预处理环节从一次性代码升级为可复用、可审计的标准化组件。