从mice到missForest:常用数据插值方法优缺点

2023-12-25 00:45

本文主要是介绍从mice到missForest:常用数据插值方法优缺点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、引言

数据插值方法在数据处理和分析中扮演着至关重要的角色。它们可以帮助我们处理缺失数据,使得数据分析更加准确和可靠。数据插值方法被广泛应用于金融、医疗、社会科学等领域,以及工程和环境监测等实际应用中。

在本文中,我们将探讨三种常用的数据插值方法:MICE(多重插补技术)、MissForest(随机森林插补技术)等。通过对这两种方法的比较和分析,我们旨在帮助读者更好地理解它们的优缺点,以便在实际应用中做出明智的选择。

数据插值方法的选择直接影响到数据分析结果的准确性和可靠性,因此对不同插值方法的深入了解具有重要意义。通过本文的阐述,我们可以更好地理解MICE和MissForest的适用范围和局限性,为实际问题的数据处理提供更科学、更可靠的参考。

总之,本文将对MICE和MissForest等三种常用的数据插值方法进行深入剖析,旨在为读者提供在实际应用中正确选择合适插值方法的依据。通过对它们的优缺点进行全面的比较,可以更好地指导数据分析工作,并为相关研究提供有益的借鉴。

二、R内置的简单值插补

2.1 任意常数插补

任意常数插补是一种简单的数据插补方法,它用一个任意选择的常数(如0)或其他已知的数据来填补缺失值。

「优点」:任意常数插补的优点在于它非常简单和直接。它不需要对数据进行复杂的计算或推断,只需要将缺失值替换为指定的常数即可。此外,该方法对于某些类型的数据(如分类变量)可能是合理且有效的选择。

「缺点」:任意常数插补的缺点在于它忽略了真实数据的分布特性和相关性。由于使用相同的常数来填补所有的缺失值,可能会导致插补后的数据集失去原本的变异性和相关性。这可能会影响后续数据分析的准确性和可靠性。

2.2 均数插补

均数插补是一种常见的数据插补方法,它用变量的均值来填补缺失值。对于每个缺失值,均数插补将变量的所有观察值的均值作为插补值。

「优点」:均数插补的优点在于它简单易行,计算方便。均数作为插补值可以保持数据的整体平均水平,并且不会引入额外的变异性。此外,均数插补可以在保持样本总体均值不变的情况下填补缺失值,从而减少对整体结构的影响。

「缺点」:均数插补的缺点在于它忽略了其他变量之间的相关性。如果一个变量的缺失值与其他变量有关联,使用均值插补可能会导致结果的偏差。此外,均数插补也无法解决缺失模式的问题,可能会引入偏差。

2.3 中位数插补

中位数插补是一种常见的数据插补方法,它用变量的中位数来填补缺失值。对于每个缺失值,中位数插补将变量的所有观察值的中位数作为插补值。

「优点」:中位数插补的优点在于它对于异常值的鲁棒性较好。由于使用中位数作为插补值,它不受异常值的影响,可以更好地保持数据的整体趋势和分布形态。

「缺点」:中位数插补的缺点在于它同样忽略了其他变量之间的相关性。如果一个变量的缺失值与其他变量有关联,使用中位数插补可能会引入偏差。此外,中位数插补也无法解决缺失模式的问题,可能会导致插补结果的不准确性。

2.4 示例展示

  • 「数据集简介」
library(ggplot2)
library(titanic)
library(dplyr)
library(cowplot)

summary(titanic_train)

