Wie finde ich ein zu 95% glaubwürdiges Intervall?

13

Ich versuche, das 95% glaubwürdige Intervall der folgenden posterioren Verteilung zu berechnen. Ich konnte die Funktion in R dafür nicht finden, aber ist der Ansatz unten korrekt?

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")
user19758
quelle
1
Nicht wirklich - Sie haben eine Normalverteilung und ein gleiches Intervall für den Mittelwert angenommen, was in diesem Zusammenhang nicht besonders gerechtfertigt ist. Tatsächlich haben Sie ungefähr der Wahrscheinlichkeit erfasst , vorausgesetzt, dies ist eine diskrete Verteilung, und Sie müssen Ihr Intervall etwas erweitern, um 95 % zu erhalten . Besser wäre es, den Bereich mit der höchsten Dichte zu wählen, der [ 4.4 , 8.0 ] ist, wenn dies eine diskrete Verteilung ist. Alternativ kann ein Intervall gewählt werden, bei dem die Wahrscheinlichkeit, darunter zu liegen, 2,5 % oder weniger und die Wahrscheinlichkeit, darüber zu liegen, 2,5 % oder weniger beträgt. [ 4.4 ,94%95%[4.4,8.0]2.5%2.5% hier. [4.4,8.0]
Henry

Antworten:

23

Wie von Henry bemerkt , gehen Sie von einer Normalverteilung aus und es ist vollkommen in Ordnung, wenn Ihre Daten einer Normalverteilung folgen. Sie sind jedoch falsch, wenn Sie keine Normalverteilung für sie annehmen können. Im Folgenden beschreibe ich zwei verschiedene Ansätze, die Sie für eine unbekannte Verteilung verwenden können, wenn Sie nur Datenpunkte xund zugehörige Dichteschätzungen angeben px.

Als Erstes müssen Sie überlegen, was genau Sie mithilfe Ihrer Intervalle zusammenfassen möchten. Sie könnten beispielsweise an Intervallen interessiert sein, die mit Quantilen erhalten wurden, aber Sie könnten auch an Regionen mit der höchsten Dichte (siehe hier oder hier ) Ihrer Verteilung interessiert sein . Während dies in einfachen Fällen wie symmetrischen, unimodalen Verteilungen nicht viel (wenn überhaupt) ausmachen sollte, wird dies einen Unterschied für "kompliziertere" Verteilungen ausmachen. Im Allgemeinen erhalten Sie durch Quantile ein Intervall mit einer Wahrscheinlichkeitsmasse, die um den Median (die mittleren Ihrer Verteilung) konzentriert ist, während der Bereich mit der höchsten Dichte ein Bereich um die Moden ist100α%der Verteilung. Dies wird klarer, wenn Sie die beiden Darstellungen auf dem Bild unten vergleichen: Quantile "schneiden" die Verteilung vertikal, während der Bereich mit der höchsten Dichte sie horizontal "schneidet".

Quantile vs HDR-Intervalle

Als Nächstes sollten Sie sich überlegen, wie Sie mit der Tatsache umgehen sollen, dass Sie unvollständige Informationen über die Verteilung haben (vorausgesetzt, dass es sich um eine kontinuierliche Verteilung handelt, haben Sie nur eine Reihe von Punkten und keine Funktion). Was Sie dagegen tun können, ist, die Werte "wie sie sind" zu übernehmen oder eine Art Interpolation oder Glättung zu verwenden, um die "Zwischen" -Werte zu erhalten.

Ein Ansatz wäre die Verwendung einer linearen Interpolation (siehe ?approxfunin R) oder alternativ etwas Glatteres wie Splines (siehe ?splinefunin R). Wenn Sie sich für einen solchen Ansatz entscheiden, müssen Sie berücksichtigen, dass Interpolationsalgorithmen keine Domänenkenntnisse über Ihre Daten haben und ungültige Ergebnisse wie Werte unter Null usw. zurückgeben können.

# 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

Der zweite Ansatz, den Sie in Betracht ziehen könnten, ist die Verwendung der Verteilung der Kerndichte / -mischung, um Ihre Verteilung anhand der von Ihnen zur Verfügung gestellten Daten zu approximieren. Das Knifflige dabei ist, sich für eine optimale Bandbreite zu entscheiden.

# 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

Als nächstes werden Sie die Intervalle von Interesse finden. Sie können entweder numerisch oder durch Simulation vorgehen.

1a) Abtastung, um Quantilintervalle zu erhalten

# 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) Abtasten, um den Bereich mit der höchsten Dichte zu erhalten

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) Finden Sie Quantile numerisch

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

2b) Ermitteln Sie den Bereich mit der höchsten Dichte numerisch

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

Wie Sie in den folgenden Diagrammen sehen können, geben beide Methoden bei einer unimodalen, symmetrischen Verteilung dasselbe Intervall zurück.

Zwei Arten von Intervallen

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

Tim
quelle
Warum probierst du, wenn du die Quantile einfach direkt aus den gegebenen Informationen berechnen könntest (mit einer der beiden Methoden)?
Whuber
1
@whuber weil es billig und einfach ist, aber ich werde morgen die Nicht-Simulationsberechnung bearbeiten, um sie zu beschreiben.
Tim
Hallo Tim, das ist sehr hilfreich. Wäre es nicht richtig, auch nur das Quantil aus der Destillation zu entnehmen? (unteres <- x [welches (as.logical (diff (cumsum (px) / sum (px)> 0.025)))) (oberes <- x [welches (as.logical (diff (cumsum (px) / sum (px) <0,975)))])
user19758
@ user19758 Bitte überprüfen Sie meine Bearbeitung.
Tim
+1 Die zusätzlichen Erklärungen, Abbildungen und Codes setzen einen hohen Standard für die Antworten auf dieser Site. Vielen Dank!
Whuber