数据预处理--缺失值判断和处理(删除法、插补法(均值插补、热平台插补))

 数据预处理

1 数据集加载

这里使用mice软件包下的nhanes2数据集进行演示,这是一个含有缺失值的小规模数据集。

1
2
3
4
5
6
7
8
9
10
11
12
13
library(lattice)
 
library(MASS)
 
library(nnet)
 
library(mice)
 
data("nhanes2")
 
dim(nhanes2)   #获取数据集的维度 25*4
 
summary(nhanes2)

 

结果分析:agehyp是定性变量,分别为3类和2类,bmichl是定量变量;age没有缺失值,bmi9个缺失值,hyp8个缺失值,chi10个缺失值。

对数据集nhanes2做一个初步了解:

age:年龄段,取值为123,分别代表20-3940-5960-99这三个年龄段

bmi:身体质量指数,单位为kg/m2

hyp:是否患高血压,1代表否,2代表是

chl:血清胆固醇总量,单位为mg/dL

2 数据清理

对于探索性数据,我们通常使用统计图来探索数据规律,经常用直方图hist,点图dotchart,箱线图boxplotQ-Qqqnorm(可以加上线qqline())

2.1 缺失值处理

在数据预处理中,可以使用函数is.an()判断缺失值:

1
sum(is.na(nhanes2))

 

还有一个常用的函数complete.cases,用来判断某一观测样本是否完整:

1
sum(complete.cases(nhanes2))

函数的结果显示:数据中共有27个缺失值,数据框中共有13条完整观测值。

存在缺失值数据的情况下,需要进一步对数据缺失状况进行观测,判断缺失数据是否随机,可以利用mice包中的md.pattern函数判断:

1
md.pattern(nhanes2)

 

 

 

洁后果分析:1表示没有缺失数据,0表示存在缺失数据,第1行第1列的13表示有13个样本是完整的,第1列最后一个7表示有7个样本少了hyp,bmi,chl三个变量,最后一行表示各个变量缺失的样本数合计。

对缺失数据最简单处理的方法是直接删除含有缺失值的样本,这样做到的前提是缺失数据的比例较少,且缺失数据是随机出现的,这样删除之后对分析结果影响不大。

也可以用变量均值或者中位数来代替缺失值的方式,这样做的缺点在于当缺失数据不是随机出现时会产生偏误。

多重插补法通过变量间的关系对数据进行预测,利用蒙特卡洛方法生成多个完整的数据集,再对这些数据集分别进行分析。

R中可以调用mice包中的mice函数实现,函数的基本形式是:

1
mice(data,m=5,...)

其中,data代表一个有缺失值的数据框或者矩阵,缺失值用NA表示;m表示多插补重数,即生成m个完整数据集,默认为5

举个例子,若要构建以chl为因变量,age,hyp,bmi为自变量的线性回归模型,因为数据集中存在缺失值,不能直接用来构建模型,因此可以通过如下方式构建模型:

1
imp<-mice(nhanes2,m=4)   #生成4组完整的数据库并赋给imp

 

1
2
3
4
5
fit<-with(imp,lm(chl~age+hyp+bmi))   #生成线性回归模型
 
pooled<-pool(fit)    #对建立的4个模型汇总
 
summary(pooled)

 

 

 

以上是对缺失值的判断,下面是缺失值的处理方法:

1.删除法

在不影响数据结构的情况下,根据数据处理的不同角度,可以将删除法分为以下4种:

1)删除观测样本

2)删除某变量

3)使用原始完整数据分析

4)改变权重:通过对完整数据按照不同的权重进行加权,可以降低删除缺失数据带来的偏差。

2. 插补法

均值插补、回归插补、二阶插补、热平台、冷平台、抽样填补等单一变量插补,多变量插补是单变量插补的推广。

均值插补:是通过计算缺失值所在变量所有非缺失观测值的据那只,使用均值来代替缺失值的插补方法(类似的也可以使用中位数、四分位数进行插补)。

1
2
3
4
5
6
7
8
9
sub<-which(is.na(nhanes2[,4])==T)   #返回数据集第4列为NA的行
 
dataTR<-nhanes2[-sub,]   #将4列不为NA的数存入数据集dataTR中
 
dataTE<-nhanes2[sub,]    #将第4列为NA的数存入数据集dataTE中
 
dataTE[,4]<-mean(dataTR[,4])   #用非缺失值的均值代替缺失值
 
dataTE

 

结果分析:均值插补的结果是191.4

随机插补和均值插补没有利用到相关变量信息,因此会存在一定的误差,而回归模型将需要插补的变量作为因变量,其他相关变量作为自变量,用过建立回归模型预测出因变量的值对缺失变量进行插补。

1
2
3
4
5
6
7
sub<-which(is.na(nhanes2[,4])==T)
 
dataTR<-nhanes2[-sub,]
 
dataTE<-nhanes2[sub,]
 
dataTE

 

1
2
3
4
5
lm<-lm(chl~age,data=dataTR)  #构建回归模型
 
nhanes2[sub,4]=round(predict(lm,dataTE))   #利用dataTE中数据按照模型lm对数据集中chl中的缺失数据进行预测
 
head(nhanes2)  #显示缺失值处理后的结果

 

热平台插补:是指在非缺失数据集中找到一个于缺失值所在样本相似的样本,利用其中的观测值对缺失值进行插补。

1
2
3
4
5
accept<-nhanes2[which(apply(is.na(nhanes2),1,sum)!=0),]  #存在缺失值的样本
 
donate<-nhanes2[which(apply(is.na(nhanes2),1,sum)==0),]   #无缺失值的样本
 
accept[1,]

 

1
donate[1,]

 

对于存在缺失值的accept中的每个样本呢,热平台插补就是在donate中找到于该样本相似的样本,用相似样本的对应值代替该样本的缺失值。当变量数量很多时,很难找到于需要插补相似的样本,此时可以按照某些变量将数据分层,在层中对缺失值使用均值插补,即采用冷平台插补方法。

posted @   zhang-X  阅读(7199)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示