结果展示:

  PassengerId       Survived          Pclass          Name          
 Min.   :  1.0   Min.   :0.0000   Min.   :1.000   Length:891        
 1st Qu.:223.5   1st Qu.:0.0000   1st Qu.:2.000   Class :character  
 Median :446.0   Median :0.0000   Median :3.000   Mode  :character  
 Mean   :446.0   Mean   :0.3838   Mean   :2.309                     
 3rd Qu.:668.5   3rd Qu.:1.0000   3rd Qu.:3.000                     
 Max.   :891.0   Max.   :1.0000   Max.   :3.000                     
                                                                    
     Sex                 Age            SibSp           Parch       
 Length:891         Min.   : 0.42   Min.   :0.000   Min.   :0.0000  
 Class :character   1st Qu.:20.12   1st Qu.:0.000   1st Qu.:0.0000  
 Mode  :character   Median :28.00   Median :0.000   Median :0.0000  
                    Mean   :29.70   Mean   :0.523   Mean   :0.3816  
                    3rd Qu.:38.00   3rd Qu.:1.000   3rd Qu.:0.0000  
                    Max.   :80.00   Max.   :8.000   Max.   :6.0000  
                    NA's   :177                                     
    Ticket               Fare           Cabin             Embarked        
 Length:891         Min.   :  0.00   Length:891         Length:891        
 Class :character   1st Qu.:  7.91   Class :character   Class :character  
 Mode  :character   Median : 14.45   Mode  :character   Mode  :character  
                    Mean   : 32.20                                        
                    3rd Qu.: 31.00                                        
                    Max.   :512.33                       

从上面可以看出Age变量存在很多的缺失值,查看数据分布。

ggplot(titanic_train, aes(Age)) +
  geom_histogram(color = "#000000", fill = "#2E9FDF") +
  ggtitle("Variable Age distribution") +
  theme_classic() +
  theme(plot.title = element_text(size = 18))
  • 「数据插补」
value_completed <- data.frame(
  original = titanic_train$Age,
  completed_zero = replace(titanic_train$Age, is.na(titanic_train$Age), 0),
  completed_mean = replace(titanic_train$Age, is.na(titanic_train$Age), mean(titanic_train$Age, na.rm = TRUE)),
  completed_median = replace(titanic_train$Age, is.na(titanic_train$Age), median(titanic_train$Age, na.rm = TRUE))
)
head(value_completed)

结果展示:

> head(value_completed)
  original completed_zero completed_mean completed_median
1       22             22       22.00000               22
2       38             38       38.00000               38
3       26             26       26.00000               26
4       35             35       35.00000               35
5       35             35       35.00000               35
6       NA              0       29.69912               28

接着我们通过图例来展示数据的分布是否有变化。

h1 <- ggplot(value_completed, aes(x = original)) +
   geom_histogram(fill = "#ad1538", color = "#000000", position = "identity") +
   ggtitle("Original distribution") +
   theme_classic()
 h2 <- ggplot(value_completed, aes(x = completed_zero)) +
   geom_histogram(fill = "#15ad4f", color = "#000000", position = "identity") +
   ggtitle("Zero-imputed distribution") +
   theme_classic()
 h3 <- ggplot(value_completed, aes(x = completed_mean)) +
  geom_histogram(fill = "#1543ad", color = "#000000", position = "identity") +
  ggtitle("Mean-imputed distribution") +
  theme_classic()
h4 <- ggplot(value_completed, aes(x = completed_median)) +
  geom_histogram(fill = "#ad8415", color = "#000000", position = "identity") +
  ggtitle("Median-imputed distribution") +
  theme_classic()

plot_grid(h1, h2, h3, h4, nrow = 2, ncol = 2)

从上图可以看出三种填补方法对原数据分布产生严重的影响,可能会导致插补后的数据集失去原本的变异性和相关性。这可能会影响后续数据分析的准确性和可靠性。

三、MICE(多重插补技术)

3.1 MICE的基本原理和工作流程

MICE(Multiple Imputation by Chained Equations)是一种基于贝叶斯思想的多重插补技术,用于处理缺失数据。它的基本原理是通过多次迭代,根据已有数据的信息来估计缺失值,并且不断更新估计模型。具体地,MICE将变量分为两类:需要插值的目标变量和其他辅助变量。然后,对于每个目标变量,MICE利用其他辅助变量的信息来进行插值,并不断迭代,直到收敛为止。

  • 「pmm:预测均值匹配」

PMM是一种基于模型的数据插补方法,它通过建立预测模型来预测缺失值,并根据预测结果从已有的观察值中选择一个最接近的均值进行匹配。

「优点」:PMM的优点在于它能够考虑其他变量之间的相关性。通过建立预测模型,PMM可以利用其他变量的信息来对缺失值进行预测,从而更准确地插补缺失值。此外,PMM还可以保持数据的分布特性和变异性,使得插补后的数据更接近真实情况。

