在R语言中进行缺失值填充:估算缺失值

news2024/10/5 14:09:26

 介绍

缺失值被认为是预测建模的首要障碍。因此,掌握克服这些问题的方法很重要。最近我们被客户要求撰写关于缺失值处理的研究报告,包括一些图形和统计输出。

估算缺失值的方法的选择在很大程度上影响了模型的预测能力。在大多数统计分析方法中,删除是用于处理缺失值的默认方法。但是,它会导致信息丢失。

在本文中,我列出了5个R语言方法。

链式方程进行的多元插补

通过链式方程进行的多元插补是R用户常用的。与单个插补(例如均值)相比,创建多个插补可解决缺失值的不确定性。

MICE假定缺失数据是随机(MAR)缺失,这意味着,一个值缺失概率上观测值仅取决于并且可以使用它们来预测。通过为每个变量指定插补模型,可以按变量插补数据。

例如:假设我们有X1,X2….Xk变量。如果X1缺少值,那么它将在其他变量X2到Xk上回归。然后,将X1中的缺失值替换为获得的预测值。同样,如果X2缺少值,则X1,X3至Xk变量将在预测模型中用作自变量。稍后,缺失值将被替换为预测值。

默认情况下,线性回归用于预测连续缺失值。Logistic回归用于分类缺失值。一旦完成此循环,就会生成多个数据集。这些数据集仅在估算的缺失值上有所不同。通常,将这些数据集分别构建模型并组合其结果被认为是一个好习惯。

确切地说,使用的方法是:

  1. PMM(预测均值匹配)–用于数字变量
  2. logreg(逻辑回归)–对于二进制变量(具有2个级别)
  3. polyreg(贝叶斯多元回归)–用于因子变量(> = 2级)
  4. 比例模型(有序,> = 2个级别)

现在让我们实际操作

> path <- "../Data/Tutorial"
> setwd(path)

#读取数据
> data <- iris

#随机产生10%的缺失值
> summary(iris)

#随机产生10%的缺失值
> iris.mis <- prodNA(iris, noNA = 0.1)

#检查数据中引入的缺失值
> summary(iris.mis)

我删除了分类变量。让我们在这里关注连续值。要处理分类变量,只需对类level进行编码并按照以下步骤进行即可。

#删除类别变量
> iris.mis <- subset(iris.mis, select = -c(Species))
> summary(iris.mis)

 

 md.pattern返回数据集中每个变量中存在的缺失值的表格形式。

> md.pattern(iris.mis)

让我们了解一下这张表。有98个观测值,没有缺失值。Sepal.Length中有10个观测值缺失的观测值。同样,Sepal.Width等还有13个缺失值。

 我们还可以创建代表缺失值的视觉效果。 

> mice_plot <- aggr(iris.mis, col=c('navyblue','yellow'),
                    numbers=TRUE, sortVars=TRUE,
                    labels=names(iris.mis), cex.axis=.7,
                    gap=3, ylab=c("Missing data","Pattern"))

让我们快速了解这一点。数据集中有67%的值,没有缺失值。在Petal.Length中缺少10%的值,在Petal.Width中缺少8%的值,依此类推。您还可以查看直方图,该直方图清楚地描述了变量中缺失值的影响。

现在,让我们估算缺失的值。


Multiply imputed data set
Call:
 Number of multiple imputations: 5
Missing cells per column:
Sepal.Length Sepal.Width Petal.Length Petal.Width 
13            14          16           15 
Imputation methods:
Sepal.Length Sepal.Width Petal.Length Petal.Width 
"pmm"        "pmm"        "pmm"       "pmm" 
VisitSequence:
Sepal.Length Sepal.Width Petal.Length Petal.Width 
1              2            3           4 
PredictorMatrix:
              Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length        0          1            1            1
Sepal.Width         1          0            1            1
Petal.Length        1          1            0            1
Petal.Width         1          1            1            0
Random generator seed value: 500

这是使用的参数的说明:

  1. m – 估算数据集
  2. maxit – 插补缺失值的迭代次数
  3. method –是指插补中使用的方法。我们使用了预测均值匹配。

由于有5个估算数据集,因此可以使用complete()函数选择任何数据集。

 还可以合并来自这些模型的结果,并使用pool()命令获得合并的输出。

请注意,我仅出于演示目的使用了上面的命令。您可以在最后替换变量值并尝试。

多重插补

该程序包还执行多个插补(生成插补数据集)以处理缺失值。多重插补有助于减少偏差并提高效率。它可以通过基于bootstrap程序的EMB算法,从而可以更快速,更可靠地插入许多变量,包括横截面,时间序列数据等。此外,还可以使用多核CPU的并行插入。

