数据清洗:缺失值处理(R)

2020-02-28  本文已影响0人  挽山
# 设置工作空间
#setwd("F:/数据及程序/chapter4/示例程序/data")

# 导入原始数据
inputfile0<-read.csv(file = file.choose(), header = T, sep = ",")
head(inputfile0)

# 数据分割(分离病例对照,保留数值变量)
group<-as.data.frame(inputfile0[,1])
inputfile<-inputfile0[,-c(1:3)]; names(inputfile)

odd<-seq(1, nrow(m), by = 2)

# 数据概况
if(!suppressWarnings(require(VIM))) 
{
  install.packages('VIM')
  require(VIM)
}
library(VIM) #缺失模式可视化

md.pattern(inputfile) #了解缺失模式(自上而下,1完整,0缺失)
matrixplot(inputfile) #缺失模式可视化

#判断完全随机分布缺失(红色矩形和蓝色矩形应该看起来很相似)。
marginplot(inputfile[c("收缩压","可的松")],
           pch=c(20),
           col=c("darkgray","red","blue"))

aggr_plot<-aggr(inputfile, col=c('green','red'), #缺失分布
                numbers=T, 
                prop=T,
                sortVars=F, 
                labels=names(inputfile), 
                cex.axis=.7, 
                gap=3, 
                ylab=c("数据缺失模式直方图","模式"))
aggr_plot #概况

# 异常值识别
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, ] #缺失数据

#------------------------------------------------------------------------------
# 1.行删除法处理缺失,结果转存
result1<-inputfile1

# 2.均值替换法处理缺失,结果转存
avg_sales<-mean(inputfile1$sales) # 求变量未缺失部分的均值
inputfile2$sales <- rep(avg_sales,n) # 用均值替换缺失
result2 <-rbind(inputfile1, inputfile2) # 并入完成插补的数据

# 3.回归插补法处理缺失,结果转存
model<-lm(sales ~ date, data = inputfile1) # 回归模型拟合
inputfile2$sales<-predict(model, inputfile2) # 模型预测
result3<-rbind(inputfile1, inputfile2)


# 4.多重插补法处理缺失,结果转存
library(lattice) # 调入函数包
library(MASS)
library(nnet)
library(mice) # 前三个包是mice的基础
#---
imp<-mice(inputfile, m = 5) # 5重插补,即生成5个无缺失数据集
#imp$imp$可的松  #看每个插补数据集缺失值位置的数据补齐具体数值是啥
stripplot(imp,pch=19,cex=1.2,alpha=.3) #检查插补后数据分布(插补值是红色点)
fit<-with(imp,lm(BMI ~ 可的松 + Ca))
print(pool(fit))
result_5<-complete(imp, action = 3) # 选择第三个插补数据集作为结果
fina_5<-cbind(group, result_5); colnames(fina_5)[1]<-'group'
  
#---
imp50<-mice(inputfile, m = 50, seed = 23109) #增加插补次数,最小化模拟误差
fit<-with(imp50,lm(BMI ~ 可的松 + Ca))
print(pool(fit))
result_50<-complete(imp50, action = 3) # 选择第三个插补数据集作为结果
fina_50<-cbind(group, result_50); colnames(fina_50)[1]<-'group'

getwd()
write.csv(fina_5,"体格体成分_插补_ASD.csv")
write.csv(fina_50,"体格体成分_插补_Con.csv")




#5. 自定义拟合方法
init<-mice(inputfile, maxit = 0) #初始化插补模型,这里最大迭代次数选0是为了取得未开始插补的朴素模型参数
methods<-init$method; methods #取得对于每一个变量的初始插补方法(默认pmm)
predM<-init$predictorMatrix; predM #取得对每一个变量进行拟合用到的变量矩阵,0代表不用到,1代表用到
#不需拟合
predM[, c("group")]<-0
#利用修改后的参数组合来进行拟合插补
imputed<-mice(inputfile, method = methods, predictorMatrix = predM)
imputed$formulas['可的松'] #查看某项主导的拟合公式
result<-complete(imputed, action = 3) #插补
matrixplot(result) #可视化检查


# 自定义函数
#查看每个变量有多少个唯一值
sapply(
  training.data.raw,
  function(x)sum(is.na(x)))

#可视化
library(Amelia)
missmap(training.data.raw, main = 'Missing values vs observed')

上一篇下一篇

猜你喜欢

热点阅读