作者:晔无殊  R语言中文社区专栏作者

博客地址: https://github.com/elise-is/Statistical_Blog/blob/master/Missing_Value/MVI.md


1. 简介


1.1 缺失值的分类

缺失值从数据分布上可被分为三类 (Gelman and Hill 2006, Little and Rubin (2002)) :missing completely at random (MCAR), missing at random (MAR), and missing not at random (MNAR)。

  • 完全随机缺失(MCAR):某一变量缺失值不依赖于其他任何原因的完全随机缺失

  • 随机缺失(MAR):某一变量的缺失与其他变量相关但与该变量本身的数值不相关

  • 非随机缺失(NMAR):某一变量的缺失和该变量本身的数值相关, e.g., 仪器的最低检测线:某被检测物质的含量低于该检测线则会产生非随机缺失(left-censored missing)

目前大部分填补缺失值的方法都是基于MCAR和MAR,这两种情况也相对比较难区别,因此本文会将这两种情况合并起来讨论。

1.2 缺失值的可视化

我一般拿到数据的第一件事就是用Amelia package (Honaker, King, and Blackwell 2011) 里面的missmap function看一下缺失值的分布情况。

require(magrittr)
require(Amelia)
load(file="MVI.RData")
missmap(test_na, col=c("black", "grey"), legend=FALSE, main = 'Missing Map')

# 对于某一变量的缺失值识别可用is.na()sum(is.na(test_na$Var_1))
## [1] 43

1.3 为什么要对缺失值进行处理

对于MCAR,直接删除缺失的样本一般不会对结果产生偏差,但会减少样本数量;对于非完全随机确实特别是MNAR,如果缺失值较多则会对结果产生很大的偏移。另一方面,很多后续的统计检验要求完整的没有缺失值的数据集, e.g., principal components analysis (PCA).

2. 目前常用的缺失值处理方法

2.1 行删除

2.1.1 直接删除有缺失值的样本

最简单粗暴的方法就是直接na.omit(),但是我们可以看到原来198个样本被删到了只剩4个。

test_na_rm <- na.omit(test_na)
dim(test_na)
## [1] 198  30
dim(test_na_rm)
## [1]  4 30

2.1.2 80%法则

80%法则 (Bijlsma et al. 2006)认为,当某一物质的非缺失部分低于总样本量的80%时,建议删除该物质。Modified 80%法则认为, 当某一物质的非缺失部分低于所有生物学亚组的80%时,建议删除该物质。

# remove variables with missing > 20% mis_prop <- sapply(test_na, function(x) sum(is.na(x))/length(x))var_rm <- names(mis_prop)[mis_prop > 1 - 0.8]var_rm # remove 7 variables
## [1] "Var_1"  "Var_2"  "Var_4"  "Var_6"  "Var_11" "Var_16" "Var_21"
test_na_rm <- test_na[, !colnames(test_na) %in% var_rm]test_na_rm <- na.omit(test_na_rm)
dim(test_na)
## [1] 198  30
dim(test_na_rm)
## [1] 83 23

去掉7个不符合80%法则的物质以后再用na.omit()删除有缺失的样本,最终的样本数量维持在了83个。

2.2 单变量填补

用单一变量的均值/中位数/二分之一最小值/零值进行补值,这种方法会导致数据分布的偏移,方差偏小,PCA上会看到一条补值导致的直线等问题。


2.2.1 MCAR/MAR

对于MCAR/MAR,可以用均值/中位数补值。

# meantest_na_mean_imp <- lapply(test_na, function(x) {    x[is.na(x)] <- mean(x, na.rm = T)    x})test_na_mean_imp_df <- do.call(cbind.data.frame, test_na_mean_imp)
# mediantest_na_median_imp <- lapply(test_na, function(x) {    x[is.na(x)] <- median(x, na.rm = T)    x})test_na_median_imp_df <- do.call(cbind.data.frame, test_na_median_imp)

2.2.2 MNAR

对于left-censored MNAR可以用二分之一最小值/零值进行补值。

# half of minimumtest_na_hm_imp <- lapply(test_na, function(x) {    x[is.na(x)] <- min(x, na.rm = T)/2x})test_na_hm_imp_df <- do.call(cbind.data.frame, test_na_hm_imp)
# zerotest_na_zero_imp_df <- test_natest_na_zero_imp_df[is.na(test_na_zero_imp_df)] <- 0

