R语言之缺失值处理

news2024/9/24 17:20:50

文章和代码已经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 R语言 也可获取。

文章目录

  • 缺失值处理
  • 1. 识别缺失值
  • 2. 探索数据框里的缺失值
  • 3. 填充缺失值
    • 3.1 删除缺失值:na.omit( )、complete.cases( )
    • 3.2 使用特定数值替换缺失值
    • 3.3 多重插补

缺失值处理

在实际的数据分析中,缺失数据是常常遇到的。缺失值(missing values)通常是由于没有收集到数据或者没有录入数据。

例如,年龄的缺失可能是由于某人没有提供他(她)的年龄。大部分统计分析方法都假定处理的是完整的数据集。因此,除了一些专业化的书籍,大多数统计学教科书很少涉及这一问题。实际上,在进行正式的分析之前,我们需要在数据准备阶段检查数据集是否存在缺失值,并通过一些方法弥补因缺失值所造成的损失。

1. 识别缺失值

在 R 中,缺失值用 NA 表示,是“Not Available”的缩写。函数 is.na( ) 可以用于识别缺失值,其返回结果是逻辑值 TRUE 或 FALSE。

height <- c(100, 150, NA, 160)
height
# 100 150 <NA> 160
is.na(height)
# FALSE FALSE TRUE FALSE

如果数据很少,缺失值的个数直接可以数出来,比如上面的变量 height 只有一个缺失值。但是如果数据量很大,就需要借助函数 table( ) 了。

table(is.na(height))
# FALSE  TRUE 
#    3     1 

需要注意的是,任何包含 NA 的计算结果都是 NA。例如:

mean(height)
#  <NA>

想要得到所有可参与计算的元素的平均值,应该先将 NA 从向量中移除。

mean(height, na.rm = TRUE)
# 136.666666666667

参数 na.rm 表示移除缺失值,其意义与用函数 na.omit( ) 把缺失值省略是一样的。

mean(na.omit(height))

注意,这里 na.omit( ) 是一个独立的函数,它能忽略输入对象中的缺失值,而 na.rm 只是计算描述性统计量的函数里的一个内部参数。

函数 summary( ) 在计算向量的统计量时会自动忽略缺失值,它会给出向量中缺失值的个数。例如:

summary(height)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#   100.0   125.0   150.0   136.7   155.0   160.0       1 

2. 探索数据框里的缺失值

在决定如何处理缺失值之前,了解哪些变量有缺失值、数目有多少、是什么组合形式等是非常有意义的。下面用一个示例介绍探索缺失值模式的方法。

datasets 包里的数据集 iris 也称鸢尾花数据,它包含 150 个鸢尾花样品,分为 3 个品种(Species),每个品种各有 50 个样品。每个样品又包含 4 个属性,即花萼长度(Sepal.Length)、花萼宽度(Sepal.Width)、花瓣长度(Petal.Length)和花瓣宽度(Petal.Width)。该数据集不含缺失值。为了说明缺失值的处理方法,首先人为地生成一些缺失数据,以探索缺失值的模式和检验补全的效果。

missForest 包里的函数 prodNA( ) 可以随机生成缺失值,使用此函数前需要安装和加载 missForest 包。

options(warn=-1)
library(missForest)
data(iris)
# 为了使结果具有可重复性,我们用函数 `set.seed( )` 设置了生成随机数的种子。
set.seed(1234)
# 函数 prodNA( ) 默认生成数据数目 10% 的缺失值,我们可以通过改变参数 noNA 的值以生成不同数目的缺失值。
iris.miss <- prodNA(iris)
summary(iris.miss)

从函数 summary( ) 的输出中可以看到每个变量里缺失值的数目。要了解数据集里缺失值的模式,用图形展示是一个好办法。VIM 包提供了大量可视化缺失值的函数,其中函数 aggr( ) 不仅展示每个变量里缺失值的个数(或比例),还展示多个变量组合下缺失值的个数(或比例)。例如:

library(VIM)
aggr(iris.miss, prop = FALSE, numbers = TRUE, cex.axis = 0.7)

