欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

R語言學(xué)習(xí)筆記缺失數(shù)據(jù)的Bootstrap與Jackknife方法

 更新時(shí)間:2021年11月08日 17:17:50   作者:Kanny廣小隸  
這篇文章主要為大家介紹了R語言學(xué)習(xí)筆記關(guān)于缺失數(shù)據(jù)的Bootstrap與Jackknife的方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

一、題目

請(qǐng)?zhí)砑訄D片描述

下面再加入缺失的情況來繼續(xù)深入探討,同樣還是如習(xí)題1.6的構(gòu)造方式來加入缺失值,其中a=2, b = 0

請(qǐng)?zhí)砑訄D片描述

我們將進(jìn)行如下幾種操作:

請(qǐng)?zhí)砑訄D片描述

二、解答

a)Bootstrap與Jackknife進(jìn)行估計(jì)

首先構(gòu)建生成數(shù)據(jù)函數(shù)。

# 生成數(shù)據(jù)
# 生成數(shù)據(jù)
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的函數(shù):

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))
}

進(jìn)行重復(fù)試驗(yàn)所需的函數(shù):

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))
}

下面重復(fù)100次實(shí)驗(yàn)進(jìn)行 Y2​的均值與變異系數(shù)標(biāo)準(zhǔn)差的估計(jì):

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)))
## 變異系數(shù)
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)))

從上面可以發(fā)現(xiàn),Bootstrap與Jackknife兩者估計(jì)結(jié)果較為相近,其中對(duì)均值標(biāo)準(zhǔn)差的估計(jì),Jackknife的方差更小。這其實(shí)較為符合常識(shí):Jackknife估計(jì)每次只取出一個(gè)樣本,用剩下的樣本來作為樣本整體;而Bootstrap每次都會(huì)比較隨機(jī)地重抽樣,隨機(jī)性相對(duì)較高,所以重復(fù)100次模擬實(shí)驗(yàn),導(dǎo)致其方差相對(duì)較大。

下面我們用計(jì)算公式來進(jìn)行推導(dǎo)。

b)均值與變異系數(shù)(大樣本)的標(biāo)準(zhǔn)差解析式推導(dǎo)與計(jì)算

均值

請(qǐng)?zhí)砑訄D片描述

變異系數(shù)(大樣本近似)

## 變異系數(shù)
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)
}))

變異系數(shù)大樣本近似值為:0.03717648,說明前面的Bootstrap與Jackknife兩種方法估計(jì)的都較為準(zhǔn)確。

c)缺失插補(bǔ)后的Bootstrap與Jackknife

構(gòu)造線性填補(bǔ)的函數(shù),并進(jìn)行線性填補(bǔ)。

DatImputation <- function(dat_incomp) {
  dat_imp <- dat_incomp
  lm_model = lm(y2 ~ y1, data = na.omit(dat_incomp))
  
  # 找出y2缺失對(duì)應(yīng)的那部分data
  na_ind = is.na(dat_incomp$y2)
  na_dat = dat_incomp[na_ind, ]
  
  # 將缺失數(shù)據(jù)進(jìn)行填補(bǔ)
  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的填補(bǔ)結(jié)果,很大一部分是由于數(shù)據(jù)的缺失會(huì)造成距離真實(shí)值較遠(yuǎn)。但單從兩種方法估計(jì)出來的值比較接近。

c)缺失插補(bǔ)前的Bootstrap與Jackknife

先構(gòu)建相關(guān)的函數(shù):

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))
}

然后看看兩種方式估計(jì)出來的結(jié)果:

Bootstrap_imp(dat$dat_incomp)$sd
Jackknife_imp(dat$dat_incomp)$sd

缺失插補(bǔ)前進(jìn)行Bootstrap與Jackknife也還是有一定的誤差,標(biāo)準(zhǔn)差都相對(duì)更大,表示波動(dòng)會(huì)比較大。具體表現(xiàn)情況下面我們多次重復(fù)模擬實(shí)驗(yàn),通過90%置信區(qū)間來看各個(gè)方法的優(yōu)劣。

d)比較各種方式的90%置信區(qū)間情況(重復(fù)100次實(shí)驗(yàn))

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))
}

重復(fù)100次實(shí)驗(yàn),均值情況:

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

變異系數(shù)情況:

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

上面的數(shù)字越表示90%置信區(qū)間覆蓋真實(shí)值的個(gè)數(shù),數(shù)字越大表示覆蓋的次數(shù)越多,也就說明該方法會(huì)相對(duì)更好。

填補(bǔ)之前進(jìn)行Bootstrap或Jackknife

