Implementiramo delete-d jackknife

dd_jack <- function(x, h, d) {
  n <- ifelse(is.vector(x), length(x), nrow(x))
  r <- n - d
  N <- choose(n, d)
  
  leave_d_out <- apply(combn(1:n, d), 2, function(s){
    h(subset(x, !(1:n %in% s)))
  })
  
  r/d*(N-1)*var(leave_d_out)/N
}

i paralelnu verziju da bude koliko toliko brze

pardd_jack <- function(x, h, d) {
  library(parallel)
  cl <- makeCluster(detectCores(), type = "FORK")
  
  n <- ifelse(is.vector(x), length(x), nrow(x))
  r <- n - d
  N <- choose(n, d)
  
  leave_d_out <- parApply(cl, combn(1:n, d), 2, function(s){
    h(subset(x, !(1:n %in% s)))
  })
  
  ret <- r/d*(N-1)*var(leave_d_out)/N
  stopCluster(cl)
  ret
}

Testiramo da je delete-1 jednak obicnom…

x <- rnorm(20)
dd_jack(x, mean, 1)
V_jack(x, mean)

Odlicno!

Implementirajmo prosto slucajno uzorkovanje za ubrzanje dd jackknife ocena

srs_dd_jack <- function(x, h, d, m) {
  n <- ifelse(is.vector(x), length(x), nrow(x))
  r <- n - d
  # each column is a sample of size r, there are m columns
  samples <- replicate(m, sample(x, r))
  h_values <- apply(samples, 2, h)
  r/d*(m-1)/m*var(h_values)
}
x <- rnorm(20)
pardd_jack(x, mean, 2)
srs_dd_jack(x, mean, 2, 50)

Dobra je aproksimacija.

Pogledajmo kako se menja greska aproksimacije ddjack za ocenu ocekivanja i disperzije normalne raspodele, za uzorak obima 20, vrednosti za d = 3 i vrednosti m iz skupa {10, 20, 30, 50, 70, 90, 120, 160, 200, 275, 400}

mvals <- c(10, 20, 30, 50, 70, 90, 120, 160, 200, 275, 400)
set.seed(825)
x <- rnorm(20)
ddj_m <- pardd_jack(x, mean, 3)
approx_m <- replicate(1000, sapply(mvals, srs_dd_jack, x = x, h = mean, d = 3))
approx_m <- rowMeans(approx_m)

ddj_v <- pardd_jack(x, var, 3)
approx_v <- replicate(1000, sapply(mvals, srs_dd_jack, x = x, h = var, d = 3))
approx_v <- rowMeans(approx_v)
library(latex2exp)
ddj_m
mm <- rbind(as.integer(mvals),
            approx_m,
            abs(approx_m - ddj_m)*10^3,
            abs(approx_m - ddj_m) / ddj_m)

plot(mvals, abs(approx_m - ddj_m)/ddj_m, xaxt = "n", type = "l",
     xlab = "vrednosti m", ylab = "relativna greška")
axis(side = 1, at = mvals, labels = mvals)

ddj_v

vv <- rbind(as.integer(mvals),
            approx_v,
            abs(approx_v - ddj_v)*10^3,
            abs(approx_v - ddj_v) / ddj_v)

plot(mvals, abs(approx_v - ddj_v)/ddj_v, xaxt = "n", type = "l",
     xlab = "vrednosti m", ylab = "relativna greška")
axis(side = 1, at = mvals, labels = mvals)

res <- rbind(mm, vv)
xtable::xtable(res, digits = 3)

Uporedimo klasican primer medijane

set.seed(406)
n <- 100
N <- 1000
library(parallel)
cl <- makeCluster(detectCores(), type = "FORK")
normal <- matrix(rnorm(n*N), nrow = N)
estimates <- list(med=median)
norm_results <- sapply(estimates, function(f) {
  res <- parApply(cl, normal, 1, function(X){
    est <- f(X)
    d1 <- dd_jack(X, f, 1)
    d2 <- dd_jack(X, f, 2)
    d3 <- srs_dd_jack(X, f, 3, 10000)
    d25 <- srs_dd_jack(X, f, 25, 10000)
    d50 <- srs_dd_jack(X, f, 50, 10000)
    c(est = est, d1 = d1, d2 = d2, d3 = d3, d25 = d25, d50 = d50)
  })
  c(est = mean(res['est',]),
    var = var(res['est',]),
    d1 = mean(res['d1',]),
    d2 = mean(res['d2',]),
    d3 = mean(res['d3',]),
    d25 = mean(res['d25',]),
    d50 = mean(res['d50',]))
})
stopCluster(cl)
round(norm_results, digits = 3)
      med
