Jak obliczyć przedziały ufności dla rozkładu niestandardowego?


21

Mam 383 próbki, które mają duże odchylenie dla niektórych wspólnych wartości, jak obliczyć 95% CI dla średniej? Obliczony przeze mnie wskaźnik CI wydaje się bardzo odległy, co zakładam, ponieważ moje dane nie wyglądają jak krzywa podczas tworzenia histogramu. Myślę więc, że muszę użyć czegoś takiego jak ładowanie systemu, którego nie rozumiem zbyt dobrze.


2
Jednym rozwiązaniem byłoby zastosowanie asymptotycznego CI, który wykorzystuje fakt, że RV ma ograniczający standardowy rozkład normalny. Twoja próbka jest dość duża, więc może być dobrym przybliżeniem. X¯μS/n
JohnK,

1
Nie, przy takim podejściu znajdziesz naprawdę zły zasięg ogona w obu ogonach przedziału ufności. Średni zasięg może być na szczęście OK, ale oba poziomy błędu ogona będą błędne.
Frank Harrell,

2
Co oznacza „duże odchylenie dla niektórych wspólnych wartości”? Zauważ, że uprzedzenie ma szczególne znaczenie w statystykach; powinieneś tego unikać, jeśli nie masz tego na myśli. Czy masz na myśli po prostu „niektóre szczególne wartości występują bardzo często”? Czy możesz pokazać swoje obliczenia oraz niektóre dane lub tabelę swoich danych?
Glen_b

Odpowiedzi:


21

Tak, bootstrap jest alternatywą dla uzyskania przedziałów ufności dla średniej (i musisz trochę wysiłku, jeśli chcesz zrozumieć metodę).

Pomysł jest następujący:

  1. Ponownie próbkuj z wymianą razy B.
  2. Dla każdej z tych próbek oblicz średnią próbki.
  3. Oblicz odpowiedni przedział ufności ładowania początkowego.

Jeśli chodzi o ostatni krok, istnieje kilka rodzajów przedziału ufności ładowania początkowego (BCI). Poniższe odniesienia przedstawiają dyskusję na temat właściwości różnych rodzajów BCI:

http://staff.ustc.edu.cn/~zwp/teach/Stat-Comp/Efron_Bootstrap_CIs.pdf

http://www.tau.ac.il/~saharon/Boot/10.1.1.133.8405.pdf

Dobrą praktyką jest obliczanie kilku BCI i próba zrozumienia możliwych rozbieżności między nimi.

W R możesz łatwo wdrożyć ten pomysł, używając pakietu „boot” w następujący sposób:

rm(list=ls())
# Simulated data
set.seed(123)
data0 = rgamma(383,5,3)
mean(data0) # Sample mean

hist(data0) # Histogram of the data

library(boot) 

# function to obtain the mean
Bmean <- function(data, indices) {
  d <- data[indices] # allows boot to select sample 
    return(mean(d))
} 

# bootstrapping with 1000 replications 
results <- boot(data=data0, statistic=Bmean, R=1000)

# view results
results 
plot(results)

# get 95% confidence interval 
boot.ci(results, type=c("norm", "basic", "perc", "bca"))

3
Ostatni krok, oblicz kilka, oznacza poszukiwanie CI, który ci się podoba na podstawie wyniku. Powinieneś zdecydować, jakiego rodzaju CI chcesz na podstawie tego, jakie są wcześniej.
Jan

@John Różne CI mają różne właściwości. Dobrą praktyką jest sprawdzanie możliwych rozbieżności (i próba zbadania źródła tego). Nie chodzi o polowanie na wygodny wynik.
Munchausen,

Oczywiście, ale bez takiego opisu przyczyny w twojej odpowiedzi „implikuje” łowienie ryb. I nadal nie twierdzisz, że naprawdę ważne jest, aby najpierw wybrać CI, którego chcesz. Sugeruję aktualizację odpowiedzi zawierającą pewne kluczowe informacje dla naiwnego pytającego. Byłoby jeszcze lepiej, gdybyś podał, który CI preferujesz i dlaczego, lub który preferujesz w takich przypadkach i dlaczego.
Jan

2
@IhaveCandy: Nie. Pokazuje to centralne twierdzenie graniczne, tj. Jak rozkład próbkowania średniej zmierza do normy, nawet dla wartości następujących po rozkładzie bardzo „nienormalnym”. Właśnie dlatego prosty przedział ufności Z nie będzie bardzo różnił się od innych wymyślnych rozwiązań, np. Bootstrap.
Michael M

1
@IhaveCandy Proszę zobaczyć mój komentarz powyżej, Michael Mayer robi to samo.
JohnK,

8

Inną standardową alternatywą jest obliczanie CI za pomocą testu Wilcoxona. W R.

wilcox.test(your-data, conf.int = TRUE, conf.level = 0.95)

Niestety daje CI CI wokół (pseudo) mediany, a nie średniej, ale jeśli dane są bardzo nietypowe, być może mediana jest miarą bardziej informacyjną.


2

W przypadku danych logarytmiczno-normalnych Olsson (2005) sugeruje „zmodyfikowaną metodę Coxa”

XE(X)=θlog(θ)

Y¯=S22±tdfS2n+S42(n1)

Y=log(X)YY¯YS2 . Dla df użyj n-1.

Funkcja R znajduje się poniżej:

ModifiedCox <- function(x){
  n <- length(x)
  y <- log(x)
  y.m <- mean(y)
  y.var <- var(y)

  my.t <- qt(0.975, df = n-1)

  my.mean <- mean(x)
  upper <- y.m + y.var/2 + my.t*sqrt(y.var/n + y.var^2/(2*(n - 1)))
  lower <- y.m + y.var/2 - my.t*sqrt(y.var/n + y.var^2/(2*(n - 1)))

 return(list(upper = exp(upper), mean = my.mean, lower = exp(lower)))

}

Powtarzając przykład z pracy Olssona

CO.level <- c(12.5, 20, 4, 20, 25, 170, 15, 20, 15)

ModifiedCox(CO.level)
$upper
[1] 78.72254

$mean
[1] 33.5

$lower
[1] 12.30929

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.