적용 범위가 95 % 인 신뢰 구간이 사후 밀도의 95 %를 포함하는 신뢰할 수있는 구간과 매우 유사한 경우가 종종 있습니다. 이는 후자의 경우 사전이 균일하거나 거의 균일 할 때 발생합니다. 따라서 신뢰 구간을 사용하여 신뢰할 수있는 구간을 추정 할 수 있으며 그 반대도 마찬가지입니다. 중요한 것은 신뢰할 수있는 구간으로 신뢰 구간을 잘못 해석하는 것이 많은 간단한 사용 사례에서 실질적으로 중요하지 않다는 결론입니다.
이런 일이 일어나지 않는 경우에는 여러 가지 예가 있지만, 모두 빈번한 접근 방식에 문제가 있음을 증명하기 위해 베이지안 통계의 지지자들이 선택하는 것처럼 보입니다. 이 예에서 신뢰 구간에는 불가능한 값 등이 포함되어 있으며 이는 의미가없는 것으로 표시됩니다.
나는 이러한 예나 베이지안 대 Frequentist에 대한 철학적 논의를 되돌아보고 싶지 않습니다.
나는 그 반대의 예를 찾고 있습니다. 신뢰 구간과 신뢰 구간이 실질적으로 다르고 신뢰 절차에 의해 제공된 구간이 분명히 우수한 경우가 있습니까?
명확히하기 : 이것은 신뢰할 수있는 간격이 일반적으로 해당 신뢰 구간과 일치 해야하는 상황, 즉 평평하고 균일 한 등을 사용할 때의 상황에 관한 것입니다. 누군가가 사전에 임의로 나쁜 것을 선택한 경우에는 관심이 없습니다.
편집 : 아래의 @ 재혁 신의 답변에 대한 응답으로, 그의 예가 올바른 가능성을 사용한다는 것에 동의하지 않아야합니다. 근사 베이지안 계산을 사용하여 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))
이것은 95 % 신뢰할 수있는 간격입니다.
> as.numeric(hdi(chain[, 1], credMass = 0.95))
[1] -1.400304 1.527371
편집 # 2 :
다음은 @JaeHyeok Shin의 의견에 대한 업데이트입니다. 가능한 한 간단하게 유지하려고하지만 스크립트가 조금 더 복잡해졌습니다. 주요 변경 사항 :
- 이제 평균에 대해 허용 오차 0.001 (1)을 사용합니다.
- 더 작은 공차를 설명하기 위해 단계 수를 500k로 증가
- 더 작은 공차를 고려하기 위해 제안서 배포의 sd를 1로 줄였습니다 (10).
- 비교를 위해 n = 2k 인 간단한 rnorm 가능성을 추가했습니다.
- 표본 크기 (n)를 요약 통계로 추가하고 공차를 0.5 * n_target으로 설정
코드는 다음과 같습니다.
### 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이 내 "우도"이고 hdi2가 간단한 rnorm (n, theta, 1) 인 결과 :
> 2*1.96/sqrt(2e3)
[1] 0.08765386
> diff(hdi1)
[1] 1.087125
> diff(hdi2)
[1] 0.07499163
따라서 공차를 충분히 낮추고 더 많은 MCMC 단계를 희생시키면서 rnorm 모델의 예상 CrI 너비를 볼 수 있습니다.