Genellikle% 95 kapsama alanına sahip bir güven aralığının, posterior yoğunluğun% 95'ini içeren güvenilir bir aralığa çok benzediğidir. Bu, önceki durumda üniform veya ikinci durumda üniformaya yakın olduğunda olur. Bu nedenle, güvenilir bir aralığa yaklaşmak için bir güven aralığı sıklıkla kullanılabilir veya tersi de geçerlidir. Önemli olarak, güvenilir bir aralık olarak bir güven aralığının çok kötü huylu olarak yorumlanmasının birçok basit kullanım vakası için çok az pratik pratik önemi olmadığı sonucuna varabiliriz.
Bunun gerçekleşmediği birkaç örnek var, ancak sık sık yaklaşımda yanlış bir şey olduğunu kanıtlamak için hepsi Bayesli istatistik taraftarları tarafından şifrelenmiş gibi görünüyor. Bu örneklerde, güven aralığının saçma olduklarını göstermesi beklenen imkansız değerler, vb. İçerdiğini görüyoruz.
Bu örneklere ya da Bayesian ve Frequentist hakkında felsefi bir tartışmaya geri dönmek istemiyorum.
Sadece tam tersinin örneklerini arıyorum. Güven ve güvenilir aralıkların önemli ölçüde farklı olduğu ve güven prosedürü tarafından sağlanan aralığın açıkça üstün olduğu durumlar var mı?
Açıklığa kavuşturmak için: Bu, güvenilir aralığın genellikle karşılık gelen güven aralığına denk gelmesinin beklendiği, yani düz, üniform vb. Birinin daha önce keyfi olarak kötü seçtiği durumla ilgilenmiyorum.
DÜZENLEME: @JaeHyeok Shin'in aşağıdaki cevabına yanıt olarak, örneğinin doğru olasılığı kullandığını kabul etmemeliyim. R'de aşağıdaki teta için doğru posterior dağılımı tahmin etmek için yaklaşık bayes hesaplamasını kullandım:
### Methods ###
# Packages
require(HDInterval)
# Define the likelihood
like <- function(k = 1.2, theta = 0, n_print = 1e5){
x = NULL
rule = FALSE
while(!rule){
x = c(x, rnorm(1, theta, 1))
n = length(x)
x_bar = mean(x)
rule = sqrt(n)*abs(x_bar) > k
if(n %% n_print == 0){ print(c(n, sqrt(n)*abs(x_bar))) }
}
return(x)
}
# Plot results
plot_res <- function(chain, i){
par(mfrow = c(2, 1))
plot(chain[1:i, 1], type = "l", ylab = "Theta", panel.first = grid())
hist(chain[1:i, 1], breaks = 20, col = "Grey", main = "", xlab = "Theta")
}
### Generate target data ###
set.seed(0123)
X = like(theta = 0)
m = mean(X)
### Get posterior estimate of theta via ABC ###
tol = list(m = 1)
nBurn = 1e3
nStep = 1e4
# Initialize MCMC chain
chain = as.data.frame(matrix(nrow = nStep, ncol = 2))
colnames(chain) = c("theta", "mean")
chain$theta[1] = rnorm(1, 0, 10)
# Run ABC
for(i in 2:nStep){
theta = rnorm(1, chain[i - 1, 1], 10)
prop = like(theta = theta)
m_prop = mean(prop)
if(abs(m_prop - m) < tol$m){
chain[i,] = c(theta, m_prop)
}else{
chain[i, ] = chain[i - 1, ]
}
if(i %% 100 == 0){
print(paste0(i, "/", nStep))
plot_res(chain, i)
}
}
# Remove burn-in
chain = chain[-(1:nBurn), ]
# Results
plot_res(chain, nrow(chain))
as.numeric(hdi(chain[, 1], credMass = 0.95))
Bu% 95 güvenilir aralıktır:
> as.numeric(hdi(chain[, 1], credMass = 0.95))
[1] -1.400304 1.527371
DÜZENLEME # 2:
@JaeHyeok Shin'ın yorumlarından sonra bir güncelleme. Mümkün olduğunca basit tutmaya çalışıyorum ama senaryo biraz daha karmaşık. Ana değişiklikler:
- Şimdi ortalama için 0.001'lik bir tolerans kullanarak (1 idi)
- Daha küçük toleransı hesaba katmak için adım sayısı 500 bine yükseltildi
- Daha küçük toleransı sağlamak için teklif dağıtımının SD'sini 1'e düşürdü (10'du)
- Karşılaştırma için n = 2k ile basit rnorm olasılığı eklendi
- Örnek boyutu (n) özet istatistik olarak ekledik, toleransı 0,5 * n_target olarak ayarlayın
İşte kod:
### Methods ###
# Packages
require(HDInterval)
# Define the likelihood
like <- function(k = 1.3, theta = 0, n_print = 1e5, n_max = Inf){
x = NULL
rule = FALSE
while(!rule){
x = c(x, rnorm(1, theta, 1))
n = length(x)
x_bar = mean(x)
rule = sqrt(n)*abs(x_bar) > k
if(!rule){
rule = ifelse(n > n_max, TRUE, FALSE)
}
if(n %% n_print == 0){ print(c(n, sqrt(n)*abs(x_bar))) }
}
return(x)
}
# Define the likelihood 2
like2 <- function(theta = 0, n){
x = rnorm(n, theta, 1)
return(x)
}
# Plot results
plot_res <- function(chain, chain2, i, main = ""){
par(mfrow = c(2, 2))
plot(chain[1:i, 1], type = "l", ylab = "Theta", main = "Chain 1", panel.first = grid())
hist(chain[1:i, 1], breaks = 20, col = "Grey", main = main, xlab = "Theta")
plot(chain2[1:i, 1], type = "l", ylab = "Theta", main = "Chain 2", panel.first = grid())
hist(chain2[1:i, 1], breaks = 20, col = "Grey", main = main, xlab = "Theta")
}
### Generate target data ###
set.seed(01234)
X = like(theta = 0, n_print = 1e5, n_max = 1e15)
m = mean(X)
n = length(X)
main = c(paste0("target mean = ", round(m, 3)), paste0("target n = ", n))
### Get posterior estimate of theta via ABC ###
tol = list(m = .001, n = .5*n)
nBurn = 1e3
nStep = 5e5
# Initialize MCMC chain
chain = chain2 = as.data.frame(matrix(nrow = nStep, ncol = 2))
colnames(chain) = colnames(chain2) = c("theta", "mean")
chain$theta[1] = chain2$theta[1] = rnorm(1, 0, 1)
# Run ABC
for(i in 2:nStep){
# Chain 1
theta1 = rnorm(1, chain[i - 1, 1], 1)
prop = like(theta = theta1, n_max = n*(1 + tol$n))
m_prop = mean(prop)
n_prop = length(prop)
if(abs(m_prop - m) < tol$m &&
abs(n_prop - n) < tol$n){
chain[i,] = c(theta1, m_prop)
}else{
chain[i, ] = chain[i - 1, ]
}
# Chain 2
theta2 = rnorm(1, chain2[i - 1, 1], 1)
prop2 = like2(theta = theta2, n = 2000)
m_prop2 = mean(prop2)
if(abs(m_prop2 - m) < tol$m){
chain2[i,] = c(theta2, m_prop2)
}else{
chain2[i, ] = chain2[i - 1, ]
}
if(i %% 1e3 == 0){
print(paste0(i, "/", nStep))
plot_res(chain, chain2, i, main = main)
}
}
# Remove burn-in
nBurn = max(which(is.na(chain$mean) | is.na(chain2$mean)))
chain = chain[ -(1:nBurn), ]
chain2 = chain2[-(1:nBurn), ]
# Results
plot_res(chain, chain2, nrow(chain), main = main)
hdi1 = as.numeric(hdi(chain[, 1], credMass = 0.95))
hdi2 = as.numeric(hdi(chain2[, 1], credMass = 0.95))
2*1.96/sqrt(2e3)
diff(hdi1)
diff(hdi2)
Hdi1 benim "olasılık" ve hdi2 basit rnorm (n, teta, 1) olduğu sonuçlar:
> 2*1.96/sqrt(2e3)
[1] 0.08765386
> diff(hdi1)
[1] 1.087125
> diff(hdi2)
[1] 0.07499163
Bu nedenle, toleransı yeterince düşürdükten ve daha birçok MCMC adımı pahasına, rnorm modeli için beklenen CrI genişliğini görebiliriz.