iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >R语言怎么使用缺失数据的Bootstrap与Jackknife方法
  • 189
分享到

R语言怎么使用缺失数据的Bootstrap与Jackknife方法

2023-06-25 14:06:11 189人浏览 八月长安
摘要

本篇内容介绍了“R语言怎么使用缺失数据的Bootstrap与Jackknife方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、题目下面

本篇内容介绍了“R语言怎么使用缺失数据的Bootstrap与Jackknife方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、题目

R语言怎么使用缺失数据的Bootstrap与Jackknife方法

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

R语言怎么使用缺失数据的Bootstrap与Jackknife方法

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

R语言怎么使用缺失数据的Bootstrap与Jackknife方法

二、解答

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 = meanmat_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)均值与变异系数(大样本)的标准差解析式推导与计算

均值

R语言怎么使用缺失数据的Bootstrap与Jackknife方法

变异系数(大样本近似)

## 变异系数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 = meanBootstrap1(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 <- 100result_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方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: R语言怎么使用缺失数据的Bootstrap与Jackknife方法

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • R语言怎么使用缺失数据的Bootstrap与Jackknife方法
    本篇内容介绍了“R语言怎么使用缺失数据的Bootstrap与Jackknife方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、题目下面...
    99+
    2023-06-25
  • R语言学习笔记缺失数据的Bootstrap与Jackknife方法
    目录一、题目二、解答a)Bootstrap与Jackknife进行估计b)均值与变异系数(大样本)的标准差解析式推导与计算c)缺失插补前的Bootstrap与Jackknifed)比...
    99+
    2024-04-02
  • 使用R语言填补缺失值的方法
    使用R语言填补缺失值 数据处理过程中,往往会存在缺失值,对于缺失值的处理,目前各大统计书提出的方法有剔除,用均数填补,用众数填补,采用其他自变量进行回归,推算缺失值进行填补等。在R语...
    99+
    2024-04-02
  • r语言填充缺失值的方法是什么
    在R语言中,可以使用以下方法填充缺失值:1. 使用均值、中位数或众数填充:可以通过计算非缺失值的平均值、中位数或众数,然后用该值来填...
    99+
    2023-09-11
    r语言
  • r语言怎么在数组中查找缺失值
    在R语言中,可以使用is.na()函数来查找数组中的缺失值。例如,假设有一个包含缺失值的数组a,可以使用以下代码来查找缺失值: a ...
    99+
    2024-03-06
    r语言
  • 使用AndroidStudio出现R文件缺失的解决方法
    使用AndroidStudio出现R文件缺失的解决方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天Android Studio提示我这个东东。。。为了加快...
    99+
    2023-05-31
    android studio roi
  • 使用R语言怎么删除指定的数据
    本篇文章为大家展示了使用R语言怎么删除指定的数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。数据准备> Data  英雄 职业 熟练等级&n...
    99+
    2023-06-08
  • R语言列筛选的方法select怎么使用
    这篇文章主要介绍了R语言列筛选的方法select怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇R语言列筛选的方法select怎么使用文章都会有所收获,下面我们一起来看看吧。1. 数据描述数据来源是我编写...
    99+
    2023-07-02
  • R语言列表和数据框怎么使用
    本篇内容主要讲解“R语言列表和数据框怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“R语言列表和数据框怎么使用”吧!1.列表列表“list”是一种比较的特别的对象集合,不同的序号对于不同的...
    99+
    2023-06-26
  • 怎么在R语言中使用筛选数据
    这期内容当中小编将会给大家带来有关怎么在R语言中使用筛选数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放...
    99+
    2023-06-14
  • R语言中怎么使用SQL语句读取数据库数据
    在R语言中使用SQL语句读取数据库数据,一般可以通过以下步骤实现: 首先,需要安装并加载适当的R包来连接数据库。常用的包包括DB...
    99+
    2024-04-24
    r语言 数据库
  • R语言seq()函数的调用方法
    看到有很多读者浏览了这篇文章,心里很是开心,为了能够更好地帮助大家,决定再修改一下,帮助大家更好地理解。 --------修改于:2018年4月28日 为了方便大家在开发环境中直接实...
    99+
    2024-04-02
  • r语言colnames函数怎么使用
    在R语言中,colnames()函数用于获取或设置数据框或矩阵的列名。下面是colnames()函数的使用方法: 获取列名:使用c...
    99+
    2023-10-23
    r语言
  • Go语言中的函数与方法怎么使用
    这篇文章主要介绍了Go语言中的函数与方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的函数与方法怎么使用文章都会有所收获,下面我们一起来看看吧。函数定义语法与大部分语言一致,Go语言中的函数...
    99+
    2023-07-02
  • R语言怎么使用cgdsr包获取TCGA数据
    本篇内容主要讲解“R语言怎么使用cgdsr包获取TCGA数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“R语言怎么使用cgdsr包获取TCGA数据”吧!TCGA数据源众所周知,TCGA数据库是...
    99+
    2023-07-02
  • R语言导入CSV数据的简单方法
    第一、查看读取路径:getwd() ``` getwd() #获取文件存储位置 [1] "E:/R/meta-rbook-examples" #文件位置,如果是自己想要的存储位...
    99+
    2024-04-02
  • R语言空间数据分析的方法是什么
    R语言可以使用许多方法来进行空间数据分析,包括但不限于: 空间数据可视化:R中提供了许多绘图包,如ggplot2、leaflet...
    99+
    2024-04-30
    R语言
  • r语言数据分析的实现方法是什么
    R语言是一种功能强大的编程语言和环境,特别适用于数据分析。以下是R语言实现数据分析的一般方法:1. 数据导入:使用R语言中的函数从各...
    99+
    2023-09-15
    r语言
  • R语言中的merge函数怎么使用
    在R语言中,merge函数用于合并两个数据框(data frame)。该函数的一般用法如下: merged_df <- mer...
    99+
    2024-03-04
    R语言
  • r语言中的filter函数怎么使用
    在R语言中,`filter()`函数是`dplyr`包中的函数,用于筛选数据框中满足指定条件的行。`filter()`函数接受一个数...
    99+
    2023-09-04
    r语言 filter
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作