缺失值处理包括两个步骤,即缺失数据的识别和缺失值处理。在R语言总缺失值以NA表示,可以使用函数is.na()判断缺失值是否存在,函数complete.cases()可识别样本数据是否完整从而判断缺失情况。缺失值处理常用方法有删除法、替换法、插补法。
(1)删除法:可分为删除观测样本与删除变量。
删除观测样本通过na.omit()函数移除所有含有缺失数据的行,属于以减少样本量来换取信息完整性的方法,适用于缺失值所含比例较小的情况。
删除变量通过data[,-p]函数移除含有缺失数据的列,适用于变量有较大缺失且对研究目标影响不大的情况。
缺点:会存在信息浪费的问题,且数据结构会发生变动,以致最后得到有偏的统计结构
(2)替换法:变量按属性可分为数值型和非数值型
缺失数据为数值型的一般用该变量在其他对象的取值均值来替换变量的缺失值
缺失数据为非数值型的一般用其他全部有效观测值的中位数或者众数来替换
缺点:会存在信息浪费的问题,且数据结构会发生变动,以致最后得到有偏的统计结构
(3)插补法:常用的插补方法有回归插补,多重插补
回归插补:利用回归模型,将需要插补的变量作为因变量,其他相关变量作为自变量,通过回归函数lm()预测出因变量的值来对缺失变量进行补缺
多重插补:是从一个包含缺失值的数据集中生成一组完整的数据,如此多次,从而产生缺失值的一组随机样本,R中的mice()函数可以用来进行多重插补。
# 设置工作空间
setwd("F:/数据及程序/chapter4/示例程序/data")
# 读取销售数据文件,提取标题行
inputfile <- read.csv('1.csv', header = TRUE)
# 变换变量名
inputfile <- data.frame(sales = inputfile$'销量', date = inputfile$'日期')
# 数据截取
inputfile <- inputfile[5:16, ]
# 缺失数据的识别
is.na(inputfile) # 判断是否存在缺失
n <- sum(is.na(inputfile)) # 输出缺失值个数
# 异常值识别
par(mfrow = c(1, 2)) # 将绘图窗口划为1行两列,同时显示两图
dotchart(inputfile$sales) # 绘制单变量散点图
boxplot(inputfile$sales, horizontal = TRUE) # 绘制水平箱形图
# 异常数据处理
inputfile$sales[5] = NA # 将异常值处理成缺失值
fix(inputfile) # 表格形式呈现数据
# 缺失值的处理
inputfile$date <- as.numeric(inputfile$date) # 将日期转换成数值型变量
sub <- which(is.na(inputfile$sales)) # 识别缺失值所在行数
inputfile1 <- inputfile[-sub, ] # 将数据集分成完整数据和缺失数据两部分
inputfile2 <- inputfile[sub, ]
# 行删除法处理缺失,结果转存
result1 <- inputfile1
# 均值替换法处理缺失,结果转存
avg_sales <- mean(inputfile1$sales) # 求变量未缺失部分的均值
inputfile2$sales <- rep(avg_sales,n) # 用均值替换缺失
result2 <- rbind(inputfile1, inputfile2) # 并入完成插补的数据
# 回归插补法处理缺失,结果转存
model <- lm(sales ~ date, data = inputfile1) # 回归模型拟合
inputfile2$sales <- predict(model, inputfile2) # 模型预测
result3 <- rbind(inputfile1, inputfile2)
# 多重插补法处理缺失,结果转存
library(lattice) # 调入函数包
library(MASS)
library(nnet)
library(mice) # 前三个包是mice的基础
imp <- mice(inputfile, m = 4) # 4重插补,即生成4个无缺失数据集
fit <- with(imp,lm(sales ~ date, data = inputfile)) # 选择插补模型
pooled <- pool(fit)
summary(pooled)
result4 <- complete(imp, action = 3) # 选择第三个插补数据集作为结果