Bayesian tương đương với hai bài kiểm tra mẫu?


39

Tôi không tìm kiếm một phương thức plug and play như BEST in R mà là một lời giải thích toán học về một số phương pháp Bayes mà tôi có thể sử dụng để kiểm tra sự khác biệt giữa giá trị trung bình của hai mẫu.


15
giấy TỐT NHẤT ban đầu có thể là thứ bạn đang tìm kiếm: indiana.edu/~kruschke/BEST/BEST.pdf
Cam.Davidson.Pilon

4
Để rõ ràng, chúng ta đang nói về một bài kiểm tra hai mẫu tương đương với một bài kiểm tra thường xuyên về sự khác biệt trung bình trong hai nhóm, chẳng hạn như bài kiểm tra t? hoặc bạn có quan tâm đến các thử nghiệm về giả thuyết null mạnh mẽ cho sự khác biệt về phân phối như thử nghiệm Kolmogorov-Smirnoff?
AdamO

Câu trả lời:


46

Đây là một câu hỏi hay, dường như bật lên rất nhiều: liên kết 1 , liên kết 2 . Các giấy Bayesian Ước Superseeds T-Test rằng Cam.Davidson.Pilon chỉ ra là một nguồn tuyệt vời về chủ đề này. Nó cũng rất gần đây, được xuất bản vào năm 2012, mà tôi nghĩ một phần là do sự quan tâm hiện tại trong khu vực.

Tôi sẽ cố gắng tóm tắt một lời giải thích toán học về một sự thay thế Bayes cho hai bài kiểm tra mẫu. Tóm tắt này tương tự như bài báo TỐT NHẤT đánh giá sự khác biệt trong hai mẫu bằng cách so sánh sự khác biệt trong phân phối sau của chúng (giải thích bên dưới trong R).

set.seed(7)

#create samples
sample.1 <- rnorm(8, 100, 3)
sample.2 <- rnorm(10, 103, 7)

#we need a pooled data set for estimating parameters in the prior.
pooled <- c(sample.1, sample.2)
par(mfrow=c(1, 2))

hist(sample.1)
hist(sample.2)

nhập mô tả hình ảnh ở đây

Để so sánh mẫu có nghĩa là chúng ta cần ước tính chúng là gì. Phương pháp Bayes để làm như vậy sử dụng định lý Bayes: P (A | B) = P (B | A) * P (A) / P (B) (cú pháp của P (A | B) được đọc là xác suất của A đã cho B)

Nhờ các phương pháp số hiện đại, chúng ta có thể bỏ qua xác suất của B, P (B) và sử dụng số liệu thống kê tỷ lệ: P (A | B) P (B | A) * P (A) Trong ngôn ngữ Bayesian tỷ lệ sau đến khả năng lần trướcα

Áp dụng lý thuyết của Bayes vào vấn đề của chúng tôi, nơi chúng tôi muốn biết phương tiện của các mẫu được cung cấp một số dữ liệu chúng tôi nhận được . Thuật ngữ đầu tiên bên phải là khả năng, , là xác suất quan sát dữ liệu mẫu đã cho trung bình.1. Thuật ngữ thứ hai là trước, , đơn giản là xác suất của trung bình.1. Tìm ra các linh mục thích hợp vẫn còn là một nghệ thuật và là một trong những phương pháp truyền thông lớn nhất của phương pháp Bayes.P(memộtn.1|Smộtmptôie.1) α P(Smộtmptôie.1|memộtn.1)*P(memộtn.1)P(Smộtmptôie.1|memộtn.1)P(memộtn.1)

Hãy đặt nó vào mã. Mã làm cho mọi thứ tốt hơn.

likelihood <- function(parameters){
  mu1=parameters[1]; sig1=parameters[2]; mu2=parameters[3]; sig2=parameters[4]
  prod(dnorm(sample.1, mu1, sig1)) * prod(dnorm(sample.2, mu2, sig2))
}

prior <- function(parameters){
  mu1=parameters[1]; sig1=parameters[2]; mu2=parameters[3]; sig2=parameters[4]
  dnorm(mu1, mean(pooled), 1000*sd(pooled)) * dnorm(mu2, mean(pooled), 1000*sd(pooled)) * dexp(sig1, rate=0.1) * dexp(sig2, 0.1)
}

Tôi đã đưa ra một số giả định trước đó cần phải được chứng minh. Để giữ cho các linh mục không làm ảnh hưởng đến ý nghĩa ước tính, tôi muốn làm cho chúng rộng và đồng nhất trên các giá trị hợp lý với mục đích để dữ liệu tạo ra các tính năng của hậu thế. Tôi đã sử dụng cài đặt được đề xuất từ ​​TỐT NHẤT và phân phối mu bình thường với mean = mean (gộp) và độ lệch chuẩn rộng = 1000 * sd (gộp). Các độ lệch chuẩn tôi đặt thành phân phối theo cấp số nhân rộng, vì tôi muốn phân phối rộng không giới hạn.

