Accade spesso che un intervallo di confidenza con una copertura del 95% sia molto simile a un intervallo credibile che contiene il 95% della densità posteriore. Ciò accade quando il priore è uniforme o quasi uniforme in quest'ultimo caso. Pertanto, un intervallo di confidenza può essere spesso utilizzato per approssimare un intervallo credibile e viceversa. È importante sottolineare che, da ciò, possiamo concludere che l'interpretazione erroneamente diffamata di un intervallo di confidenza come intervallo credibile ha poca o nessuna importanza pratica per molti semplici casi d'uso.
Esistono numerosi esempi di casi in cui ciò non accade, tuttavia sembrano essere tutti criptati dai sostenitori delle statistiche bayesiane nel tentativo di dimostrare che c'è qualcosa di sbagliato nell'approccio frequentista. In questi esempi, vediamo che l'intervallo di confidenza contiene valori impossibili, ecc. Che dovrebbero dimostrare che sono assurdità.
Non voglio tornare indietro su quegli esempi o su una discussione filosofica tra Bayesiano e Frequentista.
Sto solo cercando esempi del contrario. Vi sono casi in cui gli intervalli di confidenza e credibilità sono sostanzialmente diversi e l'intervallo fornito dalla procedura di confidenza è chiaramente superiore?
Per chiarire: si tratta della situazione in cui ci si aspetta che l'intervallo credibile coincida con l'intervallo di confidenza corrispondente, cioè quando si usano priori piatti, uniformi, ecc. Non mi interessa il caso in cui qualcuno scelga un precedente arbitrariamente negativo.
EDIT: In risposta alla risposta di @JaeHyeok Shin di seguito, non sono d'accordo sul fatto che il suo esempio usi la probabilità corretta. Ho usato il calcolo bayesiano approssimativo per stimare la corretta distribuzione posteriore per theta di seguito in 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))
Questo è l'intervallo credibile del 95%:
> as.numeric(hdi(chain[, 1], credMass = 0.95))
[1] -1.400304 1.527371
EDIT # 2:
Ecco un aggiornamento dopo i commenti di @JaeHyeok Shin. Sto cercando di renderlo il più semplice possibile ma lo script è diventato un po 'più complicato. Principali modifiche:
- Ora usando una tolleranza di 0,001 per la media (era 1)
- Aumento del numero di passaggi a 500k per tenere conto di una tolleranza inferiore
- Diminuito il sd della distribuzione della proposta a 1 per tenere conto della tolleranza inferiore (era 10)
- Aggiunta la semplice probabilità rnorm con n = 2k per il confronto
- Aggiunta la dimensione del campione (n) come statistica riassuntiva, impostare la tolleranza su 0,5 * n_target
Ecco il codice:
### 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)
I risultati, dove hdi1 è la mia "probabilità" e hdi2 è la semplice rnorm (n, theta, 1):
> 2*1.96/sqrt(2e3)
[1] 0.08765386
> diff(hdi1)
[1] 1.087125
> diff(hdi2)
[1] 0.07499163
Quindi, dopo aver abbassato sufficientemente la tolleranza, e a spese di molti altri passaggi MCMC, possiamo vedere la larghezza CrI prevista per il modello rnorm.