在上图中,第一幅图是用条形图展示了每个变量缺失值的个数,这与上面函数 summary( ) 的输出结果是一致的;第二幅图展示了数据框中 5 个变量不同组合下缺失值的个数,其中红色方块代表缺失值,最右边的数字代表个数。从最下面看起,共有 97 个鸢尾花样品没有缺失值,有 9 个鸢尾花样品知道它们的 4 个属性但不知道品种。

3. 填充缺失值

一般来说,处理缺失值可以采用下面 3 种方法:

  1. 删除,删除带有缺失值的变量或记录;
  2. 替换,用均值、中位数、众数或其他值替代缺失值;
  3. 补全,基于统计模型推测和补充缺失值。

上述方法都是在不得已时使用,无论哪种方法都不能完全弥补数据缺失带来的信息损失。因此,在数据收集阶段必须尽量避免数据的缺失

3.1 删除缺失值:na.omit( )、complete.cases( )

如果缺失值的数量很小,删除后对分析结果影响不大,我们可以使用前面提到的函数 na.omit( ) 删除数据框中的缺失值。例如:

iris.sub <- na.omit(iris.miss)
nrow(iris.sub)

删除缺失值后的数据框 iris.sub 只包含 97 条完整记录。此外,函数 complete.cases( ) 可以用来识别矩阵或数据框中没有缺失值的行,它的返回值是 TRUE 或 FALSE。如果某一行有完整的数据,返回 TRUE;如果某一行至少包含一个缺失值,则返回 FALSE。所以,上面的命令等价于:

iris.sub <- iris.miss[complete.cases(iris.miss), ]

3.2 使用特定数值替换缺失值

如果不想直接删除缺失值,在某些情况下,还可以尝试使用特定的数值替换缺失值。
下面以变量 Sepal.Length 为例,用忽略缺失值后的均值替换该变量里的缺失值。先计算均值:

Sepal.Length.Mean <- mean(iris.miss$Sepal.Length, na.rm = TRUE)
Sepal.Length.Mean
# 5.78695652173913
# 用忽略缺失值后的均值替换该变量里的缺失值
iris.miss1 <- iris.miss
iris.miss1$Sepal.Length[is.na(iris.miss1$Sepal.Length)] <- Sepal.Length.Mean

为检查补全后的数据与原始数据的差异,我们可以计算偏差:

summary((iris$Sepal.Length - iris.miss1$Sepal.Length)/iris$Sepal.Length)
#  Min. 1st Qu. Median Mean 3rd Qu. Max.
# -0.258034 0.000000 0.000000 0.006871 0.000000 0.248447

补全的平均偏差不到 1%,但最大偏差大约为 ±25%。

3.3 多重插补

多重插补(multiple imputation)是一种基于重复模拟的处理缺失值的方法,常用于处理比较复杂的缺失值问题。

R 中有多个可以实现缺失值多重插补的包,如 Amelia 包、mice 包和 mi 包等。其中 mice 包使用链式方程的多变量补全法,被广泛运用于数据清洗过程中。

mice 包假设数据是随机缺失的,并根据变量的类型建立模型得到预测值以代替缺失值。在这些模型里,常用的有:

  1. 预测均值匹配(pmm),实质上就是线性回归,适用于数值型变量;
  2. Logistic 回归(logreg),适用于二分类变量;
  3. 多分类 Logistic 回归(ployreg),适用于无序多分类变量;
  4. 比例优势比模型(polr),适用于有序多分类变量。

接下来,用函数 mice( ) 补全数据框 iris.miss 里的缺失值。

library(mice)
imputed.data <- mice(iris.miss, seed = 1234)
summary(imputed.data)
# PredictorMatrix:
#             Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# Sepal.Length            0           1            1           1       1
# Sepal.Width             1           0            1           1       1
# Petal.Length            1           1            0           1       1
# Petal.Width             1           1            1           0       1
# Species                 1           1            1           1       0

在上面输出结果的矩阵 PredictorMatrix 里,每一行代表含有缺失值的变量名,如果该行对应的某一列元素为 1,代表该列变量被用于建模预测。

