# 设置工作空间
#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')
网友评论