实用技巧——缺失数据的处理

缺失值

处理缺失数据的一般步骤:

  • 识别缺失数据;
  • 检查导致数据缺失的原因;
  • 删除包含缺失值的实例或用合理的数值代替(插补)缺失值

缺失数据的分类:

(1)完全随机缺失     若谋变量的缺失数据与其他任何观测或未观测变量都不相关,则数据为完全随机缺失(MCAR)。

(2)随机缺失    若某变量上的缺失数据与其他观测变量相关,与他自己的未观测值不相关,则数据为随机缺失(MAR)。

(3)非随机缺失    若缺失数据不属于MCAR和MAR,则数据为非随机缺失(NMAR)。

大部分处理缺失数据的方法都是假定数据是MCAR或MAR,此时可以忽略缺失数据的生成机制,并且(在替换或删除缺失数据后)可以直接对感兴趣的关系进行建模。

当数据是NMAR时,模型处理相较困难,目前有的方法有模型选择法模式混合法。以下主要讨论的是MCAR和MAR。

案例:VIM包中的哺乳动物睡眠数据(sleep)。该研究了62种哺乳动物的睡眠、生态学变量、和体质变量间的关系。

睡眠变量包括做梦时长(Dream),不做梦时长(NonD)以及它们的和(sleep)。体质变量包括体重(Bodyweight,单位是千克),脑重(BrainWgt),寿命(Span)和妊娠期(Gest)。生态学变量包括物种被捕食的程度(pred),睡眠时暴露程度(Exp)和面临的总危险度(Danger)。

识别缺失值

在R中,NA代表缺失值,NAN(不是一个数)代表不可能值

符合-Inf和Inf代表负无穷和正无穷。is.na(), is.nan(), 和 is.infinite()可以分别识别缺失值、不可能值和无穷值。

xis.na()is.nan()is.infinite()
x<- NATRUEFALSEFALSE
x<- 0 / 0TRUETRUEFALSE
x<- 1 / 0FALSEFALSETRUE

函数complete.cases( )可以用来识别矩阵或数据框中没有缺失值的行。若每一行都有一个或多个缺失值,则返回FALSE

rm(list=ls())
#install.packages("VIM")
data(sleep,package = "VIM")
#列出没有缺失值的行
sleep[complete.cases(sleep),]
#列出有一个或多个缺失值的行
sleep[!complete.cases(sleep),]

根据TRUE和FALSE的数量进行统计,可以结合sum()和mean()函数获取相关信息

#Dream变量中缺失值的数目
sum(is.na(sleep$Dream))
#变量Dream中缺失值占的比例
mean(is.na(sleep$Dream))
#在数据框中缺失行所占的比例
mean(!complete.cases(sleep))

列表显示缺失值

 mice包中的md.pattern()函数可生成一个以矩阵或数据框形式展示缺失值模型的表格。

library(mice)
md.pattern(sleep)

表中的1和0显示了缺失值模式:0表示变量的列中有缺失值,1则表示没有缺失值。第一行表述了无缺失值的模式(所有元素都为1)。第二行表述了“除了span之外无缺失值”的模式。第一列表示各缺失值模式的实例数,最后一列表示各模式中有缺失值的变量的个数。

理解:42个实例没有缺失值,仅2个实例缺失了Span,9个实例同时缺失了NonD和Dream的值。数据集包含了总共(42*0)+(2*1)+……+(1*3)=38个缺失值。最后一行给出了每个变量中缺失值的数目。

图形显示缺失值

aggr()函数不仅绘制每个变量的缺失值数据,还绘制了每个变量组合的缺失值数。

library("VIM")
aggr(sleep,prop=F,number=T)

 prop设置是否显示比例,number显示是否数量。

 可以看到NonD有最大的缺失值数,其中有2种动物同时缺失了NonD、Dream和Sleep的评分。

 

matrixplot()函数可生成展示每个实例数据的图形。

matrixplot(sleep)

灰度表示大小:浅色表示值小,深色表示值大。默认缺失值为红色。

缺失数据的处理

行删除

将数据种存在缺失值的行全部删除,可以通过下面两个函数实现:

newdata <- mydata[complete.cases(mydata),]
newdata <- na.omit(mydata)

行删除法假定数据为MCAR,也即是完整样本被认为是总体总随机抽取的子样本。删除行,减少了可用样本,这回导致统计效力降低。

多重插补

多重插补(MI)是一种基于重复模拟的处理缺失值的方法。对于复杂的缺失值问题,MI是最常用的方法,它将从一个包含缺失值的数据集中生成一组完整的数据集。每个模拟数据集中,缺失数据将用蒙特卡洛方法来填补。

基本步骤:

mice()首先从一个包含缺失数据的数据集开始,返回包含多个(默认=5)完整数据集的对象。每个完整数据集都是通过对原始数据集中的缺失数据进行插补而生成的。由于插补有随机成分,因此插补后的每个完整数据集有所不同。

with()可依次对每个完整数据集应用统计模型(如广义线性模型)。

pool()将这些单独的分析结果整合为一组结果。最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。

基本格式:

library(mice)
imp <- mice(data,m)
fit <- with(imp,analysis)
pooled <- pool(fit)
summary(pooled)

data是一个包含缺失值的矩阵或数据框

imp是一个包含m个插补数据集的列表对象,同时还含有完成插补过程的信息。默认m为5;

analysis是一个表达式对象,用来设定应用于m个插补数据集的统计分析方法。

fit是包含m个单独统计分析结果的列表对象;

pooled是一个包含这m个统计平均结果的列表对象。

