Bayesian eşdeğeri iki örnek t testi?


39

R'deki BEST gibi bir tak ve çalıştır yöntemi aramıyorum, ancak iki örneğin ortalaması arasındaki farkı test etmek için kullanabileceğim bazı Bayesian yöntemlerinin matematiksel bir açıklaması.


15
Orijinal EN İYİ kağıt, aradığınız ne olabilir: indiana.edu/~kruschke/BEST/BEST.pdf
Cam.Davidson.Pilon

4
Sadece açık olmak gerekirse, t-testi gibi iki gruptaki ortalama farklılıkların sıkça test edilmesinin eşdeğeri olan iki örneklemli bir testten mi bahsediyoruz? veya Kolmogorov-Smirnoff testi gibi dağıtımsal farklılıklar için güçlü boş hipotez testleriyle mi ilgileniyorsunuz?
AdamO

Yanıtlar:


46

Bu iyi bir soru, çok fazla görünüyor: link 1 , link 2 . Kağıt Bayesian Tahmini , Cam.Davidson.Pilon'un işaret ettiği T-Testini Geçer, bu konuda mükemmel bir kaynaktır. Ayrıca, 2012 yılında yayınlanan ve kısmen bölgedeki mevcut ilgiden kaynaklandığını düşünüyorum.

İki örnek t-testine bir Bayesian alternatifinin matematiksel bir açıklamasını özetlemeye çalışacağım. Bu özet, iki örnekteki farkı, posterior dağılımlarındaki farkı karşılaştırarak değerlendiren BEST makalesine benzer (aşağıda R'de açıklanmıştı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)

görüntü tanımını buraya girin

Örnekleri karşılaştırmak için ne olduklarını tahmin etmemiz gerekir. Bunu yapmak için Bayesian yöntemi Bayes teoremini kullanır: P (A | B) = P (B | A) * P (A) / P (B) (P (A | B) sözdizimi olasılığı olarak okunur. Verilen B)

Modern sayısal yöntemler sayesinde B, P (B) olasılığını göz ardı edebiliriz ve orantılı statüsü kullanırız: P (A | B) P (B | A) * P (A) Bayes dili vernakülerde orantılıdır ihtimaline göre önceki

Bayes teorisini, bazı verilerle verilen örneklerin araçlarını bilmek istediğimiz sorunumuza uygulayarak . Sağdaki ilk terim, verilen örnek verileri gözlemleme olasılığı olan olabilir. İkinci terim, sadece ortalama olanın olasılığı olan önceki ifadesidir. Uygun öncelikleri bulmak hala bir sanat eseri ve Bayesian yöntemlerinin en büyük eleştirilerinden biri.P(mean.1|sample.1) P(sample.1|mean.1)P(mean.1)P(sample.1|mean.1)P(mean.1)

Hadi koda koyalım. Kod her şeyi daha iyi yapar.

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

Daha önce gerekçelendirilmesi gereken bazı varsayımlar yaptım. Öncelikleri tahmin edilen ortalamayı önyargılı tutmaktan korumak için, verilerin posteriorun özelliklerini üretmesine izin vermek amacıyla onları geniş ve tekdüze değerler üzerinde makul değerler üzerinden yapmak istedim. BEST'den önerilen ayarları kullandım ve mu'ları normalde ortalama = ortalama (havuzlanmış) ve geniş standart sapma = 1000 * sd (havuzlanmış) olarak dağıtdım. Standart sapmalar geniş bir üstel dağılım olarak belirledim, çünkü geniş bir sınırsız dağıtım istedim.

Şimdi posteri yapabiliriz

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

Posterior dağılımını Metropolis Hastings modifikasyonu olan bir markov zinciri monte carlo (MCMC) kullanarak örnekleyeceğiz . Kod ile anlaşılması en kolay yoldur.

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

Sonuç matrisi, orijinal sorumuzu cevaplamak için kullanabileceğimiz her parametre için posterior dağılımdan alınan örneklerin bir listesidir: sample.1 sample.2'den farklı mı? Fakat ilk olarak başlangıç ​​değerlerinden etkilenmekten kaçınmak için zincirin ilk 500 değerini “yakacağız”.

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

Şimdi, örnek 1 örnek 2'den farklı mı?

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

hist(mu1 - mu2)

görüntü tanımını buraya girin

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

Bu analizden,% 99,5'lik bir şansın, örnek 1'deki ortalamanın örnek ortalamasından daha düşük olma ihtimaline ulaştığını söyleyebilirim.

BEST yazısında da belirtildiği gibi Bayesian yaklaşımının bir avantajı, güçlü teoriler yapabilmesidir. EG, örnek 2'nin örneklemden 5 birim daha büyük olma olasılığı nedir?

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

Numune 2'nin ortalamasının numuneden 5 birim daha büyük olma ihtimalinin% 93 olduğu sonucuna vardık. Bir gözlemci okuyucusu bunu ilginç bulacaktır çünkü gerçek popülasyonların sırasıyla 100 ve 103 olduğunu biliyoruz. Bu, büyük olasılıkla küçük örneklem büyüklüğü ve olasılık için normal bir dağıtım kullanma seçeneğinden kaynaklanmaktadır.

Bu cevabı bir uyarı ile bitireceğim: Bu kod öğretim amaçlıdır. Gerçek bir analiz için RJAGS kullanın ve örneklem büyüklüğünüze bağlı olarak olasılık için bir t-dağılımı yapın. İlgi varsa, RJAGS kullanarak bir t-testi yapacağım.

EDIT: Burada talep edildiği gibi bir JAGS modelidir.

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)

