Implementiramo funkciju koja racuna Dzeknajf pseudovrednosti. Prosledjujemo joj vektor podataka i funkciju koja racuna ocenu na osnovu podataka.
pseudo_jack <- function(x, h) {
if (is.vector(x)) {
n <- length(x)
} else {
n <- nrow(x)
}
leave_one_out <- sapply(1:n, function(i) h(subset(x, 1:n != i)))
pseudo_values <- n*h(x) - (n-1)*leave_one_out
pseudo_values
}
Kada imamo pseudo vrednosti, lako racunamo sve sto nam je potrebno za Dzeknajf.
Dzeknajf ocenu funkcionala h, ocenu pristrasnosti ocene \(\hat h\) i ocenu disperzije ocene \(\hat h\) racunamo sa:
h_jack <- function(x, h) mean(pseudo_jack(x, h))
b_jack <- function(x, h) h(x) - h_jack(x, h)
V_jack <- function(x, h) {
pj <- pseudo_jack(x, h)
var(pj) / length(pj)
}
Generisimo podatke iz rada Efron-a i Stein-a o LSAT rezultatima u americi.
X_efron <- data.frame(LSAT = c(576, 635, 558, 578, 666, 580, 555, 661, 651, 605, 653, 575, 545, 572, 594),
GPA = c(3.39, 3.30, 2.81, 3.03, 3.44, 3.07, 3.00, 3.43, 3.36, 3.13, 3.12, 2.74, 2.76, 2.88, 2.96))
\(S\) ce biti uzoracka korelacija izmedju LSAT i GPA i izracunacemo ocene kvaliteta te ocene.
S <- function(X) cor(X$LSAT, X$GPA)
cat("S = ", S(X_efron), '\n',
"h_jack = ", h_jack(X_efron, S), '\n',
"b_jack = ", b_jack(X_efron, S), '\n',
"V_jack = ", V_jack(X_efron, S),
sep = "")
S = 0.7763745
h_jack = 0.7828481
b_jack = -0.006473623
V_jack = 0.02031156
Efron i Stein u svom radu dokazuju da je ocena V_jack pozitivno pristrasna i daju mogucu korekciju te pristrasnosti, koju cemo implementirati.
V_jack_corr <- function(x, h, vjack = NULL) {
if (is.vector(x)) {
n <- length(x)
} else {
n <- nrow(x)
}
if (is.null(vjack))
vjack <- V_jack(x, h)
Qii <- apply(combn(1:n, 2), 2, function(ij) {
n*h(x) - (n-1)*(h(subset(x, 1:n != ij[1])) + h(subset(x, 1:n != ij[2]))) +
(n-2)*(h(subset(x, !(1:n %in% ij))))
})
vjack - ((n*(n-1)/2 - 1) / (n*(n+1)))*var(Qii)
}
Korigovana ocena disperzije ocene S je
cat("V_jack_corr = ", V_jack_corr(X_efron, S), sep = "")
V_jack_corr = 0.01818288
Testirajmo rezultate za neki vestacki uzorak za koji znamo raspodelu
set.seed(825)
n <- 50
X <- rnorm(n)
cat("Var = ", var(X), '\n',
"h_jack = ", h_jack(X, var), '\n',
"b_jack = ", b_jack(X, var), '\n',
"var(var) = ", 2/(n-1), '\n',
"V_jack = ", V_jack(X, var), '\n',
"V_jack_corr = ", V_jack_corr(X, var),
sep = "")
Var = 1.029494
h_jack = 1.029494
b_jack = 1.332268e-15
var(var) = 0.04081633
V_jack = 0.05423948
V_jack_corr = 0.0533997
Formiramo listu ocena za koje cemo porediti disperzije i dzeknajf ocene istih
estimates <- list(mean = mean, var = var, inv_mean = function(x) 1/mean(x), cv = function(x) sd(x)/mean(x))
Izracunamo ocene, prave disperzije i dzeknajf ocene tih disperzija za normalnu, eksponencijalnu i geometrijsku raspodelu.
n <- 50
N <- 1000
set.seed(406)
normal <- rnorm(n, 1)
norm_results <- sapply(estimates, function(f)
c(est = f(normal),
var = var(replicate(N, f(rnorm(n, 1)))),
V_jack = V_jack(normal, f))
)
set.seed(406)
exponential <- rexp(n)
exp_results <- sapply(estimates, function(f)
c(est = f(exponential),
var = var(replicate(N, f(rexp(n)))),
V_jack = V_jack(exponential, f))
)
set.seed(406)
geometric <- rgeom(n, 0.5)
geom_results <- sapply(estimates, function(f)
c(est = f(geometric),
var = var(replicate(N, f(rgeom(n, 0.5)))),
V_jack = V_jack(geometric, f))
)
i prikazemo rezultate:
results <- round(t(cbind(norm_results, exp_results, geom_results)), 3)
rownames(results) <- c("N(1,1) mean",
"N(1,1) var",
"N(1,1) 1/mean",
"N(1,1) sd/mean",
"Exp(1) mean",
"Exp(1) var",
"Exp(1) 1/mean",
"Exp(1) sd/mean",
"Geom(0.5) mean",
"Geom(0.5) var",
"Geom(0.5) 1/mean",
"Geom(0.5) sd/mean")
colnames(results) <- c("estimate", "true variance", "jackknife variance")
results
estimate true variance jackknife variance
N(1,1) mean 0.927 0.018 0.030
N(1,1) var 1.504 0.038 0.059
N(1,1) 1/mean 1.078 0.022 0.041
N(1,1) sd/mean 1.322 0.036 0.064
Exp(1) mean 1.117 0.020 0.025
Exp(1) var 1.271 0.160 0.089
Exp(1) 1/mean 0.895 0.020 0.017
Exp(1) sd/mean 1.009 0.018 0.009
Geom(0.5) mean 0.900 0.039 0.040
Geom(0.5) var 2.010 0.699 0.419
Geom(0.5) 1/mean 1.111 0.049 0.069
Geom(0.5) sd/mean 1.575 0.041 0.046
Generisacemo uzorak od 10 hiljada dzeknajf ocena disperzije za popravljenu uzoracku disperziju nad uzorkom obima 50 iz standardne normalne raspodele i analizirati raspodelu dzeknajf ocene.
set.seed(13)
# generisemo uzorak
jack_smp <- replicate(10000, V_jack(rnorm(n, 1), var))
Teorijska disperzija ocene je 2/49 = 0.0408 Mi dobijamo
mean(jack_smp)
[1] 0.04178114
sto je vece od teorijske, sto i teorijski rezultati o dzeknajf oceni pokazuju. Ali pogledajmo ocenu gustine ovog uzorka:
plot(density(jack_smp))
abline(v = 2/49, col = "green")
abline(v = mean(jack_smp), col = "red")
Vidimo da je ova raspodela asimetricna, sa zelenom vertikalnom linijom smo oznacili teorijsku disperziju, a sa crvenom ocekivanje \(\hat V_{jack}\) ocene. Uporedimo verovatnoce da dobijemo vrednosti manju od teorijske disperzije sa onim da dobijemo vece vrednosti od teorijske disperzije.
mean(jack_smp < 2/49)
[1] 0.5809
mean(jack_smp >= 2/49)
[1] 0.4191
Veca je verovatnoca da dobijemo ocenu disperzije koja je manja od stvarne disperzije, iako je ocekivanje ocene disperzije vece od stvarne.
Stoga se ne mozemo previse osloniti da nam Dzeknajf daje ocene koje premasuju teorijsku vrednost.