imp <- mice(sleep,m=5,seed = 1234)
fit <- with(imp,lm(Dream~Span+Gest))
pooled <- pool(fit)
summary(pooled)

可以通过imp获取更多的插补信息。

imp

从数据可以看到Bodyweight,Brainwgt,Pred,Exp,Danger没有进行插补,其他的变量通过预测均值(pmm)进行了缺失值处理。

visitSequence从左到右展示了插补的变量,predictorMatrix展示进行插补过程的含有缺失值的变量,他们利用了数据集中其他变量的信息。其中行代表插补变量,列代表为插补提供信息的变量,1和0分别表示使用和未使用。

imp$imp$Dream

展示了在Dream变量中有缺失值的12个动物有5次插补值。

complete()函数可以查看m个插补数据集中任意一个

complete(imp,action = 3)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么抹掉 Macbook系统 并将它还原为出厂设置

抹掉 Mac 并将它还原为出厂设置 借助“抹掉所有内容和设置”这项功能&#xff0c;你可以快速安全地抹掉所有设置、数据和 App&#xff0c;同时保留当前安装的操作系统。 使用“抹掉所有内容和设置” 这项功能要求装有 macOS Monterey 或更高版本&#xff0c;且使用搭载 Apple 芯…

Python基础第八篇(Python异常处理,模块与包)

文章目录 一、了解异常二、捕获异常&#xff08;1&#xff09;.异常案例代码&#xff08;2&#xff09;.读出结果 三、异常的传递&#xff08;1&#xff09;.异常传递案例代码&#xff08;2&#xff09;.读出结果 四、Python模块&#xff08;1&#xff09;.模块的导入&#xff…

Unity编程#region..#endregion以及面板提示语标签[Tooltip(““)]

C#中的#region..#endregion 在Unity中&#xff0c;#region和#endregion是用于代码折叠的预处理指令。它们并不是Unity特有的&#xff0c;而是C#语言本身提供的功能。 #region用于标记一段代码的开始&#xff0c;而#endregion用于标记一段代码的结束。在编辑器中&#xff0c;可…

JVM的组成部分(类加载器、运行时数据区、执行引擎、本地库接口)

目录 JVM作用 JVM构成 1.类加载器 类加载子系统&#xff1a; 类加载器的分类&#xff1a; 双亲委派机制&#xff1a; 2.运行时数据区 程序计数器 虚拟机栈 本地方法栈 堆 方法区 3.执行引擎 4.本地库接口 JVM作用 jvm是将字节码文件加载到虚拟机中&#xff0c;…

C++(Qt)软件调试---静态分析工具clang-tidy(18)

C(Qt)软件调试—静态分析工具clang-tidy&#xff08;18&#xff09; 文章目录 C(Qt)软件调试---静态分析工具clang-tidy&#xff08;18&#xff09;1、概述2、clang-tidy基本用法3、目前已有检查项4、Qt Creator中安装clang-tidy5、Qt Creator中使用clang-tidy6、Clang-Tidy配置…

抖音跳个人微信,有哪些解决办法?

抖音作为一个备受欢迎的短视频平台&#xff0c;为品牌和个人提供了广泛的推广机会。要有效地吸引和引导用户到微信端&#xff0c;需要掌握一些关键的引流方法。以下是抖音引流到微信的几种方法和技巧&#xff1a; 1.创建优质内容&#xff1a;确保发布的视频内容独特、有趣并富有…

java数组ArrayList(存对象)

1、dade文件 package model;public class dade {private int id;private String name;public dade() {}public dade(int id, String name) {this.id id;this.name name;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {…

0基础如何使用全功能的Python测试框架?

如何使用pytest&#xff1f; 大纲 安装和简单使用 配置文件 断言 一. 第一步 —— 安装和简单使用 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要特点有以下几点&#xff1a; • 1、简单灵活&#xff0c;容易上手&#xff0c;文档丰富&#xff1b; • 2、…

miniconda安装

Miniconda是一个小型版的Anaconda&#xff0c;它包含了一个包管理工具conda和Python。Miniconda适用于那些只需要管理Python包和环境&#xff0c;而不需要Anaconda中包含的大部分科学计算工具的用户。 Miniconda的安装过程相对简单。你可以从清华大学开源软件镜像站下载Minico…

Maven下载及安装,集成eclipse中,配置环境变量,创建maven项目等

这里写目录标题 Maven环境配置环境变量&#xff1a;eclipse中配置maveneclipse创建maven项目 Maven环境 解压 配置&#xff1a; 本地仓库的位置&#xff1a; <!-- 配置maven本地仓库 --> <!-- 目录可以提前创建&#xff0c;也可以后期生成 --><localReposito…

c语言-实现动态内存管理的库函数

文章目录 前言一、什么是动态内存分配&#xff1f;二、malloc()和free()2.1 malloc()介绍2.2 malloc()的使用2.3 free()介绍 三、calloc()3.1 calloc()介绍3.2 calloc()使用 四、realloc()4.1 realloc()介绍4.2 realloc()使用 总结 前言 本篇文章介绍c语言中实现动态内存管理的…

【Python从入门到进阶】47、Scrapy Shell的了解与应用

接上篇《46、58同城Scrapy项目案例介绍》 上一篇我们学习了58同城的Scrapy项目案例&#xff0c;并结合实际再次了项目结构以及代码逻辑的用法。本篇我们来学习Scrapy的一个终端命令行工具Scrapy Shell&#xff0c;并了解它是如何帮助我们更好的调试爬虫程序的。 一、Scrapy Sh…