Stark verzerrte Verteilungen wie die Protokollnormale führen nicht zu genauen Bootstrap-Konfidenzintervallen. Hier ist ein Beispiel, das zeigt, dass der linke und der rechte Heckbereich weit vom idealen Wert von 0,025 entfernt sind, unabhängig davon, welche Bootstrap-Methode Sie in R versuchen:
require(boot)
n <- 25
B <- 1000
nsim <- 1000
set.seed(1)
which <- c('basic', 'perc', 'norm', 'bca', 'stud')
mul <- 0; sdl <- 1.65 # on log scale
dist <- c('normal', 'lognormal')[2]
switch(dist, normal = {g <- function(x) x; mu <- mul},
lognormal = {g <- exp; mu <- exp(mul + sdl * sdl / 2)})
count <- matrix(0, nrow=length(which), ncol=2,
dimnames=list(which, c('lower', 'upper')))
stat <- function(x, j) {
## See http://www.psychology.mcmaster.ca/bennett/boot09/percentileT.pdf
x <- x[j]
m <- mean(x)
s <- sd(x)
n <- length(x)
sem <- s / sqrt(n)
m.var <- sem ^ 2
c(m, m.var)
}
for(i in 1 : nsim) {
if(i %% 100 == 0) cat(i, '')
x <- g(rnorm(n, mul, sdl))
b <- boot(x, stat, R=B)
ci <- boot.ci(b, type=which)
for(w in which) {
nam <- switch(w, perc='percent', norm='normal', basic='basic',
stud='student', bca='bca')
z <- rev(rev(ci[[nam]])[1:2])
count[w, 'lower'] <- count[w, 'lower'] + (z[1] > mu)
count[w, 'upper'] <- count[w, 'upper'] + (z[2] < mu)
}
}
cat('\n')
count / nsim
Das Ergebnis ist unten:
lower upper
basic 0.000 0.329
perc 0.003 0.257
norm 0.000 0.287
bca 0.015 0.185
stud 0.005 0.129
Für bieten einzelne Bootstraps immer noch keine ausreichend genaue Abdeckung:
lower upper
basic 0.001 0.114
perc 0.005 0.093
norm 0.002 0.102
bca 0.017 0.067
stud 0.011 0.058
Die empirische Wahrscheinlichkeit liefert auch keine genauen Konfidenzintervalle, wenn Proben aus der logarithmischen Normalverteilung entnommen werden.
Gibt es einen allgemeinen Ansatz, der nicht davon abhängt, die Verteilung im Voraus zu kennen? Hat jemand versucht, Konfidenzintervalle für den Mittelwert durch Anpassen der Daten an das verallgemeinerte Tukey- Verteilung von (diese Verteilung ist sehr flexibel)? Was ist mit der Verwendung von Kolmogorov-Smirnov-Konfidenzbändern für die CDF? Wäre es schrecklich konservativ, den Mittelwert für die obere und untere Grenze der CDF zu berechnen? Ich würde mich mit etwas Konservativismus zufrieden geben, wenn eine Methode eine breite Anwendbarkeit hat.
Um die Ziele noch einmal zu formulieren, suche ich einen allgemein anwendbaren Ansatz, um ein Konfidenzintervall für ein Bevölkerungsmittel zu erhalten, bei dem
- Das Intervall ist asymmetrisch, wenn die Rohdatenverteilung asymmetrisch ist
- Das Intervall hat in beiden Fällen die richtige Abdeckung Schwänze (z. B. 0,025 Fehlerwahrscheinlichkeit in beiden).
- Das Verfahren erfordert nicht, dass der Analyst etwas über die zugrunde liegende Verteilung oder die Transformation angibt, die erforderlich ist, um die Verteilung symmetrisch zu machen
Wenn ich weiter darüber nachdenke, gibt es zwei Möglichkeiten, das Problem zu konzipieren, über das ich sprechen möchte.
- Auch wenn kein einzelner Bootstrap hinreichend genaue Konfidenzgrenzen für Stichproben aus extrem verzerrten Verteilungen liefert, kann der doppelte Bootstrap die Konfidenzabdeckung in beiden Schwänzen erheblich verbessern. Nankervis hat einige gute Ergebnisse und liefert einen hervorragenden Rechenalgorithmus. Aber keine Software, die ich finden konnte, implementiert dies.
R-Code zur Veranschaulichung von 1. oben:
## Exact CI for median from DescTools package SignTest.default
## See also ttp://www.stat.umn.edu/geyer/old03/5102/notes/rank.pdf,
## http://de.scribd.com/doc/75941305/Confidence-Interval-for-Median-Based-on-Sign-Test
cimed <- function(x, alpha=0.05, na.rm=FALSE) {
if(na.rm) x <- x[! is.na(x)]
n <- length(x)
k <- qbinom(p=alpha / 2, size=n, prob=0.5, lower.tail=TRUE)
## Actual CL: 1 - 2 * pbinom(k - 1, size=n, prob=0.5) >= 1 - alpha
sort(x)[c(k, n - k + 1)]
}
n <- 20
m <- 20000
cil <- cilt <- 0
z <- qt(0.975, n - 1)
for(i in 1 : m) {
x <- rnorm(n)
cil <- cil + diff(cimed(x))
cilt <- cilt + 2 * z * sqrt(var(x) / n)
}
cil <- cil / m
cilt <- cilt / m
c(cil, cilt, cilt / cil, cil / cilt)