Sering terjadi bahwa interval kepercayaan dengan cakupan 95% sangat mirip dengan interval kredibel yang mengandung 95% dari kepadatan posterior. Ini terjadi ketika yang sebelumnya seragam atau hampir seragam dalam kasus yang terakhir. Dengan demikian interval kepercayaan sering dapat digunakan untuk memperkirakan interval yang kredibel dan sebaliknya. Yang penting, kita dapat menyimpulkan dari hal ini bahwa kesalahan interpretasi yang keliru dari interval kepercayaan sebagai interval yang kredibel memiliki sedikit atau tidak ada kepentingan praktis untuk banyak kasus penggunaan sederhana.
Ada sejumlah contoh di luar sana kasus di mana ini tidak terjadi, namun mereka semua tampaknya dicintai oleh pendukung statistik Bayesian dalam upaya untuk membuktikan ada sesuatu yang salah dengan pendekatan yang sering terjadi. Dalam contoh-contoh ini, kita melihat interval kepercayaan berisi nilai-nilai yang tidak mungkin, dll yang seharusnya menunjukkan bahwa mereka tidak masuk akal.
Saya tidak ingin membahas kembali contoh-contoh itu, atau diskusi filosofis tentang Bayesian vs Frequentist.
Saya hanya mencari contoh yang sebaliknya. Apakah ada kasus di mana interval kepercayaan dan kredibilitas berbeda secara substansial, dan interval yang disediakan oleh prosedur kepercayaan jelas lebih unggul?
Untuk memperjelas: Ini tentang situasi ketika interval yang kredibel biasanya diharapkan bertepatan dengan interval kepercayaan yang sesuai, yaitu ketika menggunakan flat, seragam, dll. Saya tidak tertarik pada kasus di mana seseorang memilih yang sebelumnya buruk.
EDIT: Menanggapi jawaban @JaeHyeok Shin di bawah, saya harus tidak setuju bahwa contohnya menggunakan kemungkinan yang benar. Saya menggunakan perhitungan bayesian perkiraan untuk memperkirakan distribusi posterior yang benar untuk theta di bawah ini di R:
### 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))
Ini adalah interval kredibel 95%:
> as.numeric(hdi(chain[, 1], credMass = 0.95))
[1] -1.400304 1.527371
EDIT # 2:
Ini adalah pembaruan setelah komentar @JaeHyeok Shin. Saya mencoba untuk membuatnya sesederhana mungkin tetapi skrip menjadi sedikit lebih rumit. Perubahan utama:
- Sekarang menggunakan toleransi 0,001 untuk rata-rata (itu 1)
- Peningkatan jumlah langkah hingga 500 ribu untuk memperhitungkan toleransi yang lebih kecil
- Mengurangi sd distribusi proposal menjadi 1 untuk memperhitungkan toleransi yang lebih kecil (10)
- Menambahkan kemungkinan rnorm sederhana dengan n = 2k untuk perbandingan
- Menambahkan ukuran sampel (n) sebagai statistik ringkasan, atur toleransi ke 0,5 * n_target
Ini kodenya:
### 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)
Hasilnya, di mana hdi1 adalah "kemungkinan" saya dan hdi2 adalah rnorm sederhana (n, theta, 1):
> 2*1.96/sqrt(2e3)
[1] 0.08765386
> diff(hdi1)
[1] 1.087125
> diff(hdi2)
[1] 0.07499163
Jadi setelah menurunkan toleransi secukupnya, dan dengan mengorbankan banyak lagi langkah MCMC, kita dapat melihat lebar CRI yang diharapkan untuk model rnorm.