数据插值方法在数据处理和分析中扮演着至关重要的角色。它们可以帮助我们处理缺失数据,使得数据分析更加准确和可靠。数据插值方法被广泛应用于金融、医疗、社会科学等领域,以及工程和环境监测等实际应用中。
在本文中,我们将探讨三种常用的数据插值方法:MICE(多重插补技术)、MissForest(随机森林插补技术)等。通过对这两种方法的比较和分析,我们旨在帮助读者更好地理解它们的优缺点,以便在实际应用中做出明智的选择。
数据插值方法的选择直接影响到数据分析结果的准确性和可靠性,因此对不同插值方法的深入了解具有重要意义。通过本文的阐述,我们可以更好地理解MICE和MissForest的适用范围和局限性,为实际问题的数据处理提供更科学、更可靠的参考。
总之,本文将对MICE和MissForest等三种常用的数据插值方法进行深入剖析,旨在为读者提供在实际应用中正确选择合适插值方法的依据。通过对它们的优缺点进行全面的比较,可以更好地指导数据分析工作,并为相关研究提供有益的借鉴。
任意常数插补是一种简单的数据插补方法,它用一个任意选择的常数(如0)或其他已知的数据来填补缺失值。
「优点」:任意常数插补的优点在于它非常简单和直接。它不需要对数据进行复杂的计算或推断,只需要将缺失值替换为指定的常数即可。此外,该方法对于某些类型的数据(如分类变量)可能是合理且有效的选择。
「缺点」:任意常数插补的缺点在于它忽略了真实数据的分布特性和相关性。由于使用相同的常数来填补所有的缺失值,可能会导致插补后的数据集失去原本的变异性和相关性。这可能会影响后续数据分析的准确性和可靠性。
均数插补是一种常见的数据插补方法,它用变量的均值来填补缺失值。对于每个缺失值,均数插补将变量的所有观察值的均值作为插补值。
「优点」:均数插补的优点在于它简单易行,计算方便。均数作为插补值可以保持数据的整体平均水平,并且不会引入额外的变异性。此外,均数插补可以在保持样本总体均值不变的情况下填补缺失值,从而减少对整体结构的影响。
「缺点」:均数插补的缺点在于它忽略了其他变量之间的相关性。如果一个变量的缺失值与其他变量有关联,使用均值插补可能会导致结果的偏差。此外,均数插补也无法解决缺失模式的问题,可能会引入偏差。
中位数插补是一种常见的数据插补方法,它用变量的中位数来填补缺失值。对于每个缺失值,中位数插补将变量的所有观察值的中位数作为插补值。
「优点」:中位数插补的优点在于它对于异常值的鲁棒性较好。由于使用中位数作为插补值,它不受异常值的影响,可以更好地保持数据的整体趋势和分布形态。
「缺点」:中位数插补的缺点在于它同样忽略了其他变量之间的相关性。如果一个变量的缺失值与其他变量有关联,使用中位数插补可能会引入偏差。此外,中位数插补也无法解决缺失模式的问题,可能会导致插补结果的不准确性。
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(Multiple Imputation by Chained Equations)是一种基于贝叶斯思想的多重插补技术,用于处理缺失数据。它的基本原理是通过多次迭代,根据已有数据的信息来估计缺失值,并且不断更新估计模型。具体地,MICE将变量分为两类:需要插值的目标变量和其他辅助变量。然后,对于每个目标变量,MICE利用其他辅助变量的信息来进行插值,并不断迭代,直到收敛为止。
PMM是一种基于模型的数据插补方法,它通过建立预测模型来预测缺失值,并根据预测结果从已有的观察值中选择一个最接近的均值进行匹配。
「优点」:PMM的优点在于它能够考虑其他变量之间的相关性。通过建立预测模型,PMM可以利用其他变量的信息来对缺失值进行预测,从而更准确地插补缺失值。此外,PMM还可以保持数据的分布特性和变异性,使得插补后的数据更接近真实情况。
「缺点」:PMM的缺点在于它对于模型选择和建立的要求较高。为了进行预测,需要选择合适的模型,并且需要考虑模型的拟合度和预测精度。如果选择的模型不准确或者样本量较小,可能会导致插补结果的不可靠性。另外,PMM对于缺失模式也比较敏感,如果缺失模式与其他变量相关,则插补结果可能会引入偏差。
CART是一种基于决策树的数据插补方法,它通过构建分类或回归树模型来预测缺失值,并将预测结果作为插补值。
「优点」:CART的优点在于它对于非线性关系和交互效应的建模能力较强。决策树可以自动选择重要的变量,并且可以处理离散和连续型变量。此外,CART还可以提供可解释的结果,可以清晰地展示出变量之间的关系和重要性。
「缺点」:CART的缺点在于它容易产生过拟合问题。决策树往往倾向于过度拟合训练数据,导致在新数据上的预测性能下降。为了避免过拟合,需要采用剪枝等技术进行调整。此外,CART对于缺失模式也比较敏感,如果缺失模式与其他变量相关,则插补结果可能会引入偏差。
Lasso.norm是一种基于稀疏线性回归的数据插补方法,它通过最小化目标函数来选择具有稀疏性的线性模型,并利用线性模型进行缺失值的插补。
「优点」:Lasso.norm的优点在于它能够进行变量选择和建模,同时具有稀疏性。Lasso.norm可以自动选择重要的变量,并将不重要的变量的系数置为零,从而简化了模型并提高了解释性。此外,Lasso.norm还可以处理高维数据和多重共线性问题。
「缺点」:Lasso.norm的缺点在于它对于模型选择和参数调整的要求较高。Lasso.norm需要选择适当的正则化参数,并考虑模型的拟合度和预测精度。如果选择的参数不合适或者样本量较小,可能会导致插补结果的不可靠性。另外,Lasso.norm对于缺失模式也比较敏感,如果缺失模式与其他变量相关,则插补结果可能会引入偏差。
MICE的优点在于它能够适用于多变量数据,并且可以保留数据间的相关性。相比于其他插值方法,MICE可以提供更准确的结果,并且能够使用更多的信息来插值。此外,MICE还可以处理非正态分布的数据,可以用于分类和回归问题。
MICE的主要缺点在于对于高维数据的计算复杂性。由于需要对每个变量进行插值,因此随着变量数增加,计算量也会大大增加。此外,MICE对于缺失模式的假设比较严格,如果缺失数据的模式与假设不符,可能会导致插值结果不准确。
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是一种基于随机森林的数据插补方法,它通过利用多棵决策树来预测缺失值,并不断迭代更新预测结果,直到收敛为止。
其工作流程如下:
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以及其他常用数据插值方法的优缺」
不同的数据插值方法具有不同的优点和局限性,根据具体应用场景选择合适的方法可以更好地保证插值结果的准确性和可靠性。例如,在处理非线性关系较强的数据集时,可以优先考虑使用基于决策树或随机森林的方法;而在处理缺失率较高的大规模数据集时,则需要考虑方法的计算效率和可扩展性等因素。
*「未经许可,不得以任何方式复制或抄袭本篇文章之部分或全部内容。版权所有,侵权必究。」