返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >R语言学习笔记缺失数据的Bootstrap与Jackknife方法
  • 267
分享到

R语言学习笔记缺失数据的Bootstrap与Jackknife方法

2024-04-02 19:04:59 267人浏览 安东尼
摘要

目录一、题目二、解答a)Bootstrap与Jackknife进行估计b)均值与变异系数(大样本)的标准差解析式推导与计算c)缺失插补前的Bootstrap与Jackknifed)比

一、题目

请添加图片描述

下面再加入缺失的情况来继续深入探讨,同样还是如习题1.6的构造方式来加入缺失值,其中a=2, b = 0

请添加图片描述

我们将进行如下几种操作:

请添加图片描述

二、解答

a)Bootstrap与Jackknife进行估计

首先构建生成数据函数。


# 生成数据
# 生成数据
GenerateData <- function(a = 0, b = 0) {
  y <- matrix(nrow = 3, ncol = 100)
  z <- matrix(rnORM(300), nrow = 3)
  
  y[1, ] <- 1 + z[1, ]
  y[2, ] <- 5 + 2 * z[1, ] + z[2, ]
  
  u <- a * (y[1, ] - 1) + b * (y[2, ] - 5) + z[3, ]
  # m2 <- 1 * (u < 0)
  
  y[3, ] <- y[2, ]
  y[3, u < 0] <- NA
  
  dat_comp <- data.frame(y1 = y[1, ], y2 = y[2, ])
  dat_incomp <- data.frame(y1 = y[1, ], y2 = y[3, ])
  # dat_incomp <- na.omit(dat_incomp)
  
  return(list(dat_comp = dat_comp, dat_incomp = dat_incomp))
}

Bootstrap与Jackknife的函数:


Bootstrap1 <- function(Y, B = 200, fun) {
  Y_len <- length(Y)
  mat_boots <- matrix(sample(Y, Y_len * B, replace = T), nrow = B, ncol = Y_len)
  statis_boots <- apply(mat_boots, 1, fun)
  boots_mean <- mean(statis_boots)
  boots_sd <- sd(statis_boots)
  return(list(mean = boots_mean, sd = boots_sd))
}

Jackknife1 <- function(Y, fun) {
  Y_len <- length(Y)
  mat_jack <- sapply(1:Y_len, function(i) Y[-i])
  redu_samp <- apply(mat_jack, 2, fun)
  jack_mean <- mean(redu_samp)
  jack_sd <- sqrt(((Y_len - 1) ^ 2 / Y_len) * var(redu_samp))
  return(list(mean = jack_mean, sd = jack_sd))
}

进行重复试验所需的函数:


RepSimulation <- function(seed = 2018, fun) {
  set.seed(seed)
  dat <- GenerateData()
  dat_comp_y2 <- dat$dat_comp$y2
  boots_sd <- Bootstrap1(dat_comp_y2, B = 200, fun)$sd
  jack_sd <- Jackknife1(dat_comp_y2, fun)$sd
  return(c(boots_sd = boots_sd, jack_sd = jack_sd))
}

下面重复100次实验进行 Y2​的均值与变异系数标准差的估计:


nrep <- 100
## 均值
fun = mean
mat_boots_jack <- sapply(1:nrep, RepSimulation, fun)
apply(mat_boots_jack, 1, function(x) paste(round(mean(x), 3), '±', round(sd(x), 3)))

## 变异系数
fun = function(x) sd(x) / mean(x)
mat_boots_jack <- sapply(1:nrep, RepSimulation, fun)
apply(mat_boots_jack, 1, function(x) paste(round(mean(x), 3), '±', round(sd(x), 3)))

从上面可以发现,Bootstrap与Jackknife两者估计结果较为相近,其中对均值标准差的估计,Jackknife的方差更小。这其实较为符合常识:Jackknife估计每次只取出一个样本,用剩下的样本来作为样本整体;而Bootstrap每次都会比较随机地重抽样,随机性相对较高,所以重复100次模拟实验,导致其方差相对较大。

