跳到主要内容

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_samplesimputation_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 种插补策略,取交集作为高置信度候选,差集列为"插补敏感"蛋白并在讨论中说明。

下一步

接着深入

横向延伸

参考资源

  • DEP 官方手册的 imputation 章节
  • Lazar 等人的对比文章 "Accounting for the multiple natures of missing values in label-free quantitative proteomics data sets"(J. Proteome Res. 2016)
  • naniar 包文档:缺失值可视化
AI 组学实践

让 AI 带我实战这一篇

AI 会读这篇文章后给你 3-5 步学习计划, 逐步带你学完,最后出 1-3 道题验证你掌握得怎么样。 登录后 AI 才能记住你的进度。

静态文件

离线资料下载

手册 HTML / PDF 已在后台预生成,点击后直接下载网站静态资源。