Thiết lập thuật toán mô phỏng để kiểm tra hiệu chuẩn xác suất sau của Bayes


8

Tìm hiểu làm thế nào để mô phỏng một cái gì đó thường là cách tốt nhất để hiểu các nguyên tắc cơ bản. Tôi hơi mất công về cách mô phỏng chính xác như sau.

Giả sử rằng và có phân phối trước đó là . Dựa trên một mẫu của quan sát viết tắt bởi chỉ , tôi quan tâm đến việc hiển thị cho một người không phải Bayes rằng xác suất sau đó là được hiệu chỉnh tốt, ví dụ: Prob trong đó là xác suất sau. Một cuộc thảo luận liên quan ở đâyYN(μ,σ2)μN(γ,τ2)nY1,,YnYμ>0|Y(μ>0|P)=PP

Điều tôi thực sự muốn chỉ ra là nếu một người thực hiện kiểm tra tuần tự và ngừng lấy mẫu khi xác suất sau vượt quá một số mức như 0,95 thì xác suất không .μ>0<0.95

Tôi đang cố gắng thuyết phục những người thường xuyên rằng xác suất Bayes có ý nghĩa mà không vướng vào bất kỳ cuộc thảo luận nào về lỗi loại I. Tôi cho rằng có một vấn đề triết học khi nói chuyện với một người thường xuyên giải trí các giả thuyết null ở chỗ nếu trước đó là liên tục (như trên) thì xác suất là 0 và không cần mô phỏng. Tôi sẽ đánh giá cao một số gợi ý về cách nghĩ về toàn bộ vấn đề và cách thiết kế mô phỏng trình diễn. Tôi đã quen với việc thực hiện các mô phỏng thường xuyên trong đó chỉ được đặt thành một hằng số duy nhất; Bayes không có điều kiện trên .μ=0μμ

Đối với tình huống tuần tự, chúng tôi đặt kích thước mẫu tối đa có thể, ví dụ: .n=1000

Có một sự tinh tế cho vấn đề mà tôi luôn gặp khó khăn khi nghĩ về. Một người hoài nghi thực sự đôi khi lo lắng về một tuyên bố sai về hiệu quả ( ) khi quy trình thực sự không có hiệu lực chính xác ( ). Sự tinh tế là sự hoài nghi là "đơn lẻ" bằng 0 như một giá trị đặc biệt và có lẽ sẽ đưa ra xác suất khác không cho sự kiện (?). Phương pháp của chúng tôi cho thấy rằng các hậu thế được hiệu chỉnh có thể không tạo ra sự hoài nghi như vậy bởi vì những người hoài nghi thực sự muốn điều kiện về và vì Bayes chúng ta chỉ dựa vào những gì có thể biết được. Có lẽ đây là trường hợp phân phối trước mà nhà thống kê đang sử dụng xung đột với phân phối trước không liên tục mà người hoài nghi đang sử dụng?μ = 0 μ = 0 μ = 0μ>0μ=0μ=0μ=0

Câu trả lời:


6

Kết quả mô phỏng sẽ phụ thuộc vào cách lấy tham số trong mô phỏng. Tôi không nghĩ có bất kỳ tranh chấp nào về việc xác suất sau sẽ được hiệu chỉnh (theo nghĩa tần số) nếu xác suất trước đó, vì vậy tôi nghi ngờ một mô phỏng sẽ không thuyết phục được bất kỳ ai mới.

Dù sao, trong trường hợp lấy mẫu liên tiếp được đề cập trong câu hỏi (đoạn thứ ba) có thể được mô phỏng "nguyên trạng" bằng cách vẽ từ trước đó, vẽ các mẫu được đưa ra này cho đến khi hoặc một số tiêu chí chấm dứt khác xảy ra (một tiêu chí chấm dứt khác là cần thiết vì có xác suất dương rằng xác suất sau chạy sẽ không bao giờ vượt quá ). Sau đó, cứ mỗi khiếu nại, kiểm tra xem cơ bản lấy mẫu -parameter là tích cực và đếm số lượng các mặt tích cực đúng vs dương tính giả. Vì vậy, với :μ p ( μ > 0 | mẫu ) > 0,95 0,95 p ( μ > 0 | mẫu ) > 0,95 μ i = 1 , 2 , ...μμp(μ>0samples)>0.950.95p(μ>0samples)>0.95μi=1,2,

  • MẫuμiN(γ,τ2)
  • Với : j=1,
    • Mẫuyi,jN(μi,σ2)
    • Tínhpi,j:=P(μi>0yi,1:j)
    • Nếupi,j>0.95
      • Nếu , tăng bộ đếm dương thực sựμi>0
      • Nếu , tăng bộ đếm dương dương tínhμi0
      • Phá vỡ từ vòng lặp bên trong cho
    • một số điều kiện phá vỡ khác, chẳng hạn nhưjjmax

Tỷ lệ dương tính thật với tất cả các dương sẽ ít nhất là , điều này chứng tỏ hiệu chuẩn của các yêu cầu .P ( μ > 0 D ) > 0,950.95P(μ>0D)>0.95

Việc triển khai Python chậm và bẩn (rất có thể xảy ra lỗi + có xu hướng dừng tiềm năng trong đó tôi đã gỡ lỗi cho đến khi tôi thấy thuộc tính hiệu chuẩn dự kiến ​​đang giữ).

# (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))

Tôi đã nhận được cho tỷ lệ tích cực thực sự cho tất cả các khiếu nại. Đây là hơn vì xác suất sau sẽ không đạt chính xác . Vì lý do này, mã theo dõi cũng có nghĩa là xác suất sau "được yêu cầu", mà tôi nhận được .0,95 0,95 0,98040.98070.950.950.9804

Người ta cũng có thể thay đổi các tham số trước cho mọi để chứng minh hiệu chuẩn "trên tất cả các suy luận" (nếu các mục sư được hiệu chuẩn). Mặt khác, người ta có thể thực hiện các cập nhật sau bắt đầu từ các siêu đường kính "sai" trước đó (khác với những gì được sử dụng trong việc vẽ tham số mặt đất), trong trường hợp hiệu chuẩn có thể không giữ được.iγ,τi


Điều này rất rõ ràng và rất hữu ích. Tôi đang thêm một đoạn khác vào câu hỏi của tôi với một vấn đề còn lại. Ngoài các phương pháp đếm Tôi quan tâm đến âm mưu xác suất của một tuyên bố sai sự thật chống lại sự thật (lấy mẫu) có thể hoàng thổ -smoothed để hiển thị một đường cong hiệu chuẩn. μ
Frank Harrell

Thay vì thay đổi 2 tham số trước đó, tôi tự hỏi liệu nó có ý nghĩa và có thể giải thích được để vẽ biểu đồ so với xác suất sau tối đa so với kích thước mẫu mở rộng trong đánh giá tuần tự. Điều này không nhận được ở dương tính giả và đúng nhưng có lẽ là một hình thức hiệu chuẩn khác? μ
Frank Harrell

4

Mở rộng câu trả lời tuyệt vời của @ juho-kokkala và sử dụng R ở đây là kết quả. Để phân phối trước cho dân số có nghĩa là mu tôi đã sử dụng hỗn hợp bằng nhau của hai quy tắc có giá trị trung bình bằng 0, một trong số họ rất nghi ngờ về các phương tiện lớn.

## 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)

Ưu tiên: Hỗn hợp bằng nhau của hai phân phối bình thường

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)

Tỷ lệ với mu> 0 so với xác suất sau khi dừng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.