Come trovare un intervallo credibile del 95%?


13

Sto cercando di calcolare l'intervallo credibile al 95% della seguente distribuzione posteriore. Non sono riuscito a trovare la funzione in R, ma l'approccio sotto è corretto?

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
Non proprio: hai assunto una distribuzione normale e un intervallo uguale rispetto alla media, nessuno dei quali è particolarmente giustificabile in questo contesto. In effetti, hai catturato circa il della probabilità, supponendo che si tratti di una distribuzione discreta e devi ampliare leggermente l'intervallo per ottenere il . Meglio potrebbe essere prendere la regione a più alta densità che è se questa è una distribuzione discreta. In alternativa, prendi un intervallo in modo che la probabilità di essere al di sotto di esso sia del o inferiore e la probabilità di essere al di sopra del o meno, anche qui . 95 % [ 4.4 , 8.0 ] 2.5 % 2.5 % [ 4.4 , 8.0 ]94%95%[4.4,8.0]2.5%2.5%[4.4,8.0]
Henry,

Risposte:


24

Come notato da Henry , stai assumendo una distribuzione normale ed è perfettamente ok se i tuoi dati seguono una distribuzione normale, ma sarà errato se non puoi assumere una distribuzione normale per esso. Di seguito descrivo due diversi approcci che è possibile utilizzare per la distribuzione sconosciuta dati solo i punti dati xe le stime di densità associate px.

La prima cosa da considerare è esattamente cosa vuoi riassumere usando i tuoi intervalli. Ad esempio, potresti essere interessato agli intervalli ottenuti usando i quantili, ma potresti anche essere interessato alla regione a più alta densità (vedi qui o qui ) della tua distribuzione. Anche se questo non dovrebbe fare molta (o nessuna) differenza in casi semplici come distribuzioni simmetriche e unimodali, questo farà la differenza per distribuzioni più "complicate". Generalmente, i quantili ti daranno un intervallo contenente la massa di probabilità concentrata attorno alla mediana (il medio della tua distribuzione), mentre la regione a più alta densità è una regione attorno alle modalità100α%della distribuzione. Ciò sarà più chiaro se si confrontano i due grafici nell'immagine seguente: i quantili "tagliano" la distribuzione in verticale, mentre la regione a più alta densità "la taglia" in orizzontale.

Quantili vs intervalli HDR

La prossima cosa da considerare è come affrontare il fatto che hai informazioni incomplete sulla distribuzione (supponendo che stiamo parlando di distribuzione continua, hai solo un mucchio di punti piuttosto che una funzione). Quello che potresti fare al riguardo è prendere i valori "così come sono", o usare un qualche tipo di interpolazione, o smoothing, per ottenere i valori "nel mezzo".

Un approccio sarebbe quello di usare l'interpolazione lineare (vedi ?approxfunin R), o in alternativa qualcosa di più liscio come le spline (vedi ?splinefunin R). Se si sceglie tale approccio, è necessario ricordare che gli algoritmi di interpolazione non hanno conoscenza del dominio dei dati e possono restituire risultati non validi come valori inferiori a zero, ecc.

# 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

Il secondo approccio che potresti prendere in considerazione è usare la densità del kernel / distribuzione della miscela per approssimare la tua distribuzione usando i dati che hai. La parte difficile qui è decidere l'ampiezza di banda ottimale.

# 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

Successivamente, troverai gli intervalli di interesse. Puoi procedere in modo numerico o mediante simulazione.

1a) Campionamento per ottenere intervalli quantili

# 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) Campionamento per ottenere la regione a più alta densità

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) Trova i quantili numericamente

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

2b) Trova numericamente la regione di massima densità

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

Come puoi vedere nei grafici seguenti, in caso di distribuzione unimodale e simmetrica entrambi i metodi restituiscono lo stesso intervallo.

Due tipi di intervalli

Ovviamente, potresti anche provare a trovare l' intervallo attorno a un valore centrale tale che e utilizzare un qualche tipo di ottimizzazione per trovare appropriato , ma i due approcci descritti sopra sembrano essere usati più comunemente e sono più intuitivi.100α%Pr(Xμ±ζ)αζ


Perché campionate quando potreste semplicemente calcolare i quantili direttamente dalle informazioni fornite (usando entrambi i metodi)?
whuber

1
@whuber perché è economico e semplice, ma lo modificherò per descrivere il calcolo di non simulazione domani.
Tim

Ciao Tim, è molto utile. Non sarebbe corretto anche solo prendere il quantile dalla distibruzione. (inferiore <- x [quale (as.logico (diff (cumsum (px) / sum (px)> 0.025)))]) (superiore <- x [quale (as.logical (diff (cumsum (px) / sum (px) <0.975)))])
user19758

@ user19758, controlla la mia modifica.
Tim

+1 Le spiegazioni, le illustrazioni e il codice aggiuntivi definiscono uno standard elevato per le risposte su questo sito. Grazie!
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.