Como encontrar um intervalo de 95% credível?


13

Estou tentando calcular o intervalo de 95% credível da seguinte distribuição posterior. Não consegui encontrar a função em R para isso, mas a abordagem abaixo está correta?

x <- seq(0.4,12,0.4)
px <-  c(0,0, 0, 0, 0, 0, 0.0002, 0.0037, 0.018, 0.06, 0.22 ,0.43, 0.64,0.7579, 0.7870, 0.72, 0.555, 0.37, 0.24, 0.11, 0.07, 0.02, 0.009, 0.005, 0.0001, 0,0.0002, 0, 0, 0)
plot(x,px, type="l")
mm <- sum(x*px)/sum(px)
var <- (sum((x)^2*px)/sum(px)) - (mm^2)
cat("95% credible interval: ", round(mm -1.96*sqrt(var),3), "-", round(mm + 1.96*sqrt(var),3),"\n")

1
Na verdade não - você assumiu uma distribuição normal e um intervalo igual sobre a média, nenhuma das quais é particularmente justificável neste contexto. De fato, você capturou cerca de da probabilidade, supondo que essa seja uma distribuição discreta e precise aumentar levemente seu intervalo para obter 95 % . Melhor seria pegar a região de maior densidade que é [ 4.4 , 8.0 ] se esta for uma distribuição discreta. Alternativamente, faça um intervalo para que a probabilidade de ficar abaixo dele seja de 2,5 % ou menos e a probabilidade de estar acima dele seja de 2,5 % ou menos, também [ 4.4 ,94%95%[4.4.,8.0]2.5%2.5% aqui. [4.4.,8.0]
Henry

Respostas:


24

Conforme observado por Henry , você está assumindo a distribuição normal e não há problema se seus dados seguirem a distribuição normal, mas estarão incorretos se você não puder assumir a distribuição normal para eles. Abaixo, descrevo duas abordagens diferentes que você pode usar para distribuição desconhecida, considerando apenas pontos de dados xe estimativas de densidade correspondentes px.

A primeira coisa a considerar é o que exatamente você deseja resumir usando seus intervalos. Por exemplo, você pode estar interessado nos intervalos obtidos usando quantis, mas também na região de maior densidade (veja aqui ou aqui ) da sua distribuição. Embora isso não deva fazer muita diferença (se houver) em casos simples, como distribuições simétricas e unimodais, isso fará diferença para distribuições mais "complicadas". Geralmente, os quantis fornecem um intervalo contendo massa de probabilidade concentrada em torno da mediana (os médios da sua distribuição), enquanto a região de maior densidade é uma região em torno dos modos100α%da distribuição. Isso ficará mais claro se você comparar as duas parcelas da figura abaixo - os quantis "cortam" a distribuição verticalmente, enquanto a região de maior densidade "corta" horizontalmente.

Quantiles vs intervalos HDR

A próxima coisa a considerar é como lidar com o fato de você ter informações incompletas sobre a distribuição (assumindo que estamos falando de distribuição contínua, você tem apenas alguns pontos e não uma função). O que você pode fazer é pegar os valores "como estão" ou usar algum tipo de interpolação ou suavização para obter os valores "entre".

Uma abordagem seria usar a interpolação linear (veja ?approxfunem R) ou, alternativamente, algo mais suave como splines (veja ?splinefunem R). Se você escolher essa abordagem, lembre-se de que os algoritmos de interpolação não têm conhecimento de domínio sobre seus dados e podem retornar resultados inválidos, como valores abaixo de zero, etc.

# grid of points
xx <- seq(min(x), max(x), by = 0.001)

# interpolate function from the sample
fx <- splinefun(x, px) # interpolating function
pxx <- pmax(0, fx(xx)) # normalize so prob >0

A segunda abordagem que você pode considerar é usar a distribuição de densidade / mistura do kernel para aproximar sua distribuição usando os dados que você possui. A parte complicada aqui é decidir sobre a largura de banda ideal.

# density of kernel density/mixture distribution
dmix <- function(x, m, s, w) {
  k <- length(m)
  rowSums(vapply(1:k, function(j) w[j]*dnorm(x, m[j], s[j]), numeric(length(x))))
}

# approximate function using kernel density/mixture distribution
pxx <- dmix(xx, x, rep(0.4, length.out = length(x)), px) # bandwidth 0.4 chosen arbitrary

Em seguida, você encontrará os intervalos de interesse. Você pode prosseguir numericamente ou por simulação.

1a) Amostragem para obter intervalos quantílicos

# sample from the "empirical" distribution
samp <- sample(xx, 1e5, replace = TRUE, prob = pxx)

# or sample from kernel density
idx <- sample.int(length(x), 1e5, replace = TRUE, prob = px)
samp <- rnorm(1e5, x[idx], 0.4) # this is arbitrary sd

# and take sample quantiles
quantile(samp, c(0.05, 0.975)) 

1b) Amostragem para obter a região de maior densidade

samp <- sample(pxx, 1e5, replace = TRUE, prob = pxx) # sample probabilities
crit <- quantile(samp, 0.05) # boundary for the lower 5% of probability mass

# values from the 95% highest density region
xx[pxx >= crit]

2a) Encontre quantis numericamente

cpxx <- cumsum(pxx) / sum(pxx)
xx[which(cpxx >= 0.025)[1]]   # lower boundary
xx[which(cpxx >= 0.975)[1]-1] # upper boundary

2b) Encontre a região de maior densidade numericamente

const <- sum(pxx)
spxx <- sort(pxx, decreasing = TRUE) / const
crit <- spxx[which(cumsum(spxx) >= 0.95)[1]] * const

Como você pode ver nas plotagens abaixo, no caso de distribuição simétrica unimodal, ambos os métodos retornam o mesmo intervalo.

Dois tipos de intervalos

100α%Pr(Xμ±ζ)αζ


Por que você faz uma amostra quando pode simplesmente calcular os quantis diretamente das informações fornecidas (usando qualquer método)?
whuber

1
@whuber porque é barato e fácil, mas editarei para descrever o cálculo de não simulação amanhã.
Tim

Oi Tim, Isso é muito útil. Não seria correto também apenas tirar o quantil da distibruição. (menor <- x [que (como.logical (diff (cumsum (px) / soma (px)> 0,025)))]) (superior <- x [que (como.logical (diff (cumsum (px) / soma) (px) <0.975))]))
user19758

@ user19758, verifique minha edição.
Tim

+1 As explicações, ilustrações e códigos adicionais estabelecem um alto padrão para respostas neste site. Obrigado!
whuber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.