异常值检测与剔除
在分子技术与组学研究中,数据矩阵往往包含成千上万个特征和数十至数百个样本。异常值可能来自真实的生物学异质性,也可能来自技术误差。异常值检测与剔除的目标不是“让数据好看”,而是识别并妥善处理那些会扭曲统计推断、聚类结构或预测模型的数据点。
异常值指与大多数观测明显不一致的观测。在组学数据中,常见来源包括:
- 生物学真实极端:稀有细胞亚群、疾病亚型、治疗响应者。
- 技术噪声:文库质量差、测序深度低、质谱信号漂移。
- 样本处理:降解、批次效应、试剂差异。
- 数据生成:归一化失败、缺失值填充、录入错误。
因此,核心问题不是“是否偏离”,而是“偏离是否代表错误”。错误异常值应处理,真实极端值则可能包含重要生物学信号。
检测前的准备
在运行任何检测算法前,应先完成以下步骤:
- 明确分析单位:样本级、特征级还是细胞级。
- 检查数据分布:组学数据常呈偏态,必要时进行 log 转换。
- 标准化或归一化:避免技术因素主导距离计算。
- 保留元数据:批次、分组、QC 指标等。
- 先可视化:箱线图、PCA、相关性热图可快速暴露问题。
常用检测方法
单变量方法
- Z-score:通常以 |z| > 3 为阈值,但假设近似正态,且易受异常值影响。
- 稳健 Z-score:基于中位数和 MAD,适合偏态数据。
- IQR 规则:低于 Q1 - 1.5×IQR 或高于 Q3 + 1.5×IQR。
- 箱线图:适合快速筛查单个基因或蛋白的极端值。
多变量方法
- 马氏距离:考虑变量间协方差,适合样本级异常检测。
- PCA:观察投影空间中的离群点,可结合 Hotelling T²。
- 聚类或 kNN:距离密度明显偏低者视为异常。
- 隔离森林、LOF:非参数方法,适合高维数据。
- 稳健协方差:避免协方差矩阵被异常值污染。
组学场景中的分层
- 样本级:整体表达谱偏离、样本间相关性低、PCA 离群。
- 特征级:某基因或蛋白在少数样本中极端高表达。
- 细胞级:单细胞中线粒体比例高、检测基因数异常。
具体平台的 QC 指标会在测序技术与组学分析、基因工程与 CRISPR 技术等专门文章中展开,本文只讨论通用框架。
剔除还是保留
检测到异常值后,不应默认删除。可参考以下策略:
- 明确错误且无法修复:剔除并记录原因。
- 真实生物学极端:保留,使用稳健统计或分层分析。
- 不确定:标记为可疑,进行敏感性分析。
- 替代方案:缩尾、截断、稳健回归、混合模型。
- 禁止:仅因影响显著性而删除数据点。
示例:样本级异常值筛查
假设表达矩阵 X 的样本为行、基因为列。先进行 log2 转换,再结合样本间相关性、PCA 和稳健马氏距离。
import numpy as np
from scipy.stats import chi2
from sklearn.decomposition import PCA
X = np.log2(expr + 1)
# 样本间平均相关性
corr = np.corrcoef(X)
mean_corr = (corr.sum(axis=1) - 1) / (X.shape[0] - 1)
# PCA 投影
pca = PCA(n_components=2)
scores = pca.fit_transform(X)
# 稳健马氏距离
med = np.median(X, axis=0)
mad = np.median(np.abs(X - med), axis=0) + 1e-9
Z = (X - med) / mad
cov = np.cov(Z, rowvar=False)
inv_cov = np.linalg.pinv(cov)
d2 = np.einsum('ij,jk,ik->i', Z, inv_cov, Z)
p = 1 - chi2.cdf(d2, df=X.shape[1])
outliers = np.where(p < 0.001)[0]
实际判断应综合 mean_corr 偏低、PCA 远离主体、马氏距离 p 值较小等多个证据,避免依赖单一方法。
常见陷阱与最佳实践
- 数据泄漏:划分训练集与测试集后,仅用训练集确定阈值。
- 批次混杂:异常值可能全部来自某一批次,应先校正或分层。
- 多重检验:特征级检测需进行 FDR 校正。
- 记录透明:报告方法、阈值、剔除数量和原因。
- 可重复:保留代码、版本和随机种子。
- 稳健优先:能用稳健统计时,不轻易删除数据。
小结
异常值检测与剔除是组学数据质控的关键环节。通用流程是:理解来源、预处理、单变量与多变量结合、区分错误与真实极端、选择剔除或稳健建模,并完成敏感性分析。该框架可跨转录组、蛋白组、代谢组和单细胞组学复用,为后续专门技术文章中的具体 QC 与算法讨论提供基础。