8 votos

Configuración del algoritmo de simulación para verificar la calibración de las probabilidades posteriores bayesianas

Averiguar cómo simular algo es a menudo la mejor manera de entender los principios subyacentes. Estoy un poco en una pérdida sobre exactamente cómo simular la siguiente.

Supongamos que $Y \sim N(\mu, \sigma^{2})$ y $\mu$ tiene una distribución previa de que es $N(\gamma, \tau^{2})$. Basado en una muestra de $n$ observaciones $Y_{1}, \dots, Y_{n}$ abreviado sólo por $Y$, estoy interesado en mostrar a un no-Bayesiano que la probabilidad posterior de que $\mu > 0 | Y$ está bien calibrado, por ejemplo, Prob$(\mu > 0 | P) = P$ donde $P$ es la probabilidad posterior. Una discusión relacionada con está aquí

Lo que realmente quiero mostrar es que si uno fuera a hacer ensayos secuenciales y detener el muestreo cuando la probabilidad posterior supera cierto nivel, tales como la probabilidad de 0.95 de que $\mu > 0$ no $< 0.95$.

Estoy tratando de convencer a frequentists que Bayesiano probabilidades son significativas, sin entrar en ninguna discusión sobre el tipo de error. Supongo que hay un problema filosófico cuando se habla de una frecuentista que entretiene hipótesis nula de que si la anterior es continua (como el anterior) la probabilidad de que $\mu = 0$ es cero y las simulaciones no son necesarios. Agradecería algunas sugerencias acerca de cómo pensar en la totalidad del problema y de cómo el diseño de demostración de las simulaciones. Estoy acostumbrado a hacer frecuentista simulaciones donde $\mu$ es establecido a una sola constante; Bayesians no en la condición de $\mu$.

Para el secuencial situación en la que nos establece un máximo posible el tamaño de la muestra, por ejemplo, $n=1000$.

Hay un subtlty para el problema que siempre tengo problemas para pensar acerca de. Un verdadero escéptico a veces está preocupado acerca de un reclamo falso de eficacia ($\mu > 0$) cuando el proceso realmente tiene exactamente ningún efecto ($\mu=0$). El subtlty es que el escéptico es "singularizar" cero como un valor especial, y tal vez está dando probabilidad no nula para el caso de $\mu = 0$ (?). Nuestro método de mostrar que las posteriores se calibra no puede hacer un escéptico feliz porque el escéptico realmente parece querer condición en $\mu = 0$, y como Bayesians nosotros sólo en la condición de lo que es cognoscible. Tal vez este es un caso donde la distribución previa de que el estadístico es el uso de los conflictos con un discontinua antes de la distribución, el escéptico está utilizando?

6voto

SHU Puntos 18

Los resultados de la simulación dependerá de cómo el parámetro se muestra en la simulación. No creo que exista alguna controversia sobre si las probabilidades posteriores será calibrado (en la frecuencia de sentido) si en el estado de probabilidades, por lo que sospecho que la simulación no va a convencer a nadie de nada nuevo.

De todos modos, en el muestreo secuencial caso mencionado en la pregunta (tercer párrafo) puede ser simulado "como es" dibujando $\mu$ desde el antes, el dibujo de muestras dado esta $\mu$ hasta $p(\mu>0\mid \textrm{samples})>0.95$ o algún otro criterio de parada se produce (otro criterio de parada es necesario ya que hay probabilidad positiva de que la ejecución de probabilidad posterior no podrá exceder $0.95$). A continuación, para cada $p(\mu>0\mid \textrm{samples})>0.95$ afirman, compruebe si el subyacente muestreados $\mu$-parámetro es positivo y contar el número de verdaderos positivos vs falsos positivos. Así, por $i=1,2,\ldots$:

  • Ejemplo de $\mu_i \sim N(\gamma, \tau^2)$
  • Para $j=1,\ldots^\ast$:
    • Ejemplo de $y_{i,j} \sim N(\mu_i, \sigma^2)$
    • Calcular $p_{i,j} := P(\mu_i>0 \mid y_{i,1:j})$
    • Si $p_{i,j}>0.95$
      • Si $\mu_i>0$, incremento verdadero positivo de contador
      • Si $\mu_i\leq0$, incremento de falsos positivos del contador
      • Salto desde el interior del bucle for
    • $\ast$ algunas otras romper condición, tales como $j\geq j_{\max}$

La proporción de verdaderos positivos para todos los positivos serán, al menos,$0.95$, lo que demuestra la calibración de la $P(\mu>0 \mid D)>0.95$ reclamaciones.

Un lento y sucio implementación de Python (bugs muy posible que + hay un potencial de frenado de sesgo en la que yo depurar hasta que vi a la espera de calibración de tenencia de propiedad).

# (C) Juho Kokkala 2016
# MIT License 

import numpy as np

np.random.seed(1)