2.3 多变量填补

多变量填补的前提是其他变量对于该变量的可预测性,用其他变量作为independent variable,含有缺失值的该变量作为dependent variable,建立模型,用模型来预测该变量中的缺失值。

2.3.1 MCAR/MAR

目前常用的补值方法大部分都是针对MCAR/MAR的情况:missForest (Stekhoven and Bühlmann 2012), k-nearest neighbors (kNN) (Troyanskaya et al. 2001), singular value decomposition (SVD) (T. Hastie, Tibshirani, and Sherlock 1999, Stacklies et al. (2007)), 等等。

# 请先安装missForest packagerequire(missForest)# missForesttest_na_missForest_imp_df <- missForest(test_na)[[1]]
##   missForest iteration 1 in progress...done!
##   missForest iteration 2 in progress...done!
##   missForest iteration 3 in progress...done!
##   missForest iteration 4 in progress...done!
##   missForest iteration 5 in progress...done!
# 请先安装impute packagerequire(impute)# kNNtest_na_kNN_imp_df <-  test_na %>% data.matrix() %>% impute.knn() %>% extract2(1) %>% data.frame()
# 请先安装imputeLCMD packagerequire(imputeLCMD)# SVDSVD_wrapper <- function(data, K = 5) {  data_sc_res <- scale_recover(data, method = 'scale')  data_sc <- data_sc_res[[1]]  data_sc_param <- data_sc_res[[2]]  result <- data_sc %>% impute.wrapper.SVD(., K = K) %>% scale_recover(., method = 'recover', param_df = data_sc_param) %>% extract2(1)  return(result)
}test_na_SVD_imp_df <- SVD_wrapper(test_na) %>% data.frame()

2.3.2 MNAR

目前对于MNAR的算法开发非常有限,如quantile regression imputation of left-censored data (QRILC) (Lazar et al. 2016), gibbs sampler based left-censored missing value imputation approach (GSimp) (Wei et al. 2017).

# 请先安装imputeLCMD packagerequire(imputeLCMD)# QRILCQRILC_wrapper <- function(data, ...) {  zero_idx <- which(data == 0, arr.ind = T)  data_temp <- datadata_temp[zero_idx] <- NAresult <- data_temp %>% log() %>% impute.QRILC(., ...) %>% extract2(1) %>% exp()  result[zero_idx] <- 0return(result)
}test_na_QRILC_imp_df <- QRILC_wrapper(test_na)
# GSimpsource('GSimp.R')sim_GS_wrapper <- function(data) {  result <- data %>% multi_impute(., iters_each=50, iters_all=10, initial='qrilc', lo=-Inf, hi='min', n_cores=1, imp_model='glmnet_pred')  return(result$data_imp)
}test_na_GSimp_imp_df <- sim_GS_wrapper(test_na)
## Iteration 1 start...end!
## Iteration 2 start...end!
## Iteration 3 start...end!
## Iteration 4 start...end!
## Iteration 5 start...end!
## Iteration 6 start...end!
## Iteration 7 start...end!
## Iteration 8 start...end!
## Iteration 9 start...end!
## Iteration 10 start...end!