Bayesian iki örnekleminin bu tip veri kümeleriyle karşılaştırılmasında makul bir çözüm olup olmadığını merak ediyorum. stackoverflow.com/q/57503523/7288088
pyring

7

Python'da user1068430 tarafından verilen mükemmel cevap

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

Bir Bayesian analizinde belirtecek daha çok şeyiniz var (bu aslında iyi bir şey, çünkü gerçekte ne olduğuna inandığınızı modelleme konusunda daha fazla esneklik ve yetenek sunuyor). Olasılıklar için normal sayılıyor musunuz? 2 grup aynı varyansa sahip olacak mı?

Düz bir ileri yaklaşım, 2 aracın (ve 1 veya 2 varyans / dispersiyonun) modellenmesi, ardından 2 aracın farkı ve / veya 2 aracın farkı üzerindeki Credible Aralıkının arkaya bakmasıdır.


Bununla ilgili biraz daha ayrıntılı bilgi verebilir misiniz? Model 2'nin nasıl bir araç olduğunu ve posteriorlara nasıl bakacağımı bilmiyorum.
John

4

İki örneğin ortalaması arasındaki farkı test etmek için kullanabileceğim bazı Bayes yöntemlerinin ne olduğuna dair matematiksel bir açıklama.

Bunu test etmek için birkaç yaklaşım var. Birkaç bahsedeceğim:

  • Eğer açık bir karar istiyorsanız, karar teorisine bakabilirsiniz.

  • Bazen yapılan oldukça basit bir şey, araçtaki fark için bir aralık bulmak ve 0 içerip içermediğini düşünmektir. Bu, veriler için koşullu yoldaki farkın arka dağılımının parametreleri ve parametreleri ile ilgili gözlemler için bir model ile başlamayı içerir.

    Modelinizin ne olduğunu (örneğin, normal, sabit varyans) ve daha sonra (en azından) ortalamalar arasındaki farktan önce ve varyans için bir öncekinden önce söylemeniz gerekir. Sırasıyla, bu önceliklerin parametreleriyle ilgili öncelikleriniz olabilir. Yoksa belki değil sabit varyans varsayalım. Ya da normallikten başka bir şey varsayabilirsin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.