N = 10000
max_samples = 50

gamma = 0.1
tau = 2
sigma = 1

truehits = 0
falsehits = 0

p_positivemus = []

while truehits + falsehits < N:
    # Sample the parameter from prior
    mu = np.random.normal(gamma, tau)

    # For sequential updating of posterior
    gamma_post = gamma
    tau2_post = tau**2

    for j in range(max_samples):
        # Sample data
        y_j = np.random.normal(mu, sigma)

        gamma_post = ( (gamma_post/(tau2_post) + y_j/(sigma**2)) /
                       (1/tau2_post + 1/sigma**2) )
        tau2_post = 1 / (1/tau2_post + 1/sigma**2)

        p_positivemu = 1 - stats.norm.cdf(0, loc=gamma_post,
                                          scale=np.sqrt(tau2_post))

        if p_positivemu > 0.95:
            p_positivemus.append(p_positivemu)
            if mu>0:
                truehits += 1
            else:
                falsehits +=1
            if (truehits+falsehits)%1000 == 0:
                print(truehits / (truehits+falsehits))
                print(truehits+falsehits)
            break

print(truehits / (truehits+falsehits))
print(np.mean(p_positivemus))

Llegué $0.9807$ para la proporción de verdaderos positivos para todas las reclamaciones. Esto es más de $0.95$ la probabilidad posterior no llegará exactamente $0.95$. Por esta razón, el código también las pistas de la media ", afirmó" probabilidad posterior, para que conseguí $0.9804$.

También se podría cambiar el consentimiento previo de los parámetros de $\gamma,\tau$ por cada $i$ a demostrar una calibración "por encima de todo inferencias" (si los priores son calibrados). Por otro lado, uno podría realizar las posteriores actualizaciones a partir de "mal" antes de hyperparameters (diferente a lo que se utilizan en el dibujo de la tierra-la verdad parámetro), en el que caso de que la calibración no podría mantener.

4voto

dan90266 Puntos 609

La expansión en la excelente respuesta por parte de @juho-kokkala y el uso de R aquí están los resultados. Para una distribución previa para la media de la población es mu he utilizado una mezcla de partes iguales de dos normales con media cero, uno de ellos muy escéptico acerca de los grandes medios.

## Posterior density for a normal data distribution and for
## a mixture of two normal priors with mixing proportions wt and 1-wt
## and means mu1 mu2 and variances v1 an
## Adapted for LearnBayes package normal.normal.mix function

## Produces a list of 3 functions.  The posterior density and cum. prob.
## function can be called with a vector of posterior means and variances
## if the first argument x is a scalar

mixpost <- function(stat, vstat, mu1=0, mu2=0, v1, v2, wt) {
  if(length(stat) + length(vstat) != 2) stop('improper arguments')
  probs      <- c(wt, 1. - wt)
  prior.mean <- c(mu1, mu2)
  prior.var  <- c(v1,  v2)

  post.precision <- 1. / prior.var + 1. / vstat
  post.var       <- 1. / post.precision
  post.mean <- (stat / vstat + prior.mean / prior.var) / post.precision
  pwt       <- dnorm(stat, prior.mean, sqrt(vstat + prior.var))
  pwt       <- probs * pwt / sum(probs * pwt)

  dMix <- function(x, pwt, post.mean, post.var)
    pwt[1] * dnorm(x, mean=post.mean[1], sd=sqrt(post.var[1])) +
    pwt[2] * dnorm(x, mean=post.mean[2], sd=sqrt(post.var[2]))
  formals(dMix) <- z <-
    list(x=NULL, pwt=pwt, post.mean=post.mean, post.var=post.var)

  pMix <- function(x, pwt, post.mean, post.var)
    pwt[1] * pnorm(x, mean=post.mean[1], sd=sqrt(post.var[1])) +
    pwt[2] * pnorm(x, mean=post.mean[2], sd=sqrt(post.var[2]))
  formals(pMix) <- z

  priorMix <- function(x, mu1, mu2, v1, v2, wt)
    wt * dnorm(x, mean=mu1, sd=sqrt(v1)) +
    (1. - wt) * dnorm(x, mean=mu2, sd=sqrt(v2))
  formals(priorMix) <- list(x=NULL, mu1=mu1, mu2=mu2, v1=v1, v2=v2, wt=wt)
  list(priorMix=priorMix, dMix=dMix, pMix=pMix)
}

## mixposts handles the case where the posterior distribution function
## is to be evaluated at a scalar x for a vector of point estimates and
## variances of the statistic of interest
## If generates a single function

