Байесовский эквивалент двух выборочных t-критерия?

39

Я не ищу метод plug and play, такой как BEST в R, а скорее математическое объяснение того, какие байесовские методы я могу использовать, чтобы проверить разницу между средним двух сэмплов.

Джон
источник
15
оригинальная ЛУЧШАЯ статья может быть тем, что вы ищете: indiana.edu/~kruschke/BEST/BEST.pdf
Cam.Davidson.Pilon
4
Просто чтобы прояснить, мы говорим о тесте с двумя выборками, который является эквивалентом частотного теста средних различий в двух группах, такого как t-тест? или вас интересуют тесты гипотезы сильных нулей для распределенных различий, такие как критерий Колмогорова-Смирнова?
AdamO

Ответы:

46

Это хороший вопрос, который часто всплывает: ссылка 1 , ссылка 2 . В статье байесовской Оценка Superseeds Т-тест , который Cam.Davidson.Pilon отметил отличный ресурс по этому вопросу. Это также совсем недавно, опубликовано в 2012 году, что, я думаю, частично из-за текущего интереса к области.

Я попытаюсь обобщить математическое объяснение байесовской альтернативы t-критерию с двумя образцами. Это краткое изложение аналогично работе 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) читается как вероятность Данный б)

α

п(меaN0,1|saмпLе0,1) α п(saмпLе0,1|меaN0,1)*п(меaN0,1)п(saмпLе0,1|меaN0,1)п(меaN0,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 (в пуле). Стандартные отклонения я установил для широкого экспоненциального распределения, потому что я хотел широкого неограниченного распределения.

Теперь мы можем сделать заднюю

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

Мы опробуем апостериорное распределение, используя цепочку Марков Монте-Карло (MCMC) с модификацией Metropolis Hastings. Это проще всего понять с помощью кода.

#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,]

Теперь образец1 отличается от образца.2?

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

hist(mu1 - mu2)

введите описание изображения здесь

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

Из этого анализа я бы пришел к выводу, что есть вероятность 99,5%, что среднее значение для образца 1 меньше, чем среднее значение для образца 2.

Преимущество байесовского подхода, как указано в статье BEST, заключается в том, что он может создавать сильные теории. Например, какова вероятность того, что sample.2 на 5 единиц больше, чем sample.1.

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

Мы пришли бы к выводу, что с 93% вероятностью, что среднее значение образца 2 на 5 единиц больше, чем значение образца 1. Наблюдательный читатель найдет это интересным, потому что мы знаем, что истинные популяции имеют средние значения 100 и 103 соответственно. Это, скорее всего, связано с небольшим размером выборки и выбором нормального распределения для вероятности.

Я закончу этот ответ предупреждением: этот код предназначен для учебных целей. Для реального анализа используйте RJAGS и в зависимости от размера вашей выборки подберите t-распределение для вероятности. Если есть интерес, я опубликую t-тест с использованием RJAGS.

РЕДАКТИРОВАТЬ: В соответствии с просьбой здесь модель 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)
user1068430
источник
Просто интересно, есть ли разумное решение использовать байесовское сравнение двух выборок с этим типом наборов данных. stackoverflow.com/q/57503523/7288088
пиринг
7

Отличный ответ от user1068430, реализованный на 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

С байесовским анализом у вас есть больше вещей, которые нужно указать (это на самом деле хорошо, так как это дает гораздо большую гибкость и возможность моделировать то, что вы считаете правдой). Вы предполагаете нормальные для вероятностей? Будут ли две группы иметь одинаковую дисперсию?

Один прямой подход состоит в том, чтобы смоделировать 2 средних (и 1 или 2 дисперсии / дисперсии), а затем рассмотреть апостериорную разницу 2 средних значений и / или достоверный интервал разности 2 средних.

Грег Сноу
источник
Не могли бы вы предоставить более подробную информацию об этом? Я не уверен, как моделировать 2 средства и смотреть на постеры.
Джон
4

математическое объяснение того, какие байесовские методы я могу использовать, чтобы проверить разницу между средним для двух выборок.

Есть несколько подходов к «тестированию» этого. Я упомяну пару:

  • Если вы хотите получить четкое решение, вы можете взглянуть на теорию принятия решений.

  • Довольно простая вещь, которая иногда делается, состоит в том, чтобы найти интервал для разницы в средних и рассмотреть, включает ли он 0 или нет. Это будет включать в себя начало с модели для наблюдений, априорных значений параметров и вычисления апостериорного распределения разницы в средних, зависящих от данных.

    Вам нужно будет сказать, какая у вас модель (например, нормальная, постоянная дисперсия), а затем (по крайней мере) несколько для разницы в средних и априора для дисперсии. У вас могут быть приоры по параметрам этих приоров по очереди. Или вы не можете предполагать постоянную дисперсию. Или вы можете предположить что-то, кроме нормальности.

Glen_b - Восстановить Монику
источник