Eine Schätzung der Kerndichte ist eine Mischungsverteilung. Für jede Beobachtung gibt es einen Kernel. Wenn der Kernel eine skalierte Dichte ist, führt dies zu einem einfachen Algorithmus zum Abtasten aus der Kerneldichteschätzung:
repeat nsim times:
sample (with replacement) a random observation from the data
sample from the kernel, and add the previously sampled random observation
hxichN( μ = xich, σ= h )
# Original distribution is exp(rate = 5)
N = 1000
x <- rexp(N, rate = 5)
hist(x, prob = TRUE)
lines(density(x))
# Store the bandwith of the estimated KDE
bw <- density(x)$bw
# Draw from the sample and then from the kernel
means <- sample(x, N, replace = TRUE)
hist(rnorm(N, mean = means, sd = bw), prob = TRUE)
M
M = 10
hist(rnorm(N * M, mean = x, sd = bw))
Wenn Sie aus irgendeinem Grund nicht aus Ihrem Kernel ziehen können (z. B. Ihr Kernel ist keine Dichte), können Sie es mit einer Stichprobenauswahl oder MCMC versuchen . Verwenden Sie beispielsweise die Stichprobenerfassung für die Wichtigkeit:
# Draw from proposal distribution which is normal(mu, sd = 1)
sam <- rnorm(N, mean(x), 1)
# Weight the sample using ratio of target and proposal densities
w <- sapply(sam, function(input) sum(dnorm(input, mean = x, sd = bw)) /
dnorm(input, mean(x), 1))
# Resample according to the weights to obtain an un-weighted sample
finalSample <- sample(sam, N, replace = TRUE, prob = w)
hist(finalSample, prob = TRUE)
PS Mit meinem Dank an Glen_b, der zur Antwort beigetragen hat.