跳到主要内容

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")
)

参考资源

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

离线资料下载

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