আমি আর বেস্টের মতো প্লাগ এবং খেলার পদ্ধতি খুঁজছি না বরং দুটি নমুনার মধ্যকার পার্থক্য পরীক্ষা করতে আমি কিছু বায়েশিয়ান পদ্ধতি কী কী তা ব্যবহার করতে পারি তার গাণিতিক ব্যাখ্যা।
আমি আর বেস্টের মতো প্লাগ এবং খেলার পদ্ধতি খুঁজছি না বরং দুটি নমুনার মধ্যকার পার্থক্য পরীক্ষা করতে আমি কিছু বায়েশিয়ান পদ্ধতি কী কী তা ব্যবহার করতে পারি তার গাণিতিক ব্যাখ্যা।
উত্তর:
এটি একটি ভাল প্রশ্ন, এটি অনেক পপ আপ বলে মনে হচ্ছে: লিঙ্ক 1 , লিঙ্ক 2 । কাগজ Bayesian প্রাক্কলন Superseeds t-test যে Cam.Davidson.Pilon নির্দিষ্ট এই বিষয় উপর একটি চমৎকার সম্পদ। এটি খুব সাম্প্রতিক, ২০১২ সালে প্রকাশিত, যা আমি মনে করি যে অংশটির বর্তমান আগ্রহের কারণেই এটি হয়েছে।
আমি দুটি নমুনা টি-টেস্টের একটি বায়েশিয়ান বিকল্পের গাণিতিক ব্যাখ্যা সংক্ষিপ্ত করার চেষ্টা করব। এই সারসংক্ষেপটি সেরা কাগজের সাথে সমান যা তাদের উত্তরোত্তর বিতরণগুলির পার্থক্যের তুলনা করে দুটি নমুনার পার্থক্যের মূল্যায়ন করে (আর নীচে ব্যাখ্যা করা হয়েছে)।
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) (পি (এ | বি) এর বাক্য গঠনটি সম্ভাব্যতা হিসাবে পড়ে একটি প্রদত্ত খ)
কোডে রাখি। কোড সবকিছুকে আরও উন্নত করে।
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)
}
আমি পূর্বে কিছু অনুমান করেছি যা ন্যায়সঙ্গত হওয়া দরকার। প্রিরিয়রদের আনুমানিক গড়ের কুসংস্কার থেকে বাঁচানোর জন্য আমি তাদের উত্তরোত্তর বৈশিষ্ট্যগুলি উপস্থাপন করার লক্ষ্যে উদ্দেশ্যমূলক মূল্যবোধগুলির তুলনায় তাদের বিস্তৃত এবং অভিন্ন-ইশ তৈরি করতে চেয়েছিলাম। আমি বেস্টের কাছ থেকে প্রস্তাবিত সেটিংটি ব্যবহার করেছি এবং মিউ'র সাধারণত গড় = গড় (পুল) এবং বিস্তৃত মান বিচ্যুতি = 1000 * এসডি (পুল) দিয়ে বিতরণ করেছি। আমি স্ট্যান্ডার্ড বিচ্যুতিগুলি একটি বিস্তৃত তাত্পর্যপূর্ণ বিতরণে সেট করেছি, কারণ আমি একটি বিস্তৃত আনবাউন্ডেড বিতরণ চেয়েছিলাম।
এখন আমরা উত্তরোত্তর করতে পারেন
posterior <- function(parameters) {likelihood(parameters) * prior(parameters)}
আমরা মেট্রোপলিস হেস্টিংস সংশোধন সহ একটি মার্কভ চেইন মন্টি কার্লো (এমসিএমসি) ব্যবহার করে উত্তরোত্তর বিতরণকে নমুনা করব । কোড সহ এটি বোঝা সহজ।
#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 এর গড়টি নমুনা 2 এর গড়ের চেয়ে কম।
বেইসিয়ান পদ্ধতির একটি সুবিধা, যেমন সেরা কাগজে উল্লেখ করা হয়েছে, তা হ'ল এটি শক্তিশালী তত্ত্ব তৈরি করতে পারে। EG সম্ভাব্যতাটি কী যে নমুনা 2 নমুনা 1 এর চেয়ে 5 ইউনিট বড়।
mean(mu2 - mu1 > 5)
[1] 0.9321124
আমরা উপসংহারে পৌঁছে যাব যে একটি 93% সম্ভাবনা রয়েছে যে নমুনা 2 এর গড় নমুনা 1 এর চেয়ে 5 ইউনিট বেশি। একজন পর্যবেক্ষক পাঠককে এটি আকর্ষণীয় মনে হবে কারণ আমরা জানি সত্যিকারের জনসংখ্যার যথাক্রমে 100 এবং 103 রয়েছে। এটি সম্ভবত ছোট নমুনার আকার এবং সম্ভাবনার জন্য একটি সাধারণ বিতরণ ব্যবহারের পছন্দের কারণে is
আমি এই উত্তরটি একটি সতর্কবার্তা দিয়ে শেষ করব: এই কোডটি শেখানোর উদ্দেশ্যে। বাস্তব বিশ্লেষণের জন্য আরজেএজিএস ব্যবহার করুন এবং আপনার নমুনার আকারের উপর নির্ভর করে সম্ভাবনার জন্য টি-বিতরণ মাপসই। আগ্রহ থাকলে আমি আরজেএজিএস ব্যবহার করে একটি টি-টেস্ট পোস্ট করব।
সম্পাদনা: অনুরোধ হিসাবে এখানে একটি জাগস মডেল।
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)
ব্যবহারকারীর দ্বারা সেরা উত্তর 1068430 পাইথনে প্রয়োগ করা হয়েছে
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 টি গ্রুপের কি একই বৈকল্পিক হবে?
একটি সরাসরি এগিয়ে আসা পদ্ধতির 2 উপায় (এবং 1 বা 2 রূপগুলি / বিচ্ছুরণ) মডেল করা হয় তারপরে 2 টির অর্থের পার্থক্যের উপর পোস্টারিয়রটি দেখুন এবং / অথবা 2 টির অর্থের পার্থক্যের উপর বিশ্বাসযোগ্য ব্যবধানটি দেখুন।
দুটি নমুনার গড়ের মধ্যে পার্থক্যটি পরীক্ষা করতে আমি কিছু বায়েশিয়ান পদ্ধতি ব্যবহার করতে পারি তার গাণিতিক ব্যাখ্যা।
এটি "পরীক্ষা" করার জন্য বেশ কয়েকটি পন্থা রয়েছে। আমি একটি দম্পতির উল্লেখ করব:
আপনি যদি একটি সুস্পষ্ট সিদ্ধান্ত চান আপনি সিদ্ধান্ত তত্ত্বের দিকে তাকিয়ে থাকতে পারেন।
একটি খুব সহজ জিনিস যা মাঝে মাঝে করা হয় তা হ'ল উপায়গুলির মধ্যে পার্থক্যের জন্য একটি অন্তর সন্ধান করা এবং এটি 0 টি অন্তর্ভুক্ত কিনা তা বিবেচনা করুন। এটি পর্যবেক্ষণগুলির জন্য মডেল দিয়ে শুরু করার সাথে জড়িত হবে, পরামিতিগুলির প্রিরিয়ারগুলি এবং পার্থক্যের পোস্টেরিয়র বিতরণের ডেটাতে শর্তাধীন হিসাবে গণনা করা।
আপনার মডেলটি কী (উদাহরণস্বরূপ স্বাভাবিক, ধ্রুবক বৈকল্পিক) বলতে হবে এবং তারপরে (কমপক্ষে) কিছুটা আগে পার্থক্য করার জন্য এবং বৈকল্পিকতার জন্য পূর্বের প্রয়োজন। ঘুরতে ঘুরতে আপনারা সেই প্রবীণদের পরামিতিগুলিতে প্রিয়ার থাকতে পারেন। অথবা আপনি ধ্রুব বৈকল্পিকতা ধরে নাও নিতে পারেন। অথবা আপনি স্বাভাবিকতা ছাড়া অন্য কিছু ধরে নিতে পারেন।