Я не шукаю методу підключення та відтворення, як BEST в R, а скоріше математичного пояснення, які деякі байєсівські методи я можу використати, щоб перевірити різницю середнього значення серед двох зразків.
Я не шукаю методу підключення та відтворення, як BEST в R, а скоріше математичного пояснення, які деякі байєсівські методи я можу використати, щоб перевірити різницю середнього значення серед двох зразків.
Відповіді:
Це гарне запитання, яке, схоже, спливе багато: посилання 1 , посилання 2 . Паперова байєсівська оцінка замінює тест T, на який вказував Cam.Davidson.Pilon, - чудовий ресурс з цього приводу. Це також зовсім недавно, опублікований у 2012 році, що, на мою думку, частково пов’язане із сучасним інтересом до області.
Я спробую узагальнити математичне пояснення байєсівської альтернативи двом зразковим 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)
Для порівняння вибірки означає, що ми повинні оцінити, якими вони є. Для цього методом Байєса використовується теорема Байєса: 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) у байєсівській просторіччі задній частині пропорційний до ймовірності разів до попереднього
Застосовуючи теорію Байєса до нашої проблеми, коли ми хочемо знати засоби вибірки, що дають деякі дані, ми отримуємо . Перший член праворуч - це ймовірність, , яка є ймовірністю спостереження вибіркових даних, заданих середнім знаком.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 * сд (об'єднаний). Стандартні відхилення я встановив до широкого експоненціального розподілу, тому що хотів широкого необмеженого розподілу.
Тепер ми можемо зробити задній
posterior <- function(parameters) {likelihood(parameters) * prior(parameters)}
Ми проведемо вибірку заднього розподілу, використовуючи марковський ланцюг monte carlo (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
}
Матриця результатів - це перелік зразків із заднього розподілу для кожного параметра, який ми можемо використати, щоб відповісти на наш вихідний питання: Чи відрізняється вибірка.1, ніж зразок 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 менше, ніж середнє для вибірки.
Перевага байєсівського підходу, як зазначено в роботі BEST, полягає в тому, що він може робити сильні теорії. EG яка ймовірність того, що зразок.2 на 5 одиниць більший, ніж зразок.1.
mean(mu2 - mu1 > 5)
[1] 0.9321124
Ми зробимо висновок, що існує 93% шансів, що середнє значення вибірки.2 на 5 одиниць більше, ніж вибірки. Читач, що спостерігає, буде цікавим тому, що ми знаємо, що справжня популяція має кошти 100 та 103 відповідно. Це, швидше за все, пов'язано з невеликим розміром вибірки та вибором використання нормального розподілу для ймовірності.
Я закінчу цю відповідь попередженням: Цей код призначений для навчальних цілей. Для реального аналізу використовуйте RJAGS і залежно від вашого розміру вибірки підходить 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, реалізована в 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()
За допомогою байєсівського аналізу ви можете уточнити більше речей (це насправді хороша річ, оскільки це дає набагато більше гнучкості та здатності моделювати те, що ви вважаєте правдою). Ви припускаєте нормальні показники ймовірності? Чи будуть дві групи однакову дисперсію?
Один прямолінійний підхід полягає в моделюванні 2-х засобів (і 1 або 2 дисперсій / дисперсій), а потім дивиться на задню частину різниці двох засобів та / або достовірний інтервал на різницю двох засобів.
математичне пояснення того, якими є деякі байєсівські методи, які я можу використати для перевірки різниці середнього значення для двох зразків.
Існує кілька підходів до "тестування" цього. Я згадаю пару:
Якщо ви хочете чіткого рішення, ви можете переглянути теорію рішення.
Досить простою справою, яка іноді робиться, є пошук інтервалу для різниці в засобах і врахування, включає він чи 0 чи ні. Це передбачало б почати з моделі спостережень, пріорів щодо параметрів та обчислення заднього розподілу різниці в засобах, що обумовлені даними.
Вам потрібно буде сказати, що таке ваша модель (наприклад, нормальна, постійна дисперсія), а потім (принаймні) кілька попередніх за різницею в засобах і попередньою для дисперсії. Ви можете мати пріори за параметрами цих пріорів по черзі. Або ви не можете припускати постійну дисперсію. Або ви можете припустити щось інше, ніж нормальність.