Bây giờ chúng ta có thể làm cho hậu thế

posterior <- function(parameters) {likelihood(parameters) * prior(parameters)}

Chúng tôi sẽ lấy mẫu phân phối sau bằng cách sử dụng chuỗi montov carlo (MCMC) với sự điều chỉnh của Metropolis Hastings. Nó dễ hiểu nhất với mã.

#starting values
mu1 = 100; sig1 = 10; mu2 = 100; sig2 = 10
parameters <- c(mu1, sig1, mu2, sig2)

#this is the MCMC /w Metropolis method
n.iter <- 10000
results <- matrix(0, nrow=n.iter, ncol=4)
results[1, ] <- parameters
for (iteration in 2:n.iter){
  candidate <- parameters + rnorm(4, sd=0.5)
  ratio <- posterior(candidate)/posterior(parameters)
  if (runif(1) < ratio) parameters <- candidate #Metropolis modification
  results[iteration, ] <- parameters
}

Ma trận kết quả là một danh sách các mẫu từ phân phối sau cho mỗi tham số mà chúng ta có thể sử dụng để trả lời câu hỏi ban đầu của mình: sample.1 có khác với mẫu.2 không? Nhưng trước tiên để tránh ảnh hưởng từ các giá trị ban đầu, chúng tôi sẽ "đốt cháy" 500 giá trị đầu tiên của chuỗi.

#burn-in
results <- results[500:n.iter,]

Bây giờ, mẫu.1 có khác với mẫu.2 không?

mu1 <- results[,1]
mu2 <- results[,3]

hist(mu1 - mu2)

nhập mô tả hình ảnh ở đây

mean(mu1 - mu2 < 0)
[1] 0.9953689

Từ phân tích này, tôi sẽ kết luận có 99,5% khả năng giá trị trung bình của mẫu.1 nhỏ hơn giá trị trung bình của mẫu.2.

Một lợi thế của phương pháp Bayes, như được chỉ ra trong bài viết TỐT NHẤT, là nó có thể tạo ra những lý thuyết mạnh mẽ. EG xác suất mà mẫu.2 lớn hơn 5 đơn vị mẫu là bao nhiêu.

mean(mu2 - mu1 > 5)
[1] 0.9321124

Chúng tôi sẽ kết luận rằng có 93% khả năng giá trị trung bình của mẫu.2 lớn hơn 5 đơn vị so với mẫu.1. Một người đọc quan sát sẽ thấy thú vị bởi vì chúng ta biết dân số thực sự có phương tiện tương ứng là 100 và 103. Điều này rất có thể là do kích thước mẫu nhỏ và lựa chọn sử dụng phân phối bình thường cho khả năng.

Tôi sẽ kết thúc câu trả lời này bằng một cảnh báo: Mã này dành cho mục đích giảng dạy. Để phân tích thực tế, hãy sử dụng RJAGS và tùy thuộc vào kích thước mẫu của bạn phù hợp với phân phối t cho khả năng. Nếu có hứng thú, tôi sẽ đăng bài kiểm tra t bằng cách sử dụng RJAGS.

EDIT: Theo yêu cầu ở đây là một mô hình JAGS.

model.str <- 'model {
    for (i in 1:Ntotal) {
        y[i] ~ dt(mu[x[i]], tau[x[i]], nu)
    }
    for (j in 1:2) {
        mu[j] ~ dnorm(mu_pooled, tau_pooled)
        tau[j] <- 1 / pow(sigma[j], 2)
        sigma[j] ~ dunif(sigma_low, sigma_high)
    }
    nu <- nu_minus_one + 1
    nu_minus_one ~ dexp(1 / 29)
}'

# Indicator variable
x <- c(rep(1, length(sample.1)), rep(2, length(sample.2)))

cpd.model <- jags.model(textConnection(model.str),
                        data=list(y=pooled,
                                  x=x,
                                  mu_pooled=mean(pooled),
                                  tau_pooled=1/(1000 * sd(pooled))^2,
                                  sigma_low=sd(pooled) / 1000,
                                  sigma_high=sd(pooled) * 1000,
                                  Ntotal=length(pooled)))
update(cpd.model, 1000)
chain <- coda.samples(model = cpd.model, n.iter = 100000,
                      variable.names = c('mu', 'sigma'))