它做出以下假设:

  1. 数据集中的所有变量均具有多元正态分布(MVN)。它使用均值和协方差汇总数据。
  2. 缺失数据本质上是随机的(随机缺失

因此,当数据具有多变量正态分布时,最有效。如果没有,将进行转换以使数据接近正态分布

唯一需要注意的是对变量进行分类

 

#访问估算的输出
> amelia_fit$imputations[[1]]
> amelia_fit$imputations[[2]]
> amelia_fit$imputations[[3]]
> amelia_fit$imputations[[4]]
> amelia_fit$imputations[[5]]

要检查数据集中的特定列,使用

> amelia_fit$imputations[[5]]$Sepal.Length

#将输出导出到csv文件

> write.amelia(amelia_fit, file.stem = "imputed_data_set")

随机森林

顾名思义,missForest是一个实现随机森林算法。它适用于各种变量类型的非参数插补法。那么,什么是非参数方法?

非参数方法不会有关于函数形式明确的假设˚F 。取而代之的是,它尝试估计f,使其可以与数据点尽可能接近

它是如何工作的 ?简而言之,它为每个变量建立一个随机森林模型。然后,它使用模型在观测值的帮助下预测变量中的缺失值。

它产生OOB(袋外)估算误差估计。而且,它对插补过程提供了高水平的控制。它有选择分别返回OOB(每个变量),而不是聚集在整个数据矩阵。这有助于准确估算模型值。

NRMSE是归一化的均方误差。它用于表示从估算连续值得出的误差。PFC(错误分类的比例)用于表示从估算类别值得出的误差

#比较实际数据准确性
> iris.err <- mixError(iris.imp$ximp, iris.mis, iris)
>iris.err

NRMSE      PFC 
0.1535103 0.0625000

这表明类别变量的误差为6%,连续变量的误差为15%。这可以通过调整mtryntree参数的值来改善  。mtry是指在每个分支中随机采样的变量数。ntree是指在森林中生长的树木数量。

非参数回归方法

 对多个插补中的每个插补使用不同的bootstrap程序重采样。然后,将 加性模型(非参数回归方法)拟合到从原始数据中进行替换得到的样本上,并使用非缺失值(独立变量)预测缺失值(充当独立变量)。

然后,它使用预测均值匹配(默认)来插补缺失值。预测均值匹配非常适合连续和分类(二进制和多级),而无需计算残差和最大似然拟合。

自动识别变量类型并对其进行相应处理。

> impute_arg

输出显示R²值作为预测的缺失值。该值越高,预测的值越好。使用以下命令检查估算值

#检查估算变量Sepal.Length
> impute_arg$imputed$Sepal.Length

带有诊断的多重插补

 带有诊断的多重插补 提供了一些用于处理缺失值的方法。 它也构建了多个插补模型来近似缺失值。并且,使用预测均值匹配方法。

虽然,我已经在上面解释了预测均值匹配(pmm)  :对于变量中缺失值的每个观察值,我们都会从可用值中找到最接近的观察值该变量的预测均值。然后将来自“匹配”的观察值用作推断值。

  1. 它可以对插补模型进行图形诊断,并可以实现插补过程的收敛。
  2. 它使用贝叶斯版本的回归模型来处理问题
  3. 插补模型规范类似于R中的回归输出
  4. 它会自动检测数据中的不规则性,例如变量之间的高共线性。
  5. 而且,它在归算过程中增加了噪声,以解决加性约束的问题。

 如图所示,它使用汇总统计信息来定义估算值。

尾注

在本文中,我说明使用5个方法进行缺失值估算。这种方法可以帮助您在建立预测模型时获得更高的准确性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有状态软件如何在 k8s 上快速扩容甚至自动扩容

概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机安装依赖下载安装包按规范配置主机名, hosts配置网络: 包括域名, DNS, 虚 ip, 防火墙...配置监控 今天虚机环境上出现了问题, 是因为 RabbitMQ 资源不足. 手动扩容…

一夜之间火爆GitHub的JavaWeb轻量级开发面试教程,终于浮出水面

前言 学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生…

[附源码]Python计算机毕业设计Django医院门诊管理信息系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

React组件通信

react因为组件化&#xff0c;使得组件间通信十分的重要。本文就来简单介绍一些常见的react组件间传递的内容。 我将归纳为以下几种关系来详述:父组件与子组件之间&#xff0c;子组件与父组件之间&#xff0c;发布者与订阅者模式&#xff08;context&#xff09;&#xff0c;兄弟…

Netty入门——基于NIO实现机器客服案例

Netty简单案例前言环境准备前置知识网络传输的几种实现方式BIO——同步阻塞IONIO——同步非阻塞IOAIO——异步非阻塞IO适用范围Netty简介特点核心组件使用场景运行简图案例简介关键代码客户端服务器端运行状况总结前言 最近学完了Netty&#xff0c;在这里关于Netty中实现NIO做…

【Shell 脚本速成】09、Shell 循环控制语句 for

目录 一、循环控制 break 语句 二、循环控制 continue 语句 三、循环控制 sleep 四、参数控制命令-shift 五、脚本退出命令 exit 总结 六、for 嵌套 6.1 for 嵌套 if 七、for 与数组 7.1 使用 for 循环遍历读出数组 7.2 使用 for 循环进行数组存值 一、循环控制 bre…

Zabbix6.0使用教程 (一)—zabbix新增功能介绍2

上一篇我们已经介绍了部分zabbix6.0的新增功能&#xff0c;这期我们将继续为家详细介绍下余下的zabbix6.0新增功能&#xff0c;大家可以往下看。 六、监控项 6.1 自动类型选择 监控项配置表单会自动建议匹配的信息类型&#xff0c;如果选定的监控项键值仅返回特定类型的数据…

迷宫逃离的问题-CoCube

ROS1云课→20迷宫不惑之A*大法&#xff08;一种虽古老但实用全局路径规划算法&#xff09; 将CoCube分别放入如下地图中的左侧&#xff0c;如何从右侧逃离&#xff1a; 需要算法&#xff1a;求解起点到终点的路径。 还需要什么&#xff1f; 参考&#xff1a; &#xff08;eng.…

目标检测算法——垃圾分类数据集汇总(附下载链接)

&#x1f384;&#x1f384;近期&#xff0c;小海带在空闲之余收集整理了一批垃圾分类数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&#xff01;&#x1f388;&#x1f388; 目录 一、Kaggle 垃圾分类图片数据集 二、垃圾分类数据…

全国青少年软件编程等级考试Python标准解读(1_6级)

考核性质&#xff1a; 全国青少年软件编程等级考试标准&#xff08;Python语言&#xff09;由中国电子学会科普培训与应用推广中心和北京大学信息科学技术学院共同制定。由全国青少年电子信息科普创新联盟标准工作组开发&#xff0c;由中国电子学会普及工作委员会审核通过&…

央视主持人康辉再次出圈,一口气播出一个多小时不卡顿、零失误

说起中央电视台的主持人&#xff0c;曾经有好几个国字脸&#xff0c;不过随着时间的流逝&#xff0c;他们都消失在历史的长河里。如今的央视主持人队伍&#xff0c;康辉可以算得上天花板级别的人&#xff0c;他也因此俘获了一大批观众&#xff0c;成为最受欢迎的主持人。 专业科…

阿里P5的测试开发工程师,都有哪些要求?

【北京】高德 高级测试开发工程师&#xff08;面议&#xff09; 职位描述&#xff1a; 1、负责高德信息服务核心服务端系统测试和质量保障体系建设&#xff1b; 2、为复杂高德信息-本地生活系统设计并执行高质量的综合测试方案&#xff1b; 3、通过多种技术手段实现高度自…

数据库常见死锁原因及处理

目录前言什么是死锁死锁产生的四个必要条件1. 表锁死锁死锁场景解决方案建议2. 行锁死锁2.1 两个事务分别想拿到对方持有的锁&#xff0c;互相等待&#xff0c;于是产生死锁死锁场景解决方案2.2 共享锁转换为排他锁死锁场景解决方案3. INSERT ... ON DUPLICATE KEY UPDATE产生d…

[附源码]Python计算机毕业设计Django疫情防控平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Watch事件介绍_java培训

Watch事件 Java培训课程 Watch事件 一次触发 当数据有了变化时zkserver向客户端发送一个watch,它是一次性的动作&#xff0c;即触发一次就不再有效&#xff0c;类似一次性纸杯。 只监控一次。如果想继续Watch的话&#xff0c;需要客户端重新设置Watcher。因此如果你得到一个w…

【Android Studio程序开发】按钮触控---按钮控件Button

除了文本视图之外&#xff0c;按钮Button也是一种基础控件。因为Button是由TextView派生而来&#xff0c;所以文本视图 拥有的属性和方法&#xff0c;包括文本内容、文本大小、文本颜色等&#xff0c;按钮控件均能使用。不同的是&#xff0c;Button拥有默认的按钮背景&#xff…

采购管理系统有什么用,哪个好?

如今随着各行各业的采购组织管理理念的不断变换&#xff0c;利用信息化手段来管理企业采购行为已然成为一种趋势。 现代采购管理系统可以使采购组织规范采购工作的组织实施&#xff0c;建立有责任感的管理体系&#xff0c;从而提高企业经济效益和采购质量&#xff0c;增强企业…

Linux搭建 FTP服务器

Linux搭建 FTP服务器 vsftpd 是 very secure ftp daemon 的缩写&#xff0c;它是 Linux 上使用最受欢迎、使用最广泛的 FTP 服务器之一&#xff0c;它具有安全&#xff0c;速度快&#xff0c;稳定的特点&#xff0c;很多重要的 FTP 站点比如 ftp.gnu.org、ftp.freebsd.org 都是…

【JavaWeb开发-Servlet】day03-URL参数传递与MySQL数据库连接

目录 1、登录示例&#xff0c;谁用url传递参数 &#xff08;1&#xff09;创建一个Servlet类&#xff0c;名字叫做loginServlet &#xff08;2&#xff09;保留需要的部分 &#xff08;3&#xff09;删除多余代码 &#xff08;4&#xff09;编写loginServlet.class &#xff08…

ICV:2022年中国车载摄像头市场规模有望突破50亿美元大关

全球前沿科技咨询机构ICV近期发布了全球车载摄像头的市场分析报告。ICV在报告中指出&#xff0c;车载摄像头市场随着乘用车自动驾驶的发展呈现出快速增长的趋势&#xff0c;2022年中国市场在全球范围内仍保持“市场领跑者”的地位&#xff0c;并有望突破50亿美元市场规模的大关…