从上面的输出结果中可以看出,对于每一个变量,其余变量都被用于它的缺失值预测。函数 mice( ) 的输出结果是一个列表,其中的对象 imp 也是一个列表,存放的是每个变量缺失值的插补值。例如,使用下面的命令可以得到变量 Sepal.Length 的插补值:

imputed.data$imp$Sepal.Length

函数 mice( ) 通过 Gibbs 抽样完成,默认进行 5 次随机抽样,所以一共得到了 5 组插补值。我们可以通过查看上面的输出结果以检查插补值是否合理,然后选择其中的一组来补全。

例如,取 5 组插补值中的第 3 个:

complete.data <- complete(imputed.data, 3)

为了检查缺失值的补全效果,对于数值型变量,我们可以计算插补值与原始变量值的偏差。

以变量 Sepal.Length 为例:

summary((iris$Sepal.Length-complete.data$Sepal.Length)/iris$Sepal.Length)
#       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
# -0.1428571  0.0000000  0.0000000  0.0007643  0.0000000  0.0945946

补全的平均偏差不到 0.1%,最大偏差大约为 ±13%。因此,这里用多重插补法比用均值替换缺失值的方法效果更好。

数据框的最后一个变量 Species 是一个因子,包含 19 个缺失值。为了检查这种分类变量的缺失值的补全效果,我们可以用函数 table( ) 得到原始变量和插补后变量的列联表:

table(iris$Species, complete.data$Species)
#              setosa versicolor virginica
#  setosa         50          0         0
#  versicolor      0         50         0
#  virginica       0          1        49

这种表被称为 混淆矩阵(confusion matrix),经常用于评价模型预测的准确度。对角线上的数字代表预测值和真实值一致的个数,非对角线上的数字代表预测值和真实值不一致的个数。

从上面的输出结果可以看出,变量 Species 的 19 个缺失值插补的正确率为 100%。

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

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

相关文章

机器学习:异常检测实战

文章目录 Anomaly Detection目录任务介绍数据集方法评估Baseline报告报告评价标准 Anomaly Detection 目录 任务介绍 无监督的异常检测 数据集 方法 autoencode 是否能够还原出原始类型图片&#xff0c;基于重构loss来判断是否正常 重构误差当作异常分数 评估 采用ROC和AUC…

Kubernetes入门 十、HPA 自动扩/缩容

目录 概述安装metrics-server使用HPA 概述 我们已经可以通过手动执行 kubectl scale 命令实现Pod的扩缩容&#xff0c;但是这显然不符合 Kubernetes 的定位目标–自动化和智能化。Kubernetes 期望可以通过监测Pod的使用情况&#xff0c;实现 Pod 数量的自动调整&#xff0c;于…

Orange Pi 3B 开发板 开箱评测 和 系统安装教程

香橙派 Orange Pi 3B&#xff08;RK3566&#xff09;开发板 开箱测评 和 系统烧录教程 简介 香橙派 Orange Pi 3B 是一款树莓派大小的单板计算机&#xff0c;但接口更加齐全&#xff0c;包括一个全尺寸 HDMI 接口和一个 M.2 存储插槽&#xff0c;售价199起。 Orange Pi 3B 采…

【Tkinter系列02/5】界面初步和布局

本文是系列文章第二部分。前文见&#xff1a;【Tkinter系列01/5】界面初步和布局_无水先生的博客-CSDN博客 说明 一般来说&#xff0c;界面开发中&#xff0c;如果不是大型的软件&#xff0c;就不必用QT之类的实现&#xff0c;用Tkinter已经足够&#xff0c;然而即便是Tkinter规…

软考:中级软件设计师:OSI/RM七层模型,网络技术标准与协议

软考&#xff1a;中级软件设计师:OSI/RM七层模型 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

No117.精选前端面试题,享受每天的挑战和学习

文章目录 断点续传怎么做的秒传怎么实现var let const 块级作用域ts Partial Omit 怎么实现的箭头函数有哪些限制箭头函数为什么不能作为构造函数promise常用apiMap和Object的区别vue怎么实现双向绑定 断点续传怎么做的 断点续传是指在文件下载或上传过程中&#xff0c;当连接…

ForexClub七夕交易大赛启动! 点燃交易之火为爱而战!