下面我们用计算公式来进行推导。

b)均值与变异系数(大样本)的标准差解析式推导与计算

均值

请添加图片描述

变异系数(大样本近似)


## 变异系数
sd(sapply(1:10000, function(x) {
  set.seed(x)
  dat <- GenerateData(a = 0, b = 0)
  sd(dat$dat_comp$y2) / mean(dat$dat_comp$y2)
}))

变异系数大样本近似值为:0.03717648,说明前面的Bootstrap与Jackknife两种方法估计的都较为准确。

c)缺失插补后的Bootstrap与Jackknife

构造线性填补的函数,并进行线性填补。


DatImputation <- function(dat_incomp) {
  dat_imp <- dat_incomp
  lm_model = lm(y2 ~ y1, data = na.omit(dat_incomp))
  
  # 找出y2缺失对应的那部分data
  na_ind = is.na(dat_incomp$y2)
  na_dat = dat_incomp[na_ind, ]
  
  # 将缺失数据进行填补
  dat_imp[na_ind, 'y2'] = predict(lm_model, na_dat)
  return(dat_imp)
}

dat <- GenerateData(a = 2, b = 0)
dat_imp <- DatImputation(dat$dat_incomp)

fun = mean
Bootstrap1(dat_imp$y2, B = 200, fun)$sd

Jackknife1(dat_imp$y2, fun)$sd

fun = function(x) sd(x) / mean(x)
Bootstrap1(dat_imp$y2, B = 200, fun)$sd

Jackknife1(dat_imp$y2, fun)$sd

Bootstrap与Jackknife的填补结果,很大一部分是由于数据的缺失会造成距离真实值较远。但单从两种方法估计出来的值比较接近。

c)缺失插补前的Bootstrap与Jackknife

先构建相关的函数:


Array2meancv <- function(j, myarray) {
  dat_incomp <- as.data.frame(myarray[, j, ])
  names(dat_incomp) <- c('y1', 'y2')
  dat_imp <- DatImputation(dat_incomp)
  y2_mean <- mean(dat_imp$y2)
  y2_cv <- sd(dat_imp$y2) / y2_mean
  return(c(mean = y2_mean, cv = y2_cv))
}

Bootstrap_imp <- function(dat_incomp, B = 200) {
  n <- nrow(dat_incomp)
  array_boots <- array(dim = c(n, B, 2))
  mat_boots_ind <- matrix(sample(1:n, n * B, replace = T), nrow = B, ncol = n)

  array_boots[, , 1] <- sapply(1:B, function(i) dat_incomp$y1[mat_boots_ind[i, ]])
  array_boots[, , 2] <- sapply(1:B, function(i) dat_incomp$y2[mat_boots_ind[i, ]])
  
  mean_cv_imp <- sapply(1:B, Array2meancv, array_boots)
  boots_imp_mean <- apply(mean_cv_imp, 1, mean)
  boots_imp_sd <- apply(mean_cv_imp, 1, sd)
  return(list(mean = boots_imp_mean, sd = boots_imp_sd))
}

Jackknife_imp <- function(dat_incomp) {
  n <- nrow(dat_incomp)
  array_jack <- array(dim = c(n - 1, n, 2))
  
  array_jack[, , 1] <- sapply(1:n, function(i) dat_incomp[-i, 'y1'])
  array_jack[, , 2] <- sapply(1:n, function(i) dat_incomp[-i, 'y2'])
  
  mean_cv_imp <- sapply(1:n, Array2meancv, array_jack)
  jack_imp_mean <- apply(mean_cv_imp, 1, mean)
  jack_imp_sd <- apply(mean_cv_imp, 1, function(x) sqrt(((n - 1) ^ 2 / n) * var(x)))
  return(list(mean = jack_imp_mean, sd = jack_imp_sd))
}

然后看看两种方式估计出来的结果:


Bootstrap_imp(dat$dat_incomp)$sd

