Bardzo wypaczone rozkłady, takie jak log-normal, nie dają dokładnych przedziałów ufności ładowania. Oto przykład pokazujący, że lewy i prawy obszar ogona są dalekie od idealnego 0,025 bez względu na to, jaką metodę ładowania początkowego wypróbujesz w R:
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
Wynik jest poniżej:
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
Dla pojedyncze programy ładujące nadal nie zapewniają odpowiednio dokładnego zasięgu:
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
Prawdopodobieństwo empiryczne również nie zapewnia dokładnych przedziałów ufności podczas próbkowania z rozkładu logarytmicznego.
Czy istnieje ogólne podejście, które nie zależy od wcześniejszej znajomości dystrybucji? Czy ktoś próbował uzyskać przedziały ufności dla średniej, dopasowując dane do uogólnionego rozkładu Tukey (ten rozkład jest bardzo elastyczny)? Co z wykorzystaniem pasm ufności Kołmogorowa-Smirnowa dla CDF? Czy obliczenie średniej w górnej i dolnej granicy CDF byłoby strasznie konserwatywne? Zadowoliłbym się pewnym konserwatyzmem, gdyby metoda miała szerokie zastosowanie.
Aby powtórzyć cele, szukam ogólnie stosowalnego podejścia do uzyskania przedziału ufności dla populacji oznacza, że
- przedział jest asymetryczny, jeśli rozkład surowych danych jest asymetryczny
- przedział ma prawidłowe pokrycie w obu ogonach (np. prawdopodobieństwo błędu 0,025 w obu)
- procedura nie wymaga od analityka określenia niczego na temat rozkładu bazowego lub transformacji potrzebnej do uzyskania symetryczności rozkładu
Zauważ, że centralne twierdzenie o granicy nie ma tu znaczenia; Mam ustaloną małą wielkość próby, a przedział ufności musi być asymetryczny, aby był dokładny w obu ogonach. Parametryczne -na ufności na podstawie modelu logarytmiczno-normalnego o , a jeszcze złe pokrycie (błąd w lewo w prawo, tylna 0,012 0,047 kiedy oba powinny 0,025).μ = 0 , σ = 1,65 n = 20000
Kontynuując myślenie o tym, istnieją dwa szerokie sposoby konceptualizacji problemu, który chciałbym omówić.
- Średnia nie jest wielkością, która nadaje się do wnioskowania nieparametrycznego, przynajmniej wtedy, gdy wymagana jest dokładność wnioskowania. Mediana próbki ma znaczenie dla każdego ciągłego rozkładu i mamy prosty dokładny przedział ufności dla mediany. W próbce o rozmiarze z rozkładu normalnego przedział ufności dla mediany jest dłuższy niż dokładny przedział ufności oparty na dla średniej (patrz kod poniżej). Być może ten współczynnik 1,28 to rozsądna cena za solidność i całkowitą swobodę dystrybucji.1,28 × t
- Mimo że żaden pojedynczy bootstrap nie da odpowiednio dokładnych granic ufności dla próbek z bardzo wypaczonych rozkładów, podwójny bootstrap może znacznie poprawić zasięg ufności w obu ogonach. Nankervis ma niezłe wyniki i zapewnia doskonały algorytm obliczeniowy. Ale żadne oprogramowanie, które znalazłem, nie implementuje tego.
Kod R ilustrujący 1. powyżej:
## 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)