無論是均值還是變異系數(shù),通過模擬實(shí)驗(yàn)都能看出,在填補(bǔ)之前進(jìn)行Bootstrap或Jackknife,其估計(jì)均會(huì)遠(yuǎn)優(yōu)于在填補(bǔ)之后進(jìn)行Bootstrap或Jackknife。而具體到Bootstrap或Jackknife,這兩種方法相差無幾。

填補(bǔ)之后進(jìn)行Bootstrap或Jackknife

在填補(bǔ)之后進(jìn)行Bootstrap或Jackknife,效果都會(huì)很差,其實(shí)仔細(xì)思考后也能夠理解,本身缺失了近一半的數(shù)據(jù),然后填補(bǔ)會(huì)帶來很大的偏差,此時(shí)我們?cè)購闹谐闃樱泻艽罂赡艹槌鰜淼慕^大多數(shù)都是原本填補(bǔ)的有很大偏差的樣本,這樣估計(jì)就會(huì)更為不準(zhǔn)了。

當(dāng)然,從理論上說,填補(bǔ)之前進(jìn)行Bootstrap或Jackknife是較為合理的,這樣對(duì)每個(gè)Bootstrap或Jackknife樣本,都可以用當(dāng)前的觀測(cè)值去填補(bǔ)當(dāng)前的缺失值,這樣每次填補(bǔ)可能花費(fèi)的時(shí)間將對(duì)較長,但實(shí)際卻更有效。

以上就是R語言學(xué)習(xí)筆記缺失數(shù)據(jù)的Bootstrap與Jackknife方法的詳細(xì)內(nèi)容,更多關(guān)于R語言學(xué)習(xí)筆記的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • R語言數(shù)據(jù)類型和對(duì)象深入講解

    R語言數(shù)據(jù)類型和對(duì)象深入講解

    這篇文章主要介紹了R語言數(shù)據(jù)類型和對(duì)象深入講解,文中列舉的實(shí)例講解的很清楚,有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • R語言中cut()函數(shù)的用法說明

    R語言中cut()函數(shù)的用法說明

    這篇文章主要介紹了R語言中cut()函數(shù)的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R語言作圖:坐標(biāo)軸的設(shè)置方式

    R語言作圖:坐標(biāo)軸的設(shè)置方式

    這篇文章主要介紹了R語言作圖:坐標(biāo)軸的設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 基于R語言xlsx安裝遇到的問題及解決方案

    基于R語言xlsx安裝遇到的問題及解決方案

    這篇文章主要介紹了基于R語言xlsx安裝遇到的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R語言導(dǎo)入CSV數(shù)據(jù)的簡單方法

    R語言導(dǎo)入CSV數(shù)據(jù)的簡單方法

    這篇文章主要介紹了R語言導(dǎo)入CSV數(shù)據(jù)的簡單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • R語言Legend函數(shù)深入詳解

    R語言Legend函數(shù)深入詳解

    這篇文章主要介紹了R語言Legend函數(shù)深入詳解,圖文介紹的很詳細(xì),有感興趣的同學(xué)可以研究下
    2021-03-03
  • R語言 ggplot2改變柱狀圖的順序操作

    R語言 ggplot2改變柱狀圖的順序操作

    這篇文章主要介紹了R語言 ggplot2改變柱狀圖的順序操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R語言多元線性回歸實(shí)例詳解

    R語言多元線性回歸實(shí)例詳解

    對(duì)比一元線性回歸,多元線性回歸是用來確定2個(gè)或2個(gè)以上變量間關(guān)系的統(tǒng)計(jì)分析方法,下面這篇文章主要給大家介紹了關(guān)于R語言多元線性回歸的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • R語言實(shí)現(xiàn)ggplot重繪天貓雙十一銷售額曲線圖過程

    R語言實(shí)現(xiàn)ggplot重繪天貓雙十一銷售額曲線圖過程

    這篇文章主要為大家介紹了如何使用ggplot繪制天貓雙十一銷售額曲線圖的實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • R語言學(xué)習(xí)之火山圖的繪制詳解

    R語言學(xué)習(xí)之火山圖的繪制詳解

    火山圖作為散點(diǎn)圖的一種,將統(tǒng)計(jì)測(cè)試中的統(tǒng)計(jì)顯著性量度和變化幅度相結(jié)合,從而能夠幫助快速直觀地識(shí)別那些變化幅度較大且具有統(tǒng)計(jì)學(xué)意義的數(shù)據(jù)點(diǎn)。本文將為大家詳細(xì)介紹如何利用R語言繪制火山圖,需要的可以參考一下
    2022-03-03

最新評(píng)論