Jackknife_imp(dat$dat_incomp)$sd

缺失插补前进行Bootstrap与Jackknife也还是有一定的误差,标准差都相对更大,表示波动会比较大。具体表现情况下面我们多次重复模拟实验,通过90%置信区间来看各个方法的优劣。

d)比较各种方式的90%置信区间情况(重复100次实验)


RepSimulationCI <- function(seed = 2018, stats = 'mean') {
  mean_true <- 5
  cv_true <- sqrt(5) / 5
  
  myjudge <- function(x, value) {
    return(ifelse((x$mean - qnorm(0.95) * x$sd < value) & (x$mean + qnorm(0.95) * x$sd > value), 1, 0))
  }
  
  if(stats == 'mean') {
    fun = mean
    value = mean_true
  } else if(stats == 'cv') {
    fun = function(x) sd(x) / mean(x)
    value = cv_true
  }
  
  set.seed(seed)
  boots_after_ind <- boots_before_ind <- jack_after_ind <- jack_before_ind <- 0
  
  dat <- GenerateData(a = 2, b = 0)
  dat_incomp <- dat$dat_incomp
  
  # after imputation
  dat_imp <- DatImputation(dat_incomp)

  boots_after <- Bootstrap1(dat_imp$y2, B = 200, fun)
  boots_after_ind <- myjudge(boots_after, value)
  jack_after <- Jackknife1(dat_imp$y2, fun)
  jack_after_ind <- myjudge(jack_after, value)
  
  # before imputation
  boots_before <- Bootstrap_imp(dat_incomp)
  jack_before <- Jackknife_imp(dat_incomp)
  
  if(stats == 'mean') {
    
    boots_before$mean <- boots_before$mean[1]
    boots_before$sd <- boots_before$sd[1]
    jack_before$mean <- jack_before$mean[1]
    jack_before$sd <- jack_before$sd[1]
    
  } else if(stats == 'cv') {
    
    boots_before$mean <- boots_before$mean[2]
    boots_before$sd <- boots_before$sd[2]
    jack_before$mean <- jack_before$mean[2]
    jack_before$sd <- jack_before$sd[2]
    
  }
  
  boots_before_ind <- myjudge(boots_before, value)
  jack_before_ind <- myjudge(jack_before, value)
  
  return(c(boots_after = boots_after_ind,
           boots_before = boots_before_ind,
           jack_after = jack_after_ind,
           jack_before = jack_before_ind))
}

重复100次实验,均值情况:


nrep <- 100
result_mean <- apply(sapply(1:nrep, RepSimulationCI, 'mean'), 1, sum)
names(result_mean) <- c('boots_after', 'boots_before', 'jack_after', 'jack_before')
result_mean

变异系数情况:


result_cv <- apply(sapply(1:nrep, RepSimulationCI, 'cv'), 1, sum)
names(result_cv) <- c('boots_after', 'boots_before', 'jack_after', 'jack_before')
result_cv

上面的数字越表示90%置信区间覆盖真实值的个数,数字越大表示覆盖的次数越多,也就说明该方法会相对更好。

填补之前进行Bootstrap或Jackknife

无论是均值还是变异系数,通过模拟实验都能看出,在填补之前进行Bootstrap或Jackknife,其估计均会远优于在填补之后进行Bootstrap或Jackknife。而具体到Bootstrap或Jackknife,这两种方法相差无几。

填补之后进行Bootstrap或Jackknife

在填补之后进行Bootstrap或Jackknife,效果都会很差,其实仔细思考后也能够理解,本身缺失了近一半的数据,然后填补会带来很大的偏差,此时我们再从中抽样,有很大可能抽出来的绝大多数都是原本填补的有很大偏差的样本,这样估计就会更为不准了。

当然,从理论上说,填补之前进行Bootstrap或Jackknife是较为合理的,这样对每个Bootstrap或Jackknife样本,都可以用当前的观测值去填补当前的缺失值,这样每次填补可能花费的时间将对较长,但实际却更有效。