rchain <- as.matrix(chain)
hist(rchain[, 'mu[1]'] - rchain[, 'mu[2]'])
mean(rchain[, 'mu[1]'] - rchain[, 'mu[2]'] < 0)
mean(rchain[, 'mu[2]'] - rchain[, 'mu[1]'] > 5)

Chỉ cần tự hỏi nếu có một giải pháp hợp lý để sử dụng so sánh hai mẫu Bayesian với loại tập dữ liệu này. stackoverflow.com/q/57503523/7288088
pyring

7

Câu trả lời xuất sắc của user1068430 được thực hiện bằng Python

import numpy as np
from pylab import plt

def dnorm(x, mu, sig):
    return 1/(sig * np.sqrt(2 * np.pi)) * np.exp(-(x - mu)**2 / (2 * sig**2))

def dexp(x, l):
    return l * np.exp(- l*x)

def like(parameters):
    [mu1, sig1, mu2, sig2] = parameters
    return dnorm(sample1, mu1, sig1).prod()*dnorm(sample2, mu2, sig2).prod()

def prior(parameters):
    [mu1, sig1, mu2, sig2] = parameters
    return dnorm(mu1, pooled.mean(), 1000*pooled.std()) * dnorm(mu2, pooled.mean(), 1000*pooled.std()) * dexp(sig1, 0.1) * dexp(sig2, 0.1)

def posterior(parameters):
    [mu1, sig1, mu2, sig2] = parameters
    return like([mu1, sig1, mu2, sig2])*prior([mu1, sig1, mu2, sig2])


#create samples
sample1 = np.random.normal(100, 3, 8)
sample2 = np.random.normal(100, 7, 10)

pooled= np.append(sample1, sample2)

plt.figure(0)
plt.hist(sample1)
plt.hold(True)
plt.hist(sample2)
plt.show(block=False)

mu1 = 100 
sig1 = 10
mu2 = 100
sig2 = 10
parameters = np.array([mu1, sig1, mu2, sig2])

niter = 10000

results = np.zeros([niter, 4])
results[1,:] = parameters

for iteration in np.arange(2,niter):
    candidate = parameters + np.random.normal(0,0.5,4)
    ratio = posterior(candidate)/posterior(parameters)
    if np.random.uniform() < ratio:
        parameters = candidate
    results[iteration,:] = parameters

#burn-in
results = results[499:niter-1,:]

mu1 = results[:,1]
mu2 = results[:,3]

d = (mu1 - mu2)
p_value = np.mean(d > 0)

plt.figure(1)
plt.hist(d,normed = 1)
plt.show()

6

Với phân tích Bayes, bạn có nhiều thứ hơn để xác định (đó thực sự là một điều tốt, vì nó mang lại sự linh hoạt và khả năng mô hình hóa nhiều hơn những gì bạn tin là sự thật). Bạn đang giả định bình thường cho khả năng? 2 nhóm sẽ có cùng phương sai không?

Một cách tiếp cận thẳng là mô hình hóa 2 phương tiện (và 1 hoặc 2 phương sai / phân tán) sau đó xem xét phía sau về sự khác biệt của 2 phương tiện và / hoặc Khoảng tin cậy về sự khác biệt của 2 phương tiện.


Bạn có thể cung cấp thêm một số chi tiết về điều này? Tôi không chắc làm thế nào để mô hình 2 có nghĩa và nhìn vào hậu thế.
John

4

một lời giải thích toán học về một số phương pháp Bayes mà tôi có thể sử dụng để kiểm tra sự khác biệt giữa giá trị trung bình của hai mẫu.

Có một số cách tiếp cận để "thử nghiệm" này. Tôi sẽ đề cập đến một cặp vợ chồng:

  • Nếu bạn muốn một quyết định rõ ràng, bạn có thể nhìn vào lý thuyết quyết định.

  • Một điều khá đơn giản đôi khi được thực hiện là tìm một khoảng cho sự khác biệt về phương tiện và xem xét liệu nó có bao gồm 0 hay không. Điều đó sẽ liên quan đến việc bắt đầu với một mô hình cho các quan sát, các linh mục về các tham số và tính toán của phân bố sau của sự khác biệt về phương tiện có điều kiện trên dữ liệu.

    Bạn cần nói mô hình của bạn là gì (ví dụ: bình thường, phương sai không đổi), và sau đó (ít nhất) một số ưu tiên cho sự khác biệt về phương tiện và trước cho phương sai. Bạn có thể lần lượt có các linh mục về các thông số của các linh mục đó. Hoặc bạn có thể không giả định phương sai không đổi. Hoặc bạn có thể giả định một cái gì đó khác hơn bình thườ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.