mixposts <- function(stat, vstat, mu1=0, mu2=0, v1, v2, wt) {
  post.precision1 <- 1. / v1 + 1. / vstat
  post.var1       <- 1. / post.precision1
  post.mean1      <- (stat / vstat + mu1 / v1) / post.precision1

  post.precision2 <- 1. / v2 + 1. / vstat
  post.var2       <- 1. / post.precision2
  post.mean2      <- (stat / vstat + mu2 / v2) / post.precision2

  pwt1 <- dnorm(stat, mean=mu1, sd=sqrt(vstat + v1))
  pwt2 <- dnorm(stat, mean=mu2, sd=sqrt(vstat + v2))
  pwt <- wt * pwt1 / (wt * pwt1 + (1. - wt) * pwt2)

  pMix <- function(x, post.mean1, post.mean2, post.var1, post.var2, pwt)
    pwt        * pnorm(x, mean=post.mean1, sd=sqrt(post.var1)) +
    (1. - pwt) * pnorm(x, mean=post.mean2, sd=sqrt(post.var2))
  formals(pMix) <-
    list(x=NULL, post.mean1=post.mean1, post.mean2=post.mean2,
         post.var1=post.var1, post.var2=post.var2, pwt=pwt)
 pMix
}

## Compute proportion mu > 0 in trials for
## which posterior prob(mu > 0) > 0.95, and also use a loess smoother
## to estimate prob(mu > 0) as a function of the final post prob
## In sequential analyses of observations 1, 2, ..., N, the final
## posterior prob is the post prob at the final sample size if the
## prob never exceeds 0.95, otherwise it is the post prob the first
## time it exceeds 0.95

sim <- function(N, prior.mu=0, prior.sd, wt, mucut=0, postcut=0.95,
                nsim=1000, plprior=TRUE) {
  prior.mu <- rep(prior.mu, length=2)
  prior.sd <- rep(prior.sd, length=2)
  sd1 <- prior.sd[1]; sd2 <- prior.sd[2]
  v1 <- sd1 ^ 2
  v2 <- sd2 ^ 2
  if(plprior) {
    pdensity <- mixpost(1, 1, mu1=prior.mu[1], mu2=prior.mu[2],
                        v1=v1, v2=v2, wt=wt)$priorMix
    x <- seq(-3, 3, length=200)
    plot(x, pdensity(x), type='l', xlab=expression(mu), ylab='Prior Density')
    title(paste(wt, 1 - wt, 'Mixture of Zero Mean Normals\nWith SD=',
                round(sd1, 3), 'and', round(sd2, 3)))
  }
  j <- 1 : N
  Mu <- Post <- numeric(nsim)
  stopped <- integer(nsim)

  for(i in 1 : nsim) {
    # See http://stats.stackexchange.com/questions/70855
    component <- sample(1 : 2, size=1, prob=c(wt, 1. - wt))
    mu <- prior.mu[component] + rnorm(1) * prior.sd[component]
    # mu <- rnorm(1, mean=prior.mu, sd=prior.sd) if only 1 component

    Mu[i] <- mu
    y  <- rnorm(N, mean=mu, sd=1)
    ybar <- cumsum(y) / j
    pcdf <- mixposts(ybar, 1. / j, mu1=prior.mu[1], mu2=prior.mu[2],
                     v1=v1, v2=v2, wt=wt)
    if(i==1) print(body(pcdf))
    post    <- 1. - pcdf(mucut)
    Post[i] <- if(max(post) < postcut) post[N]
               else post[min(which(post >= postcut))]
    stopped[i] <- if(max(post) < postcut) N else min(which(post >= postcut))
  }
  list(mu=Mu, post=Post, stopped=stopped)
}

# Take prior on mu to be a mixture of two normal densities both with mean zero
# One has SD so that Prob(mu > 1) = 0.1
# The second has SD so that Prob(mu > 0.25) = 0.05
prior.sd <- c(1 / qnorm(1 - 0.1), 0.25 / qnorm(1 - 0.05))
prior.sd
set.seed(2)
z <- sim(500, prior.mu=0, prior.sd=prior.sd, wt=0.5, postcut=0.95, nsim=10000)

Prior: Equal mixture of two normal distributions

mu   <- z$mu
post <- z$post
st   <- z$stopped
plot(mu, post)
abline(v=0, col=gray(.8)); abline(h=0.95, col=gray(.8))
hist(mu[post >= 0.95], nclass=25)
k <- post >= 0.95
mean(k)   # 0.44 of trials stopped with post >= 0.95
mean(st)  # 313 average sample size
mean(mu[k] > 0)  # 0.963 of trials with post >= 0.95 actually had mu > 0
mean(post[k])    # 0.961 mean posterior prob. when stopped early
w <- lowess(post, mu > 0, iter=0)
# perfect calibration of post probs 
plot(w, type='n',         # even if stopped early
     xlab=expression(paste('Posterior Probability ', mu > 0, ' Upon Stopping')),
     ylab=expression(paste('Proportion of Trials with ',  mu > 0)))
abline(a=0, b=1, lwd=6, col=gray(.85))
lines(w)

Proportion with mu > 0 vs. posterior probability at stopping

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X