「缺点」:PMM的缺点在于它对于模型选择和建立的要求较高。为了进行预测,需要选择合适的模型,并且需要考虑模型的拟合度和预测精度。如果选择的模型不准确或者样本量较小,可能会导致插补结果的不可靠性。另外,PMM对于缺失模式也比较敏感,如果缺失模式与其他变量相关,则插补结果可能会引入偏差。

  • 「cart:分类和回归树」

CART是一种基于决策树的数据插补方法,它通过构建分类或回归树模型来预测缺失值,并将预测结果作为插补值。

「优点」:CART的优点在于它对于非线性关系和交互效应的建模能力较强。决策树可以自动选择重要的变量,并且可以处理离散和连续型变量。此外,CART还可以提供可解释的结果,可以清晰地展示出变量之间的关系和重要性。

「缺点」:CART的缺点在于它容易产生过拟合问题。决策树往往倾向于过度拟合训练数据,导致在新数据上的预测性能下降。为了避免过拟合,需要采用剪枝等技术进行调整。此外,CART对于缺失模式也比较敏感,如果缺失模式与其他变量相关,则插补结果可能会引入偏差。

  • 「laso.norm:Lasso线性回归」

Lasso.norm是一种基于稀疏线性回归的数据插补方法,它通过最小化目标函数来选择具有稀疏性的线性模型,并利用线性模型进行缺失值的插补。

「优点」:Lasso.norm的优点在于它能够进行变量选择和建模,同时具有稀疏性。Lasso.norm可以自动选择重要的变量,并将不重要的变量的系数置为零,从而简化了模型并提高了解释性。此外,Lasso.norm还可以处理高维数据和多重共线性问题。

「缺点」:Lasso.norm的缺点在于它对于模型选择和参数调整的要求较高。Lasso.norm需要选择适当的正则化参数,并考虑模型的拟合度和预测精度。如果选择的参数不合适或者样本量较小,可能会导致插补结果的不可靠性。另外,Lasso.norm对于缺失模式也比较敏感,如果缺失模式与其他变量相关,则插补结果可能会引入偏差。

3.2 MICE的优点

MICE的优点在于它能够适用于多变量数据,并且可以保留数据间的相关性。相比于其他插值方法,MICE可以提供更准确的结果,并且能够使用更多的信息来插值。此外,MICE还可以处理非正态分布的数据,可以用于分类和回归问题。

3.3 MICE的缺点

MICE的主要缺点在于对于高维数据的计算复杂性。由于需要对每个变量进行插值,因此随着变量数增加,计算量也会大大增加。此外,MICE对于缺失模式的假设比较严格,如果缺失数据的模式与假设不符,可能会导致插值结果不准确。

3.4 示例展示

library(mice)
titanic_num <- titanic_train %>%
  select(Survived, Pclass, SibSp, Parch, Age, Fare)
#缺失数据可视化
md.pattern(titanic_num) 
mice_completed <- data.frame(
  original = titanic_train$Age,
  completed_pmm = complete(mice(titanic_num, method = "pmm"))$Age,
  completed_cart = complete(mice(titanic_num, method = "cart"))$Age,
  completed_lasso = complete(mice(titanic_num, method = "lasso.norm"))$Age
)
head(mice_completed)

h1 <- ggplot(mice_completed, aes(x = original)) +
   geom_histogram(fill = "#ad1538", color = "#000000", position = "identity") +
   ggtitle("Original distribution") +
   theme_classic()
h2 <- ggplot(mice_completed, aes(x = completed_pmm)) +
   geom_histogram(fill = "#15ad4f", color = "#000000", position = "identity") +
   ggtitle("pmm-imputed distribution") +
   theme_classic()
h3 <- ggplot(mice_completed, aes(x = completed_cart)) +
   geom_histogram(fill = "#1543ad", color = "#000000", position = "identity") +
   ggtitle("cart-imputed distribution") +
   theme_classic()
h4 <- ggplot(mice_completed, aes(x = completed_lasso)) +
   geom_histogram(fill = "#ad8415", color = "#000000", position = "identity") +
   ggtitle("lasso-imputed distribution") +
   theme_classic()
