2つのサンプルt検定に相当するベイジアン?


39

RのBESTのようなプラグアンドプレイメソッドを探しているのではなく、2つのサンプルの平均値の差をテストするために使用できるベイジアンメソッドの数学的説明を探しています。


15
元のBEST論文はあなたが探しているものかもしれません:indiana.edu/~kruschke/BEST/BEST.pdf
Cam.Davidson.Pilon 14

4
明確にするために、t検定など、2つのグループの平均差の頻繁な検定に相当する2標本検定について話していますか?または、コルモゴロフ-スミルノフ検定のような分布の違いに対する強い帰無仮説の検定に興味がありますか?
AdamO

回答:


46

これは良い質問です。リンク1リンク2など、たくさんのポップアップが表示されます。Cam.Davidson.Pilonが指摘した論文のBayesian Evaluation Superseeds T-Testは、この主題に関する優れたリソースです。また、2012年に発行されたごく最近の記事でもありますが、これはその地域への現在の関心によるものと考えています。

2つのサンプルt検定のベイジアン代替の数学的説明を要約しようとします。この要約は、2つのサンプルの事後分布の違いを比較することで2つのサンプルの違いを評価するBESTペーパーに似ています(以下の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)

ここに画像の説明を入力してください

サンプルを比較するには、それらが何であるかを推定する必要があります。そのためのベイジアン法は、ベイズの定理を使用します。P(A | B)= P(B | A)* P(A)/ P(B)(P(A | B)の構文は、与えられたB)

近代的な数値計算法のおかげで、私たちはB、P(B)の確率を無視し、比例なステートメントを使用することができます:P(A | B) P(B | A)ベイズで* P(A)方言 後部が比例しています尤度に事前の

あるデータが与えられたサンプルの平均を知りたいという問題にベイズの理論を適用すると、。右側の最初の項は、尤度であり、mean.1が与えられたサンプルデータを観測する確率です。2番目の項は事前であり、単にmean.1の確率です。適切な事前分布を把握することは、まだ少しの技術であり、ベイジアン手法の最大の批判の1つです。Pmean.1|sample.1 Psample.1|mean.1Pmean.1Psample.1|mean.1Pmean.1

コードに入れましょう。コードはすべてを改善します。

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

私は、正当化する必要がある事前のいくつかの仮定をしました。事前分布が推定平均を偏らせないようにするために、データが事後分布の特徴を生成できるようにするために、もっともらしい値に対してそれらを広く均一にしたかったのです。BESTの推奨設定を使用し、平均値=平均値(プール)と広い標準偏差= 1000 * sd(プール)で通常のmuを配布しました。標準偏差は、広い無制限の分布が必要なため、広い指数分布に設定しました。

今、私たちは後部を作ることができます

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

Metropolis Hastingsの変更を加えたマルコフチェーンモンテカルロ(MCMC)を使用して、事後分布をサンプリングします。コードで理解するのが最も簡単です。

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

結果マトリックスは、元の質問に答えるために使用できる各パラメーターの事後分布からのサンプルのリストです。sample.1はsample.2とは異なりますか?ただし、最初に開始値からの影響を避けるために、チェーンの最初の500個の値を「バーンイン」します。

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

さて、sample.1はsample.2と異なりますか?

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

hist(mu1 - mu2)

ここに画像の説明を入力してください

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

この分析から、sample.1の平均がsample.2の平均よりも低い可能性は99.5%であると結論付けます。

BEST論文で指摘されているように、ベイジアンアプローチの利点は、強力な理論を作成できることです。例えば、sample.2がsample.1より5単位大きい確率はどのくらいですか。

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

sample.2の平均がsample.1より5単位大きい可能性は93%であると結論付けます。真の母集団はそれぞれ100と103の平均を持っていることがわかっているので、注意深い読者はそれが面白いと思うでしょう。これは、サンプルサイズが小さいことと、尤度に正規分布を使用することを選択したことが原因である可能性があります。

警告でこの回答を終了します。このコードは教育目的のためです。実際の分析には、RJAGSを使用し、サンプルサイズに応じて、尤度のt分布に適合させます。興味があれば、RJAGSを使用してt検定を投稿します。

編集:ここで要求されているのは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)

このタイプのデータセットでベイジアン2サンプル比較を使用する合理的な解決策があるかどうか疑問に思うだけです。stackoverflow.com/q/57503523/7288088
パイリング

7

Pythonに実装されたuser1068430による優れた答え

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

ベイジアン分析を使用すると、指定する項目が増えます(これは、真実と信じるものをモデル化する柔軟性と能力がはるかに高いため、実際には良いことです)。尤度の法線を仮定していますか?2つのグループの分散は同じですか?

単純なアプローチの1つは、2つの平均(および1つまたは2つの分散/分散)をモデル化し、2つの平均の差の後方および/または2つの平均の差の信頼区間を調べることです。


これについてもう少し詳しく教えてください。2つの平均をモデル化し、後世を見る方法がわかりません。
ジョン

4

2つのサンプルの平均の差をテストするために使用できるベイジアン手法の数学的説明。

これを「テスト」する方法はいくつかあります。私はカップルに言及します:

  • 明示的な決定が必要な場合は、決定理論をご覧ください。

  • 時々行われる非常に単純なことは、平均の差の間隔を見つけて、それが0を含むかどうかを考慮することです。それには、観測のモデル、パラメータの事前分布、およびデータを条件とする平均値の差の事後分布の計算が含まれます。

    モデルが何であるか(例:正規分散、一定分散)、次に(少なくとも)平均値の差の前と分散の前を言う必要があります。これらの事前分布のパラメーターに順番に事前分布がある場合があります。または、一定の分散を仮定しない場合があります。または、正常性以外の何かを仮定するかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.