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ı.
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ı.
Yanıtlar:
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)
Ö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.
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)
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)
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()
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.
İ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.