plot_grid(h1, h2, h3, h4, nrow = 2, ncol = 2)

结果展示:

> head(mice_completed)
  original completed_pmm completed_cart completed_lasso
1       22            22             22        22.00000
2       38            38             38        38.00000
3       26            26             26        26.00000
4       35            35             35        35.00000
5       35            35             35        35.00000
6       NA            28             24        37.65023

和内置插补方法相比,mice插补后的数据更接近原始分布。优点需要注意的是,laso.norm的插补方法存在小于0的情况,和现实情况冲突,因此如果您选择这种插补技术,则需要取其绝对值。

四、MissForest(随机森林插补)

4.1 MissForest基本原理和工作流程

MissForest是一种基于随机森林的数据插补方法,它通过利用多棵决策树来预测缺失值,并不断迭代更新预测结果,直到收敛为止。

其工作流程如下:

  1. 对于含有缺失值的数据集,首先对每个含有缺失值的变量,将缺失值视为响应变量,其他完整的变量视为特征变量,构建随机森林模型。
  2. 利用已有的非缺失值作为训练集,预测缺失值。
  3. 将预测得到的值作为缺失值的估计,并更新数据集。
  4. 不断重复步骤2和步骤3,直到达到收敛标准或者预设的迭代次数。

4.2 MissForest的优点

  1. 非线性关系适应性:MissForest基于随机森林的模型能够捕捉非线性关系,对于非线性关系的数据具有较好的适应性。
  2. 对异常值的鲁棒性:由于随机森林模型对异常值具有一定的鲁棒性,MissForest在处理含有异常值的数据时表现良好,不易受到异常值的影响。

4.3 MissForest的缺点

  1. 计算时间较长:对于较大的数据集,MissForest需要构建多棵决策树并进行迭代更新,因此在计算时间上可能会比较耗时。
  2. 对缺失模式的敏感性:MissForest对于缺失模式较为敏感,如果缺失模式与其他变量相关,则可能会导致插补结果的偏差,需要谨慎处理数据中的缺失模式。

4.4 示例展示

library(missForest)
missForest_completed <- data.frame(
  original = titanic_num$Age,
  completed_missForest = missForest(titanic_num)$ximp$Age
)
head(missForest_completed)

h1 <- ggplot(missForest_completed, aes(x = original)) +
   geom_histogram(fill = "#ad1538", color = "#000000", position = "identity") +
   ggtitle("Original distribution") +
   theme_classic()
h2 <- ggplot(missForest_completed, aes(x = completed_missForest)) +
   geom_histogram(fill = "#15ad4f", color = "#000000", position = "identity") +
   ggtitle("missForest-imputed distribution") +
   theme_classic()

plot_grid(h1, h2, nrow = 1, ncol = 2)

结果展示:

> head(missForest_completed)
  original completed_missForest
1       22             22.00000
2       38             38.00000
3       26             26.00000
4       35             35.00000
5       35             35.00000
6       NA             27.72037

MissForest 插补后与原来的数据分布还是优点差距,大部分值都在 20-40这个区间,可能不是数据集插补最好的插补技术。

五、总结

「MICE、MissForest以及其他常用数据插值方法的优缺」

  1. MICE:具有灵活性,能够根据数据集的特点进行模型选择和参数调整,同时对于缺失模式的敏感性较低。但在处理非线性关系和大规模数据集时表现一般。
  2. MissForest:具有对非线性关系的适应性和对异常值的鲁棒性等优点,但在处理较大数据集时可能会面临计算时间较长的问题,同时对缺失模式较为敏感。
  3. 其他常用数据插值方法,如KNN、PMM、CART、Lasso.norm等,各有优缺点,需要根据具体应用场景进行选择。

不同的数据插值方法具有不同的优点和局限性,根据具体应用场景选择合适的方法可以更好地保证插值结果的准确性和可靠性。例如,在处理非线性关系较强的数据集时,可以优先考虑使用基于决策树或随机森林的方法;而在处理缺失率较高的大规模数据集时,则需要考虑方法的计算效率和可扩展性等因素。

*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」

这篇关于从mice到missForest:常用数据插值方法优缺点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/533716

相关文章

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP