मैं बेस्ट इन आर जैसे प्लग एंड प्ले विधि की तलाश नहीं कर रहा हूं, बल्कि कुछ बायेसियन विधियों के गणितीय स्पष्टीकरण का उपयोग कर सकता हूं, जिसका उपयोग मैं दो नमूनों के बीच के अंतर का परीक्षण करने के लिए कर सकता हूं।
मैं बेस्ट इन आर जैसे प्लग एंड प्ले विधि की तलाश नहीं कर रहा हूं, बल्कि कुछ बायेसियन विधियों के गणितीय स्पष्टीकरण का उपयोग कर सकता हूं, जिसका उपयोग मैं दो नमूनों के बीच के अंतर का परीक्षण करने के लिए कर सकता हूं।
जवाबों:
यह एक अच्छा सवाल है, जो बहुत कुछ पॉप करने लगता है: लिंक 1 , लिंक 2 । पेपर बेयसियन एस्टीमेशन ने टी-टेस्ट को सुपरसीड किया जो कि कैम डीडसन.पिलोन ने बताया कि इस विषय पर एक उत्कृष्ट संसाधन है। यह हाल ही में प्रकाशित हुआ है, जो 2012 में प्रकाशित हुआ, जो मुझे लगता है कि इस क्षेत्र में मौजूदा रुचि के कारण है।
मैं दो नमूना टी-परीक्षण के लिए बायेसियन विकल्प के गणितीय स्पष्टीकरण को संक्षेप में प्रस्तुत करने का प्रयास करूंगा। यह सारांश BEST पेपर के समान है जो दो नमूनों में अंतर का उनके पिछले वितरण में अंतर की तुलना करके आकलन करते हैं (आर में नीचे समझाया गया है)।
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) का सिंटैक्स) की संभावना के रूप में पढ़ा जाता है। A दिया गया 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 * sd (पूलित) के साथ वितरित किया। मानक विचलन मैंने एक व्यापक घातांक वितरण के लिए निर्धारित किया है, क्योंकि मैं एक व्यापक वितरण चाहता था।
अब हम पोस्टीरियर बना सकते हैं
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 से अलग है।
mu1 <- results[,1]
mu2 <- results[,3]
hist(mu1 - mu2)
mean(mu1 - mu2 < 0)
[1] 0.9953689
इस विश्लेषण से मैं निष्कर्ष निकालूंगा कि 99.5% संभावना है कि नमूना 1 के लिए माध्य नमूना 2 के लिए माध्य से कम है।
बेयसियन दृष्टिकोण का एक फायदा, जैसा कि BEST पेपर में बताया गया है, यह है कि यह मजबूत सिद्धांत बना सकता है। ईजी क्या संभावना है कि sample.2 नमूना 1 से 5 यूनिट बड़ा है।
mean(mu2 - mu1 > 5)
[1] 0.9321124
हम यह निष्कर्ष निकालेंगे कि 93% संभावना है कि sample.2 का मतलब नमूना 1 से 5 यूनिट अधिक है। एक चौकस पाठक को यह दिलचस्प लगेगा क्योंकि हम जानते हैं कि सच्ची आबादी में क्रमशः 100 और 103 के साधन हैं। यह छोटे नमूने के आकार के कारण सबसे अधिक संभावना है, और संभावना के लिए एक सामान्य वितरण का उपयोग करने का विकल्प।
मैं इस उत्तर को एक चेतावनी के साथ समाप्त करूंगा: यह कोड शिक्षण उद्देश्यों के लिए है। एक वास्तविक विश्लेषण के लिए आरजेएजीएस का उपयोग करें और अपने नमूना आकार के आधार पर संभावना के लिए टी-वितरण फिट करें। यदि रुचि है तो मैं आरजेएजीएस का उपयोग करके एक टी-टेस्ट पोस्ट करूंगा।
EDIT: जैसा कि यहां अनुरोध किया गया है कि एक 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)
पायथन में कार्यान्वित उपयोगकर्ता 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 शामिल हैं या नहीं। इसमें डेटा पर सशर्त रूप से अंतर के पीछे वितरण के मापदंडों और संगणना पर प्रेक्षकों के लिए एक मॉडल के साथ शुरुआत शामिल होगी।
आपको यह कहने की आवश्यकता होगी कि आपका मॉडल क्या है (उदाहरण के लिए सामान्य, निरंतर विचरण), और फिर (कम से कम) कुछ पहले के साधनों में अंतर और विचरण के लिए एक पूर्व। आप बदले में उन पुजारियों के मापदंडों पर पुजारी हो सकते हैं। या आप निरंतर भिन्नता नहीं मान सकते हैं । या आप सामान्यता के अलावा कुछ और मान सकते हैं।