Core functions for GSimp are available at: GitHub(地址:https://github.com/WandeRum/GSimp)

3. 不同补值方法的结果比较

请参考以下两篇文章: Missing Value Imputation Approach for Mass Spectrometry-based Metabolomics Data (Wei et al. 2017), GSimp: A Gibbs sampler based left-censored missing value imputation approach for metabolomics studies (Wei et al. 2017)。结果显示:在代谢组学的数据中,对于MCAR/MAR的缺失,推荐使用missForest进行补值; 对于left-censored MNAR的缺失,推荐使用GSimp进行补值。 注:以上方法还需在其他类型的数据中进行系统性的比较。

4. 缺失值补值可视化软件 – MetImp

我们将以上各种补值方法 (GSimp很快也会添加进去) 做成了一个免费的web-tool: MetImp(地址:https://metabolomics.cc.hawaii.edu/software/MetImp/)

  • Step 1: 上传数据,数据格式请保持和我们网站上example data一致; 即横行为样本,纵列为物质,第一行为物质名称,第一列为样本名称,第二列为组别信息;

  • Step 2: 选择缺失值是属于MCAR/MAR, 还是MNAR;

  • Step 3: 选择物质删除标准,非缺失部分低于总样本量的百分之多少时删除该物质;

  • Step 4: Run;

  • Step 5: 下载补值后的完整数据。

请cite我们的文章:

  • Runmin Wei, Jingye Wang, Mingming Su, Erik Jia, Tianlu Chen, and Yan Ni.

  • "Missing Value Imputation Approach for Mass Spectrometry-based Metabolomics Data." Scientific Reports (under revision).

  • Runmin Wei, Jingye Wang, Erik Jia, Tianlu Chen, Yan Ni, and Wei Jia.

  • “GSimp: A Gibbs sampler based left-censored missing value imputation approach for metabolomics studies.” PLOS Computational Biology (under revision).

5. 参考文献

Bijlsma, Sabina, Ivana Bobeldijk, Elwin R. Verheij, Raymond Ramaker, Sunil Kochhar, Ian A. Macdonald, Ben Van Ommen, and Age K. Smilde. 2006. “Large-scale human metabolomics studies: A strategy for data (pre-) processing and validation.” Analytical Chemistry 78 (2):567–74. https://doi.org/10.1021/ac051495j.

Gelman, Andrew, and Jennifer Hill. 2006. Data analysis using regression and multilevel/hierarchical models.https://doi.org/10.2277/0521867061.

Hastie, Trevor, Robert Tibshirani, and Gavin Sherlock. 1999. “Imputing missing data for gene expression arrays.” Technical Report, Division of Biostatistics, Stanford University, 1–9.

Honaker, James, Gary King, and Matthew Blackwell. 2011. “AMELIA II : A Program for Missing Data.” Journal of Statistical Software 45 (7):1–54. https://doi.org/10.1.1.149.9611.

Lazar, Cosmin, Laurent Gatto, Myriam Ferro, Christophe Bruley, and Thomas Burger. 2016. “Accounting for the Multiple Natures of Missing Values in Label-Free Quantitative Proteomics Data Sets to Compare Imputation Strategies.” Journal of Proteome Research 15 (4):1116–25. https://doi.org/10.1021/acs.jproteome.5b00981.

Little, Roderick J a, and Donald B Rubin. 2002. Statistical Analysis with Missing Data. https://doi.org/10.2307/1533221.

Stacklies, Wolfram, Henning Redestig, Matthias Scholz, Dirk Walther, and Joachim Selbig. 2007. “pcaMethods - A bioconductor package providing PCA methods for incomplete data.” Bioinformatics 23 (9):1164–7.https://doi.org/10.1093/bioinformatics/btm069.

Stekhoven, Daniel J., and Peter Bühlmann. 2012. “Missforest-Non-parametric missing value imputation for mixed-type data.” Bioinformatics 28 (1):112–18. https://doi.org/10.1093/bioinformatics/btr597.

Troyanskaya, O, M Cantor, G Sherlock, P Brown, T Hastie, R Tibshirani, D Botstein, and R B Altman. 2001. “Missing value estimation methods for DNA microarrays.” Bioinformatics (Oxford, England) 17 (6):520–25.https://doi.org/10.1093/bioinformatics/17.6.520.

Runmin Wei, Jingye Wang, Erik Jia, Tianlu Chen, Yan Ni, and Wei Jia. 2017. “GSimp: A Gibbs sampler based left-censored missing value imputation approach for metabolomics studies.” bioRxiv. https://doi.org/10.1101/177410.

Runmin Wei, Jingye Wang, Mingming Su, Erik Jia, Tianlu Chen, and Yan Ni. 2017. "Missing Value Imputation Approach for Mass Spectrometry-based Metabolomics Data." bioRxiv. https://doi.org/10.1101/171967.

公众号后台回复关键字即可学习

回复 R               R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门

数据预处理中的缺失值问题相关推荐

  1. R语言dataframe数据列中的缺失值NA的个数统计实战:特定数据列的NA值统计、所有特征的NA值统计

    R语言dataframe数据列中的缺失值NA的个数统计实战:特定数据列的NA值统计.所有特征的NA值统计 目录

  2. python 数据框缺失值_Python:处理数据框中的缺失值

    python 数据框缺失值 介绍 (Introduction) In the last article we went through on how to find the missing value ...

  3. Python:在Pandas数据框中查找缺失值

    How to find Missing values in a data frame using Python/Pandas 如何使用Python / Pandas查找数据框中的缺失值 介绍: (In ...

  4. ML之FE:特征工程/数据预处理中的数据异常值的概述、检测方法、处理方法技巧总结之详细攻略

    ML之FE:特征工程/数据预处理中的数据异常值的概述.检测方法.处理方法技巧总结之详细攻略 目录 异常值 异常值的概述(简介/原因/影响) 异常值的检测方法

  5. R语言使用Hmisc包的impute函数填充dataframe数据中特定数据列中的缺失值、将空值null用上一行和下一行值的平均值填充

    R语言使用Hmisc包的impute函数填充dataframe数据中特定数据列中的缺失值.将空值null用上一行和下一行值的平均值填充 目录

  6. 机器学习100天(三):003 数据预处理之处理缺失值

    机器学习 100 天,今天讲的是:数据预处理-处理缺失值. 在上一节,我们导入了数据集,得到特征 X 和标签 y. 我们打开 X,发现 index5 样本的'年龄'和 index3 样本的'薪资'数值 ...

  7. 数据预处理——4种缺失值处理方法

    1.删除含有缺失值的个案 主要有简单删除法和权重法.简单删除法是对缺失值进行处理的最原始方法.它将存在缺失值的个案删除.如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的. ...

  8. pandas 判断数据表中的缺失值

    pandas用any可以判断数据表中是否有缺失值. 使用 df_new.isnull().any() df_new.isnull().any() 这样就可以显示是否有那个变量含有确实值了.

  9. 数据预处理(处理缺失值、属性编码、数据标准化正则化、特征选择、主成分分析)

    数据存在的问题 在实际中,我们拿到的数据通常是脏数据,数据可能存在以下几种主要问题: 1.数据缺失 (Incomplete) :属性值为空的情况 2. 数据噪声 (Noisy):数据值不合常理的情况 ...

  10. 数据预处理中的归一化与反归一化

    前言 在使用深度学习框架构建训练数据时,通常需要数据归一化(Normalize),以利于网络的训练.而在训练过程可视化中,通常需要反归一化.以PyTorch框架而言,提供了torchvision.tr ...

最新文章

  1. 简略解释memset函数的用法
  2. 二、进程的状态与转换
  3. java线程 同步与异步 线程池
  4. JDK, JRE 和JVM的区别
  5. 关于tomcat出现闪退问题
  6. C++笔记——析构函数
  7. 常见问题_智能切膜机常见问题
  8. python-time时间模块
  9. html 百分比饼状图,highcharts饼状图百分比显示的数据和写的不同
  10. Rust入门教程(三):Package、Crate 和 Module
  11. 港澳台身份证校验规则和计算方法
  12. 国行版苹果 ios 按键精灵无法联网问题处理
  13. 通过商品ID和区域ID及cookie插件获取商品快递费用接口,1688快递物流费用接口,1688商品物流费用API接口获取方案
  14. git 手动master_git 如何撤销一次remote的master commit?
  15. Foxmail 7.2数据迁移,导入旧数据
  16. NumPy的数组对象:ndarray
  17. Ubuntu安装Matlab其Simulink没有菜单栏的解决方案(转载可用)
  18. 作为一名技术人员,我们应该如何践行呢?
  19. 银行提供了整数整存整取定期储蓄业务,其存期分为一年,两年,三年,五年,到期凭存单支取本息,编写一个程序,输入存入的本金数目,计算假设存一年,两年,三年,五年,到期取款时,银行应支付多少本息分别是多少
  20. java 中wav文件格式,Wav音频文件格式详解

热门文章

  1. 从把三千行代码重构成15行代码谈起—好牛X的哟!!
  2. 90后IT男被准丈母娘拒绝:家境不重要,重要的是…戳中痛处
  3. 大神教你轻松驾驭Tomcat
  4. *第六周*数据结构实践项目二【建设链栈算法库】
  5. mysql基础之帮助信息
  6. Python3+Selenium3自动化测试-(准备)
  7. JavaMaven【三、常用指令】
  8. STM32启动模式及API(转)
  9. 实现Qt日志功能并输出到文件(qDebug\qWarning\ qCritical\qFatal)
  10. 文件间调用变量(extern,include)[转]