如果异常值需要填补,则可把异常值当做缺失值一块填补。
# 设置工作空间
# 把“数据及程序”文件夹拷贝到F盘下,再用setwd设置工作空间
setwd("E:/自己重要的文件/R语言个人分类总结/R语言数据分析与挖掘实战/图书配套数据、代码/chapter4/示例程序")
# 读取销售数据文件,提取标题行
inputfile <- read.csv('./data/catering_sale.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) # 绘制水平箱形图
散点图,从下往上数,第5个值异常。
# 异常数据处理
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)
# 多重插补法处理缺失,结果转存
大致的步骤简介如下:
缺失数据集——MCMC估计插补成几个数据集——每个数据集进行插补建模(glm、lm模型)——将这些模型整合到一起(pool)——评价插补模型优劣(模型系数的t统计量)——输出完整数据集(complete)
步骤详细介绍:
函数mice()首先从一个包含缺失数据的数据框开始,然后返回一个包含多个(默认为5个)完整数据集的对象。
每个完整数据集都是通过对原始数据框中的缺失数据进行插补而生成的。 由于插补有随机的成分,因此每个完整数据集都略有不同。
然后, with()函数可依次对每个完整数据集应用统计模型(如线性模型或广义线性模型) ,
最后, pool()函数将这些单独的分析结果整合为一组结果。最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。
install.packages("mice")
library(lattice) # 调入函数包
library(MASS)
library(nnet)
library(mice) # 前三个包是mice的基础
md.pattern(inputfile)#查看哪些是缺失值
imp <- mice(inputfile, m = 4) # 4重插补,即生成4个无缺失数据集
imp$imp$sales
fit <- with(imp,lm(sales ~ date, data = inputfile)) # 选择插补模型
pooled <- pool(fit)
summary(pooled)
result4 <- complete(imp, action = 3) # 选择第三个插补数据集作为结果
结果解读:
(1)imp对象中,包含了:每个变量缺失值个数信息、每个变量插补方式(PMM,预测均值法常见)、插补的变量有哪些、预测变量矩阵(在矩阵中,行代表插补变量,列代表为插补提供信息的变量, 1和0分别表示使用和未使用);
同时 利用这个代码imp$imp$sales 可以找到,每个插补数据集缺失值位置的数据补齐具体数值是啥。第一个imp是上边数据集的名称,第二个imp固定不变。
(2)with对象。插补模型可以多样化,比如lm,glm都是可以直接应用进去,详情可见《R语言实战》第十五章;
(3)pool对象。summary之后,会出现lm模型系数,可以如果出现系数不显著,那么则需要考虑换插补模型;
(4)complete对象。m个完整插补数据集,同时可以利用此函数输出。
1、缺失值模式——可视化(md.pattern())
mice
包提供了一个很好的函数md.pattern()
,用它可以对缺失数据的模式有个更好的理解。还有一些可视化的界面,通过VIM、箱型图、lattice来展示缺失值情况。可见博客:在R中填充缺失数据—mice包 http://www.xueqing.tv/cms/article/98
————————————————————————————————————————————————————
2、mice函数详解
mice函数主要参数有mice(数据集,m=5,meth=”PMM“)
m为默认插补数据集数量,5为默认值;meth为默认插补方式,PMM为默认方式预测均值匹配。
还有一些其他methods插补方法,比如贝叶斯线性回归(norm)、基于bootstrap的线性回归(norm.boot)、线性回归预测值(norm.predict)、分类回归树(cart)、随机森林(rf)等等。(详情可help(mice)获取信息)
使用这些插补方法对数据有严格的要求,比如贝叶斯线性回归等前三个模型都需要数据符合numeric格式,而PMM、cart、rf任意格式都行。
使用以上模型遇见的问题有:
1、PMM相当于某一指标的平均值作为插补,会出现插补值重复的问题;
2、cart以及rf是挑选某指标中最大分类的那个数字,是指标中的某一个数字,未按照规律;
3、要使用norm.predict,必须先对数据进行格式转换,这个过程中会出现一些错误,比如以下错误警告:
Error in solve.default(xtx + diag(pen)) :
Imputation method norm.boot is not for factors with three or more levels.
————————————————————————————————————————————————————
3、with-pool函数的作用
在使用Mice包的过程中会出现以下的疑惑:
已经有mice函数补齐了缺失值,可以直接用compete直接调出,为啥还要用with,pool?
mice函数中默认插补5个数据集,那么哪个数据集最好,值得选出?
笔者认为with-pool的作用是用来选择数据集的。
with函数中有5个插补数据集的回归模型~数据集T检验~某数据集是否合格;
pool函数把5个回归模型汇总~数据集F检验~整个方法是否合格。
当然,一个未解决的问题是,小数据集可以每个数据集进行观察,如果要插补很多,该怎么办呢?
其中,批量导入、写出数据的方法可见:
R语言︱文件读入、读出一些方法罗列(批量xlsx文件、数据库、文本txt、文件夹)