以上就是R语言学习笔记缺失数据的Bootstrap与Jackknife方法的详细内容,更多关于R语言学习笔记的资料请关注编程网其它相关文章!

--结束END--

本文标题: R语言学习笔记缺失数据的Bootstrap与Jackknife方法

本文链接: https://lsjlt.com/news/156761.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • R语言学习笔记缺失数据的Bootstrap与Jackknife方法
    目录一、题目二、解答a)Bootstrap与Jackknife进行估计b)均值与变异系数(大样本)的标准差解析式推导与计算c)缺失插补前的Bootstrap与Jackknifed)比...
    99+
    2024-04-02
  • R语言怎么使用缺失数据的Bootstrap与Jackknife方法
    本篇内容介绍了“R语言怎么使用缺失数据的Bootstrap与Jackknife方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、题目下面...
    99+
    2023-06-25
  • R语言学习笔记之plot函数
    目录前言一、plot函数基本函数二、plot函数其他常用的参数三、一个完整的实例总结前言 plot函数是R语言中画图使用最多的函数,参数也非常之多,简单的总结,之后应该会在学习的过程...
    99+
    2022-11-13
    r语言plot函数用法 r语言plot函数怎么用 R plot函数
  • R语言学习笔记之lm函数详解
    在使用lm函数做一元线性回归时,发现lm(y~x+1)和lm(y~x)的结果是一致的,一直没找到两者之间的区别,经过大神们的讨论和测试,才发现其中的差别,测试如下: -------...
    99+
    2024-04-02
  • C语言断言函数assert()的学习笔记
      在C语言库函数中提供了一个辅助调试程序的小型库,它是由assert()宏组成,接收一个整形表达式作为参数。如果表达式的值为假(非零),则assert()宏...
    99+
    2024-04-02
  • 使用R语言填补缺失值的方法
    使用R语言填补缺失值 数据处理过程中,往往会存在缺失值,对于缺失值的处理,目前各大统计书提出的方法有剔除,用均数填补,用众数填补,采用其他自变量进行回归,推算缺失值进行填补等。在R语...
    99+
    2024-04-02
  • PHP学习笔记:数据结构与算法
    概述:数据结构和算法是计算机科学中非常重要的两个概念,它们是解决问题和优化代码性能的关键。在PHP编程中,我们常常需要使用各种数据结构来存储和操作数据,同时也需要使用算法来实现各种功能。本文将介绍一些常用的数据结构和算法,并提供相应的PHP...
    99+
    2023-10-21
    学习笔记 PHP 数据结构 PHP 算法
  • r语言填充缺失值的方法是什么
    在R语言中,可以使用以下方法填充缺失值:1. 使用均值、中位数或众数填充:可以通过计算非缺失值的平均值、中位数或众数,然后用该值来填...
    99+
    2023-09-11
    r语言
  • GO语言学习笔记:Load面试题的技巧和方法
    随着互联网的不断发展,计算机科学领域的各种编程语言也不断涌现。作为一种新兴的编程语言,GO语言备受关注,越来越多的程序员开始学习和使用它。在学习GO语言的过程中,面试题是一个非常重要的环节。Load面试题是一类常见的面试题,本文将为大家介...
    99+
    2023-09-06
    学习笔记 load 面试
  • PHP学习笔记:XML与JSON数据的解析
    一、引言在现代的互联网应用开发中,数据的传输和交换是非常常见的需求。而XML和JSON都是常用的数据格式,它们具有结构化和可读性高的特点,因此在数据的解析和处理中被广泛应用。本文主要介绍如何使用PHP进行XML和JSON数据的解析,以及附上...
    99+
    2023-10-21
    PHP JSON xml
  • 学习Go语言的方法与技巧
    学习Go语言的方法与技巧,需要具体代码示例 随着互联网技术的不断发展,Go语言作为一种快速、可靠、高效的编程语言,受到了越来越多开发者的青睐。想要学习Go语言,掌握其方法与技巧,首先需...
    99+
    2024-03-14
    学习方法 go语言基础 go编程技巧 go语言 标准库
  • Go语言索引算法:Unix系统下的学习笔记
    索引算法是计算机科学中非常重要的一部分,它用于在大量数据中搜索特定的元素。在Unix系统中,我们通常使用一种名为索引文件的数据结构来加速文件系统中的文件搜索。本文将介绍使用Go语言实现Unix系统中索引算法的学习笔记。 一、Unix系统下...
    99+
    2023-07-20
    索引 unix 学习笔记
  • Python 自然语言处理:学习笔记中打包模块的实现方法
    Python 自然语言处理是一种非常流行的技术,它可以帮助我们处理各种文本数据,如电子邮件、社交媒体帖子、新闻文章等。在Python中,我们可以使用多种库和工具来进行自然语言处理,其中最常用的是NLTK(自然语言工具包)和spaCy。在本...
    99+
    2023-11-06
    学习笔记 打包 自然语言处理
  • 自然语言处理的学习笔记:ASP和JavaScript的使用方法是什么?
    自然语言处理(Natural Language Processing,NLP)是人工智能领域中一个重要的研究领域,它关注计算机系统如何理解、处理和生成人类语言。在NLP中,语言被看作是一种符号系统,计算机需要通过各种算法和技术来分析和处理...
    99+
    2023-07-06
    javascript 学习笔记 自然语言处理
  • Go语言初学者必读!Apache服务器和数据类型学习笔记分享
    作为一名初学Go语言的程序员,学习Apache服务器和数据类型是非常重要的。本文将分享我在学习过程中的一些笔记和代码演示,希望能帮助到更多的初学者。 一、Apache服务器 Apache服务器是世界上最流行的Web服务器软件之一,它可以运...
    99+
    2023-10-20
    apache 学习笔记 数据类型
  • 如何使用Go语言处理大数据?附学习笔记和Unix命令!
    随着大数据时代的到来,数据处理已经成为了一项重要的技能。而Go语言作为一种高效且易于学习的编程语言,也逐渐成为了处理大数据的首选语言。在本文中,我们将介绍如何使用Go语言处理大数据,并提供学习笔记和Unix命令,帮助您更好地掌握这项技能。...
    99+
    2023-09-15
    大数据 学习笔记 unix
  • 学习笔记:Go语言在Unix系统下索引算法的应用
    在Unix系统下,索引算法是一种常见的数据结构。索引算法可以提高数据访问的效率,加快搜索速度。在本文中,我们将介绍如何在Go语言中使用索引算法,以及如何在Unix系统下应用它。 一、什么是索引算法? 索引算法是一种将数据结构化存储的方法,...
    99+
    2023-07-20
    索引 unix 学习笔记
  • 你需要知道的 Go 语言学习笔记和 Linux 编程算法
    Go语言是一种高效、简洁、安全、并行的编程语言,越来越受到开发者的青睐。同时,Linux编程算法也是软件工程师必备的技能之一。因此,本文将会分享一些关于Go语言和Linux编程算法的学习笔记,希望对初学者有所帮助。 一、Go语言学习笔记 ...
    99+
    2023-10-24
    学习笔记 linux 编程算法
  • 想学习大数据处理吗?这些Go语言学习笔记和Unix命令一定要掌握!
    随着数据时代的到来,大数据处理技术越来越受到各行业的重视和需求。而Go语言作为一门高效、安全、简洁的编程语言,被越来越多的人用来处理大数据。本文将介绍一些Go语言学习笔记和Unix命令,帮助你更好地学习和掌握大数据处理技术。 一、Go语言学...
    99+
    2023-09-15
    大数据 学习笔记 unix
  • R语言导入CSV数据的简单方法
    第一、查看读取路径:getwd() ``` getwd() #获取文件存储位置 [1] "E:/R/meta-rbook-examples" #文件位置,如果是自己想要的存储位...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作