美文网首页
数据清洗:缺失值处理(R)

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

作者: 挽山 | 来源:发表于2020-02-28 15:17 被阅读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')
    
    

    相关文章

      网友评论

          本文标题:数据清洗:缺失值处理(R)

          本文链接:https://www.haomeiwen.com/subject/bwrlhhtx.html