est 0.003
var 0.015
d1  0.031
d2  0.023
d3  0.026
d25 0.018
d50 0.016
LS0tCnRpdGxlOiAiRGlsaXQtZCBEemVrbmFqZiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKSW1wbGVtZW50aXJhbW8gZGVsZXRlLWQgamFja2tuaWZlCgpgYGB7cn0KZGRfamFjayA8LSBmdW5jdGlvbih4LCBoLCBkKSB7CiAgbiA8LSBpZmVsc2UoaXMudmVjdG9yKHgpLCBsZW5ndGgoeCksIG5yb3coeCkpCiAgciA8LSBuIC0gZAogIE4gPC0gY2hvb3NlKG4sIGQpCiAgCiAgbGVhdmVfZF9vdXQgPC0gYXBwbHkoY29tYm4oMTpuLCBkKSwgMiwgZnVuY3Rpb24ocyl7CiAgICBoKHN1YnNldCh4LCAhKDE6biAlaW4lIHMpKSkKICB9KQogIAogIHIvZCooTi0xKSp2YXIobGVhdmVfZF9vdXQpL04KfQpgYGAKCmkgcGFyYWxlbG51IHZlcnppanUgZGEgYnVkZSBrb2xpa28gdG9saWtvIGJyemUKCmBgYHtyfQpwYXJkZF9qYWNrIDwtIGZ1bmN0aW9uKHgsIGgsIGQpIHsKICBsaWJyYXJ5KHBhcmFsbGVsKQogIGNsIDwtIG1ha2VDbHVzdGVyKGRldGVjdENvcmVzKCksIHR5cGUgPSAiRk9SSyIpCiAgCiAgbiA8LSBpZmVsc2UoaXMudmVjdG9yKHgpLCBsZW5ndGgoeCksIG5yb3coeCkpCiAgciA8LSBuIC0gZAogIE4gPC0gY2hvb3NlKG4sIGQpCiAgCiAgbGVhdmVfZF9vdXQgPC0gcGFyQXBwbHkoY2wsIGNvbWJuKDE6biwgZCksIDIsIGZ1bmN0aW9uKHMpewogICAgaChzdWJzZXQoeCwgISgxOm4gJWluJSBzKSkpCiAgfSkKICAKICByZXQgPC0gci9kKihOLTEpKnZhcihsZWF2ZV9kX291dCkvTgogIHN0b3BDbHVzdGVyKGNsKQogIHJldAp9CmBgYAoKVGVzdGlyYW1vIGRhIGplIGRlbGV0ZS0xIGplZG5hayBvYmljbm9tLi4uCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpwc2V1ZG9famFjayA8LSBmdW5jdGlvbih4LCBoKSB7CiAgbiA8LSBpZmVsc2UoaXMudmVjdG9yKHgpLCBsZW5ndGgoeCksIG5yb3coeCkpCiAgCiAgbGVhdmVfb25lX291dCA8LSBzYXBwbHkoMTpuLCBmdW5jdGlvbihpKSBoKHN1YnNldCh4LCAxOm4gIT0gaSkpKQogIHBzZXVkb192YWx1ZXMgPC0gbipoKHgpIC0gKG4tMSkqbGVhdmVfb25lX291dAogIHBzZXVkb192YWx1ZXMKfQpWX2phY2sgPC0gZnVuY3Rpb24oeCwgaCkgewogIHBqIDwtIHBzZXVkb19qYWNrKHgsIGgpCiAgdmFyKHBqKSAvIGxlbmd0aChwaikKfQpgYGAKYGBge3J9CnggPC0gcm5vcm0oMjApCmRkX2phY2soeCwgbWVhbiwgMSkKVl9qYWNrKHgsIG1lYW4pCmBgYApPZGxpY25vIQoKCkltcGxlbWVudGlyYWptbyBwcm9zdG8gc2x1Y2Fqbm8gdXpvcmtvdmFuamUgemEgdWJyemFuamUgZGQgamFja2tuaWZlIG9jZW5hCmBgYHtyfQpzcnNfZGRfamFjayA8LSBmdW5jdGlvbih4LCBoLCBkLCBtKSB7CiAgbiA8LSBpZmVsc2UoaXMudmVjdG9yKHgpLCBsZW5ndGgoeCksIG5yb3coeCkpCiAgciA8LSBuIC0gZAogICMgZWFjaCBjb2x1bW4gaXMgYSBzYW1wbGUgb2Ygc2l6ZSByLCB0aGVyZSBhcmUgbSBjb2x1bW5zCiAgc2FtcGxlcyA8LSByZXBsaWNhdGUobSwgc2FtcGxlKHgsIHIpKQoKICBoX3ZhbHVlcyA8LSBhcHBseShzYW1wbGVzLCAyLCBoKQoKICByL2QqKG0tMSkvbSp2YXIoaF92YWx1ZXMpCn0KYGBgCmBgYHtyfQp4IDwtIHJub3JtKDIwKQpwYXJkZF9qYWNrKHgsIG1lYW4sIDIpCnNyc19kZF9qYWNrKHgsIG1lYW4sIDIsIDUwKQpgYGAKRG9icmEgamUgYXByb2tzaW1hY2lqYS4KClBvZ2xlZGFqbW8ga2FrbyBzZSBtZW5qYSBncmVza2EgYXByb2tzaW1hY2lqZSBkZGphY2sgemEgb2NlbnUgb2Nla2l2YW5qYSBpIGRpc3BlcnppamUgbm9ybWFsbmUgcmFzcG9kZWxlLCB6YSB1em9yYWsgb2JpbWEgMjAsIHZyZWRub3N0aSB6YSBkID0gMyBpIHZyZWRub3N0aSBtIGl6IHNrdXBhIHsxMCwgMjAsIDMwLCA1MCwgNzAsIDkwLCAxMjAsIDE2MCwgMjAwLCAyNzUsIDQwMH0KCmBgYHtyfQptdmFscyA8LSBjKDEwLCAyMCwgMzAsIDUwLCA3MCwgOTAsIDEyMCwgMTYwLCAyMDAsIDI3NSwgNDAwKQpzZXQuc2VlZCg4MjUpCnggPC0gcm5vcm0oMjApCmRkal9tIDwtIHBhcmRkX2phY2soeCwgbWVhbiwgMykKYXBwcm94X20gPC0gcmVwbGljYXRlKDEwMDAsIHNhcHBseShtdmFscywgc3JzX2RkX2phY2ssIHggPSB4LCBoID0gbWVhbiwgZCA9IDMpKQphcHByb3hfbSA8LSByb3dNZWFucyhhcHByb3hfbSkKCmRkal92IDwtIHBhcmRkX2phY2soeCwgdmFyLCAzKQphcHByb3hfdiA8LSByZXBsaWNhdGUoMTAwMCwgc2FwcGx5KG12YWxzLCBzcnNfZGRfamFjaywgeCA9IHgsIGggPSB2YXIsIGQgPSAzKSkKYXBwcm94X3YgPC0gcm93TWVhbnMoYXBwcm94X3YpCmBgYApgYGB7cn0KbGlicmFyeShsYXRleDJleHApCmRkal9tCm1tIDwtIHJiaW5kKGFzLmludGVnZXIobXZhbHMpLAogICAgICAgICAgICBhcHByb3hfbSwKICAgICAgICAgICAgYWJzKGFwcHJveF9tIC0gZGRqX20pKjEwXjMsCiAgICAgICAgICAgIGFicyhhcHByb3hfbSAtIGRkal9tKSAvIGRkal9tKQoKcGxvdChtdmFscywgYWJzKGFwcHJveF9tIC0gZGRqX20pL2Rkal9tLCB4YXh0ID0gIm4iLCB0eXBlID0gImwiLAogICAgIHhsYWIgPSAidnJlZG5vc3RpIG0iLCB5bGFiID0gInJlbGF0aXZuYSBncmXFoWthIikKYXhpcyhzaWRlID0gMSwgYXQgPSBtdmFscywgbGFiZWxzID0gbXZhbHMpCgpkZGpfdgoKdnYgPC0gcmJpbmQoYXMuaW50ZWdlcihtdmFscyksCiAgICAgICAgICAgIGFwcHJveF92LAogICAgICAgICAgICBhYnMoYXBwcm94X3YgLSBkZGpfdikqMTBeMywKICAgICAgICAgICAgYWJzKGFwcHJveF92IC0gZGRqX3YpIC8gZGRqX3YpCgpwbG90KG12YWxzLCBhYnMoYXBwcm94X3YgLSBkZGpfdikvZGRqX3YsIHhheHQgPSAibiIsIHR5cGUgPSAibCIsCiAgICAgeGxhYiA9ICJ2cmVkbm9zdGkgbSIsIHlsYWIgPSAicmVsYXRpdm5hIGdyZcWha2EiKQpheGlzKHNpZGUgPSAxLCBhdCA9IG12YWxzLCBsYWJlbHMgPSBtdmFscykKCnJlcyA8LSByYmluZChtbSwgdnYpCnh0YWJsZTo6eHRhYmxlKHJlcywgZGlnaXRzID0gMykKYGBgCgoKClVwb3JlZGltbyBrbGFzaWNhbiBwcmltZXIgbWVkaWphbmUKCmBgYHtyfQpzZXQuc2VlZCg0MDYpCm4gPC0gMTAwCk4gPC0gMTAwMAoKbGlicmFyeShwYXJhbGxlbCkKY2wgPC0gbWFrZUNsdXN0ZXIoZGV0ZWN0Q29yZXMoKSwgdHlwZSA9ICJGT1JLIikKCm5vcm1hbCA8LSBtYXRyaXgocm5vcm0obipOKSwgbnJvdyA9IE4pCmVzdGltYXRlcyA8LSBsaXN0KG1lZD1tZWRpYW4pCm5vcm1fcmVzdWx0cyA8LSBzYXBwbHkoZXN0aW1hdGVzLCBmdW5jdGlvbihmKSB7CiAgcmVzIDwtIHBhckFwcGx5KGNsLCBub3JtYWwsIDEsIGZ1bmN0aW9uKFgpewogICAgZXN0IDwtIGYoWCkKICAgIGQxIDwtIGRkX2phY2soWCwgZiwgMSkKICAgIGQyIDwtIGRkX2phY2soWCwgZiwgMikKICAgIGQzIDwtIHNyc19kZF9qYWNrKFgsIGYsIDMsIDEwMDAwKQogICAgZDI1IDwtIHNyc19kZF9qYWNrKFgsIGYsIDI1LCAxMDAwMCkKICAgIGQ1MCA8LSBzcnNfZGRfamFjayhYLCBmLCA1MCwgMTAwMDApCiAgICBjKGVzdCA9IGVzdCwgZDEgPSBkMSwgZDIgPSBkMiwgZDMgPSBkMywgZDI1ID0gZDI1LCBkNTAgPSBkNTApCiAgfSkKICBjKGVzdCA9IG1lYW4ocmVzWydlc3QnLF0pLAogICAgdmFyID0gdmFyKHJlc1snZXN0JyxdKSwKICAgIGQxID0gbWVhbihyZXNbJ2QxJyxdKSwKICAgIGQyID0gbWVhbihyZXNbJ2QyJyxdKSwKICAgIGQzID0gbWVhbihyZXNbJ2QzJyxdKSwKICAgIGQyNSA9IG1lYW4ocmVzWydkMjUnLF0pLAogICAgZDUwID0gbWVhbihyZXNbJ2Q1MCcsXSkpCn0pCnN0b3BDbHVzdGVyKGNsKQpgYGAKYGBge3J9CnJvdW5kKG5vcm1fcmVzdWx0cywgZGlnaXRzID0gMykKYGBgCgo=