05 缺失值的两种来源与策略对比
05 缺失值的两种来源与策略对比
蛋白质组学的缺失值不是噪声,而是信息:为什么这个样本里测不到这个蛋白?是丰度真的低于检测限(MNAR,missing not at random),还是仪器本次没扫到(MCAR,missing completely at random)?两种来源对应不同的插补策略,用错会引入系统偏差。
两种缺失模式
| 类型 | 直观含义 | 典型表现 | 推荐策略 |
|---|---|---|---|
| MNAR | 蛋白真的没表达或低于检测限 | 同一蛋白在某组全部缺失 | 左截断分布插补(MinProb、QRILC) |
| MCAR | 仪器随机漏扫 | 缺失分散,组间均匀 | KNN、最近邻、直接删除 |
实际数据里两种几乎总是混合。识别方法:看缺失分布。
library(naniar)
library(ggplot2)
# proteinGroups.txt 已读入为 prot_mat(行:蛋白,列:样本)
gg_miss_var(prot_mat, show_pct = TRUE)
如果某些蛋白只在某一组缺失,多半是 MNAR;如果缺失零散且与样本注入顺序相关,多半是仪器层面的 MCAR。
DEP 包的混合策略
DEP 默认按蛋白判断 MNAR:如果某蛋白在某条件下完全缺失,认为是 MNAR,用左截断(MinProb)插补;其他用 KNN。
library(DEP)
# data_filt 是 SummarizedExperiment 对象
data_imp <- impute(data_filt, fun = "MinProb", q = 0.01)
# 或显式混合策略
data_imp <- impute(data_filt, fun = "man",
shift = 1.8, scale = 0.3) # MNAR 部分
# 仅 KNN
data_imp <- impute(data_filt, fun = "knn", k = 5)
三种策略的对比实验
下面这段对同一份数据跑三种插补,看下游差异蛋白结果差多少。
library(DEP)
library(dplyr)
run_pipeline <- function(se, fun, ...) {
imp <- impute(se, fun = fun, ...)
diff <- test_diff(imp, type = "control", control = "Ctrl")
add_rejections(diff, alpha = 0.05, lfc = 1)
}
mp <- run_pipeline(data_filt, "MinProb", q = 0.01)
knn <- run_pipeline(data_filt, "knn", k = 5)
mix <- run_pipeline(data_filt, "MinProb", q = 0.01) # default in DEP
# 比较显著蛋白集
sig <- function(x) rowData(x)$significant %>% which() %>% rownames(rowData(x))[.]
length(intersect(sig(mp), sig(knn)))
length(setdiff(sig(mp), sig(knn)))
经验:MNAR-only 策略往往会高估"组特异性蛋白"的差异;KNN-only 会把真正的 MNAR 蛋白稀释到组间均值。混合策略(DEP 默认)通常最稳。
报告中如何写
差异蛋白结果表里建议加两列:imputed_in_n_samples 和 imputation_method,让读者能区分"测到的差异"和"插出来的差异"。审稿人最常问的就是这一点。
res_table <- get_results(mix) %>%
mutate(
imputed_in_n_samples = rowSums(is.na(assay(data_filt)[ID, ])),
imputation_method = ifelse(imputed_in_n_samples > n_samples / 2,
"MinProb", "KNN")
)
常见坑
坑 1:MinProb 插补在 MCAR 场景下引入负偏差
MinProb 从分布左尾采样,假设缺失是因为"丰度低于检测限"。但如果某个高丰度蛋白只是因为仪器随机漏扫而缺失(MCAR),MinProb 会给它一个远低于真实值的插补值,导致该蛋白被错误地判为"下调"。混合策略(先判断 MNAR/MCAR,再分别处理)更安全。
坑 2:KNN 插补让组间差异缩小
KNN 用邻近样本的均值填充,如果邻居来自不同条件组,插补值会趋向组间均值,抹平真实的组间差异。在分组数据中,KNN 应该限制邻居在组内选取(impute.knn 默认不区分组)。
坑 3:插补前没检查缺失率
对缺失率 > 70% 的蛋白做插补,结果几乎全是"编"出来的。这些蛋白的差异分析结果不可信。建议:缺失率 > 50% 的蛋白在差异分析后标注为"低置信度",或者直接在插补前过滤掉。
坑 4:插补策略换了但结论差异大却不讨论
三种插补方法给出的显著蛋白列表只有 60% 重叠。很多人只跑一种就报告结果。稳健的做法是:跑 2-3 种插补策略,取交集作为高置信度候选,差集列为"插补敏感"蛋白并在讨论中说明。
下一步
接着深入:
- 02 DEP 差异蛋白分析 — 完整 DEP 管线中的插补步骤
- 06 翻译后修饰:磷酸化位点定量 — PTM 数据的缺失值更复杂
横向延伸:
- 多组学整合 02 数据清洗 — 蛋白组 KNN 插补在整合流程中的位置
- 多组学整合 05 MOFA2 — MOFA2 能直接处理缺失值,不需要预先插补
参考资源
- DEP 官方手册的 imputation 章节
- Lazar 等人的对比文章 "Accounting for the multiple natures of missing values in label-free quantitative proteomics data sets"(J. Proteome Res. 2016)
- naniar 包文档:缺失值可视化