Przejrzałem zestaw artykułów, z których każdy podaje obserwowaną średnią i SD pomiaru w odpowiedniej próbce o znanej wielkości, n . Chcę jak najlepiej zgadnąć, jaki jest prawdopodobny rozkład tej samej miary w nowym opracowaniu, które projektuję, i ile niepewności jest w tym przypuszczeniu. Z przyjemnością przyjmuję X ∼ N ( μ , σ 2 ).
Moją pierwszą myślą była metaanaliza, ale zwykle stosowane modele koncentrują się na szacunkach punktowych i odpowiadających im przedziałach ufności. Chciałbym jednak powiedzieć coś o pełnym rozkładzie , co w tym przypadku również zawiera zgadywanie o wariancji, σ 2 .
Czytałem o możliwych podejściach Bayeisana do oszacowania pełnego zestawu parametrów danego rozkładu w świetle wcześniejszej wiedzy. Zasadniczo ma to dla mnie większy sens, ale nie mam doświadczenia w analizie Bayesa. Wydaje się to również prostym, stosunkowo prostym problemem, na którym można obciąć zęby.
1) Biorąc pod uwagę mój problem, które podejście jest najbardziej sensowne i dlaczego? Metaanaliza czy podejście bayesowskie?
2) Jeśli uważasz, że podejście bayesowskie jest najlepsze, czy możesz wskazać mi sposób na wdrożenie tego (najlepiej w R)?
EDYCJE:
Próbowałem to wypracować w sposób, który uważam za „prosty” sposób bayesowski.
Jak powiedziałem powyżej, interesuje mnie nie tylko oszacowana średnia, , ale także wariancja, σ 2 , w świetle wcześniejszych informacji, tj. P ( μ , σ 2 | Y )
Znów nic nie wiem o bayeianizmie w praktyce, ale nie trzeba było długo czekać, aby ustalić, że tylny rozkład normalny o nieznanej średniej i wariancji ma rozwiązanie w postaci zamkniętej poprzez sprzężenie z rozkładem normalnej odwrotności gamma.
Problem został przeformułowany jako .
jest szacowane z rozkładem normalnym; P ( σ 2 | Y ) z odwrotnym rozkładem gamma.
Minęło trochę czasu, zanim udało mi się to obejść, ale z tych linków ( 1 , 2 ) mogłem, jak sądzę, posortować, jak to zrobić w R.
Zacząłem od ramki danych złożonej z wiersza dla każdego z 33 badań / próbek oraz kolumn dla średniej, wariancji i wielkości próby. Jako moją wcześniejszą informację wykorzystałem średnią, wariancję i wielkość próby z pierwszego badania w wierszu 1. Następnie zaktualizowałem to o informacje z następnego badania, obliczyłem odpowiednie parametry i pobrałem próbkę z normalnej-odwrotnej gamma, aby uzyskać rozkład i σ 2 . Powtarza się to do momentu włączenia wszystkich 33 badań.
# Loop start values values
i <- 2
k <- 1
# Results go here
muL <- list() # mean of the estimated mean distribution
varL <- list() # variance of the estimated mean distribution
nL <- list() # sample size
eVarL <- list() # mean of the estimated variance distribution
distL <- list() # sampling 10k times from the mean and variance distributions
# Priors, taken from the study in row 1 of the data frame
muPrior <- bayesDf[1, 14] # Starting mean
nPrior <- bayesDf[1, 10] # Starting sample size
varPrior <- bayesDf[1, 16]^2 # Starting variance
for (i in 2:nrow(bayesDf)){
# "New" Data, Sufficient Statistics needed for parameter estimation
muSamp <- bayesDf[i, 14] # mean
nSamp <- bayesDf[i, 10] # sample size
sumSqSamp <- bayesDf[i, 16]^2*(nSamp-1) # sum of squares (variance * (n-1))
# Posteriors
nPost <- nPrior + nSamp
muPost <- (nPrior * muPrior + nSamp * muSamp) / (nPost)
sPost <- (nPrior * varPrior) +
sumSqSamp +
((nPrior * nSamp) / (nPost)) * ((muSamp - muPrior)^2)
varPost <- sPost/nPost
bPost <- (nPrior * varPrior) +
sumSqSamp +
(nPrior * nSamp / (nPost)) * ((muPrior - muSamp)^2)
# Update
muPrior <- muPost
nPrior <- nPost
varPrior <- varPost
# Store
muL[[i]] <- muPost
varL[[i]] <- varPost
nL[[i]] <- nPost
eVarL[[i]] <- (bPost/2) / ((nPost/2) - 1)
# Sample
muDistL <- list()
varDistL <- list()
for (j in 1:10000){
varDistL[[j]] <- 1/rgamma(1, nPost/2, bPost/2)
v <- 1/rgamma(1, nPost/2, bPost/2)
muDistL[[j]] <- rnorm(1, muPost, v/nPost)
}
# Store
varDist <- do.call(rbind, varDistL)
muDist <- do.call(rbind, muDistL)
dist <- as.data.frame(cbind(varDist, muDist))
distL[[k]] <- dist
# Advance
k <- k+1
i <- i+1
}
var <- do.call(rbind, varL)
mu <- do.call(rbind, muL)
n <- do.call(rbind, nL)
eVar <- do.call(rbind, eVarL)
normsDf <- as.data.frame(cbind(mu, var, eVar, n))
colnames(seDf) <- c("mu", "var", "evar", "n")
normsDf$order <- c(1:33)
Oto desnities oparte na próbkowaniu z szacowanych rozkładów dla średniej i wariancji przy każdej aktualizacji.
Chciałem tylko dodać to na wypadek, gdyby było to pomocne dla kogoś innego, aby znający mogli mi powiedzieć, czy to było rozsądne, wadliwe itp.
źródło
źródło