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

news2024/9/30 17:22:06

一、引言

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

在本文中,我们将探讨三种常用的数据插值方法: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等,各有优缺点,需要根据具体应用场景进行选择。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1333155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制作小米导航实验

一、实验题目 制作一个小米"手机"的标签&#xff0c;当鼠标移动到"手机"上后&#xff0c;显示右边的白色菜单&#xff0c;当鼠标离开"手机"时&#xff0c;菜单消失。 二、实验代码 <!DOCTYPE html> <html lang"en"> <…

高级人工智能之群体智能:蚁群算法

群体智能 鸟群&#xff1a; 鱼群&#xff1a; 1.基本介绍 蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种模拟自然界蚂蚁觅食行为的优化算法。它通常用于解决路径优化问题&#xff0c;如旅行商问题&#xff08;TSP&#xff09;。 蚁群算法的基本步骤…

python分割字符串 split函数

split函数用于字符串的分割&#xff0c;可以完成基于特定字符将字符串分割成若干部分并存于列表中 url "http://localhost:5000/static/images/DICOMDIR 5.26-6.1/10283674_GOUT_5_0_2.png" # 获取最后一个_的前一个数字 parts url.split(/) print(parts)在这里讲…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(二)

远控木马 SET 同时集成了木马生成工具&#xff0c;可以生成木马并调用MSF框架对远程主机进行控制。直接使用MSF生成木马并控制主机的可参考之前另一篇博文&#xff1a;渗透测试-Kali入侵Win7主机。 控制主机 1、运行 SET&#xff0c;选择创建攻击载荷和监听器&#xff1a; 2…

Tomcat日志乱码了怎么处理?

【前言】 tomacat日志有三个地方&#xff0c;分别是Output(控制台)、Tomcat Localhost Log(tomcat本地日志)、Tomcat Catalina Log。 启动日志和大部分报错日志、普通日志都在output打印;有些错误日志&#xff0c;在Tomcat Localhost Log。 三个日志显示区&#xff0c;都可能…

ETN21与CJ2M-CPU33通讯

实验设备:CJ2M-CPU33,CJ1W-EIP21,交叉网线 实验目的:手动建立数据链接表,建立TAG通讯。 实验步骤: IP地址设置:①usb线连上电脑,打开I/O表,将ETN21模块的ip地址与CJ2M-CPU33设置为同一个网段不同节点,节点号跟硬件上的node number一样,下载重启模块,如下: 配置n…

百分百能遇到的接口自动化测试面试题,看完的现在已经在办理入职了...

1. 什么是接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试是指使用自动化工具对接口进行测试&#xff0c;验证接口的正确性、稳定性和性能等方面的指标。 2. 为什么要进行接口自动化测试&#xff1f; 答&#xff1a;接口自动化测试可以提高测试效率&#xff0c;减…

Redis源码精读:准备工作

文章目录 前言拉取源码项目结构源码阅读技巧最后 前言 我是醉墨居士&#xff0c;未来的一段时间里面我准备写一些关于Redis源码的文章&#xff0c;来帮助大家深入浅出Redis&#xff0c;希望大家多多支持&#x1fae0; 拉取源码 git clone https://github.com/redis/redis项目…

Spring5底层原理之BeanFactory与ApplicationContext

目录 BeanFactory与ApplicationContext BeanFactory ApplicationContext 容器实现 BeanFactory实现 ApplicationContext实现 ClassPathXmlApplicationContext的实现 AnnotationConfigApplicationContext的实现 AnnotationConfigServletWebServerApplicationContext的实…

驱动开发-1

一、驱动课程大纲 内核模块字符设备驱动中断 二、ARM裸机代码和驱动有什么区别&#xff1f; 1、共同点&#xff1a; 都能够操作硬件 2、不同点&#xff1a; 1&#xff09;裸机就是用C语言给对应的寄存器里面写值&#xff0c;驱动是按照一定的套路往寄存器里面写值 2&#xff09…

为什么有的开关电源需要加自举电容?

一、什么是自举电路&#xff1f; 1.1 自举的概念 首先&#xff0c;自举电路也叫升压电路&#xff0c;是利用自举升压二极管&#xff0c;自举升压电容等电子元件&#xff0c;使电容放电电压和电源电压叠加&#xff0c;从而使电压升高。有的电路升高的电压能达到数倍电源电压。…

阶段十-物业项目

可能遇到的错误&#xff1a; 解决jdk17javax.xml.bind.DatatypeConverter错误 <!--解决jdk17javax.xml.bind.DatatypeConverter错误--><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>…

git 使用方法自用(勿进)本地开发分支推上线上开发分支

一、//查看状态 1.git status 二、//查看改了哪个文件夹 1.git diff 2.//会出现改了哪个文件夹src/components/partials/Slider.js 三、//查看改了的文件夹里面具体改了啥内容 1.git diff src/components/partials/Slider.js 四、提交所有 1. git add . 五、写备注…

连锁便利店管理系统有什么用

连锁便利店管理系统对于连锁便利店的运营和管理非常有用。以下是一些常见的用途&#xff1a; 1. 库存管理&#xff1a;连锁便利店通常需要管理多个门店的库存&#xff0c;管理系统可以帮助实时掌握各个门店的库存情况&#xff0c;包括商品数量、进货记录、库存调拨等。这样可以…

【Linux系统基础】(2)在Linux上部署MySQL、RabbitMQ、ElasticSearch、Zookeeper、Kafka、NoSQL等各类软件

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c;…

为什么c++的开源库那么少?

为什么c的开源库那么少&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「 C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;…

Skywalking 中 Agent 自动同步配置源码解析

文章目录 前言正文实现架构实现模型OAP 同步 ApolloConfigWatcherRegisterConfigChangeWatcher Agent 侧 前言 本文代码 OAP 基于 v9.7&#xff0c;Java Agent 基于 v9.1&#xff0c;配置中心使用 apollo。 看本文需要配合代码“食用”。 正文 Skywalking 中就使用这种模型…

基于SSM在线协同过滤汽车推荐销售系统

SSM毕设分享 基于SSM在线协同过滤汽车推荐销售系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数&#xff1a;3分 工作…

Springsecurty【2】认证连接MySQL

1.前期准备 基于Spring Initializr创建SpringBoot项目&#xff08;基于SpringBoot 2.7.12版本&#xff09;&#xff0c;实现与MyBatisPlus的项目整合。分别导入&#xff1a;CodeGenerator和MyBatisPlusConfig。 CodeGenerator&#xff1a;用于MybatisPlus代码生成&#xff1b;…

JavaScript原型,原型链 ? 有什么特点?

一、原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个…