在这个充满激情的七夕季&#xff0c;ForexClub与您携手&#xff0c;掀起交易狂潮!点燃您心中的交易热忱&#xff0c;冲锋市场&#xff0c;赢取惊人奖金!别等了&#xff0c;参赛即有机会获得77美元的交易赠金&#xff0c;让我们一同为迸发的交易机会&#xff0c;燃烧一片天! 【大…

直流无刷电机工作原理及有感方波控制

BLDC方波控制 BLDC工作原理BLDC换向驱动过程有感控制模式 BLDC工作原理 首先要知道&#xff0c;BLDC转起来是基于什么原理 BLDC包括定子&#xff08;线圈&#xff09;和转子&#xff08;永磁体&#xff09;&#xff0c;线圈要通电&#xff0c;通电的线圈具有磁场&#xff0c;该…

基于寄生捕食算法优化的BP神经网络(预测应用) - 附代码

基于寄生捕食算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于寄生捕食算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.寄生捕食优化BP神经网络2.1 BP神经网络参数设置2.2 寄生捕食算法应用 4.测试结果&#xff1a;5…

01.基于自定义MVC架构的用户登录与首页展示实现 — OA项目实践

目录 本章节目标&#xff1a;完成OA项目用户登录及首页展示 一.用户登录 User.java UserDao.java IUserDao.java UserAction.java login.jsp&#xff08;登录界面&#xff09; userManage.jsp (数据绑定&#xff0c;修改&#xff0c;删除) userEdit.jsp&#xff08;用…

windows wvp-gb28181-pro一键安装的脚本流程

流程图 【金山文档】 windows wvp安装脚本流程https://kdocs.cn/l/cataPonNMXNm

信息系统项目管理师(第四版)教材精读思维导图-第四章信息系统管理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 目录 4.1 管理方法 4.2 管理要点 4.1 管理方…

linux并发服务器 —— Makefile与GDB调试(二)

Makefile Makefile&#xff1a;定义规则指定文件的编译顺序&#xff1b;类似shell脚本&#xff0c;执行操作系统命令 优点&#xff1a;自动化编译——通过make&#xff08;解释Makefile文件中指令的命令&#xff09;命令完全编译整个工程&#xff0c;提高软件开发效率&#x…

144. 二叉树的前序遍历-C++

题目来源&#xff1a;力扣 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 代码实现&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNo…

【Redis】Redis是什么、能干什么、主要功能和工作原理的详细讲解

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

人员着装识别算法 yolo

人员着装识别系统通过yolo网络模型识别算法&#xff0c;人员着装识别系统算法通过现场安装的摄像头识别工厂人员及工地人员是否按要求穿戴着装&#xff0c;实时监测人员的着装情况&#xff0c;并进行相关预警。目标检测架构分为两种&#xff0c;一种是two-stage&#xff0c;一种…

帆软报表系统未授权重置授权

子曰&#xff1a;“父在观其志&#xff0c;父没观其行。三年无改于父之道&#xff0c;可谓孝矣。” 未授权重置授权 构造payload&#xff0c;访问漏洞url&#xff1a; /ReportServer?opfr_server&cmdsc_version_info&showtoolbarfalse漏洞证明&#xff1a; 文笔生…

提高企业会计效率,选择Manager for Mac(企业会计软件)

作为一家企业&#xff0c;良好的财务管理是保持业务运转的关键。而选择一款适合自己企业的会计软件&#xff0c;能够帮助提高会计效率、减少错误和节约时间。在众多的选择中&#xff0c;Manager for Mac(企业会计软件)是一款值得考虑的优秀软件。 首先&#xff0c;Manager for…

软考:中级软件设计师:大数据

软考&#xff1a;中级软件设计师:大数据 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#x…

QEMU 仿真RISC-V freeRTOS 程序

1. 安裝RISC-V 仿真環境 --QEMU 安裝包下載地址: https://www.qemu.org/ 安裝命令及安裝成功效果如下所示, target-list 設定爲riscv32-softmmu, $ cat ~/project/qemu-8.0.4/install.sh sudo apt-get install libglib2.0-dev sudo apt-get install libpixman-1-dev ./co…