Yanıtlar:
Bir çekirdek yoğunluğu tahmini bir karışım dağılımıdır; her gözlem için bir çekirdek var. Çekirdek ölçekli bir yoğunluksa, çekirdek yoğunluğu tahminden örnekleme için basit bir algoritmaya yol açar:
repeat nsim times:
sample (with replacement) a random observation from the data
sample from the kernel, and add the previously sampled random observation
(Örneğin) bir Gauss çekirdeği kullandıysanız, yoğunluk tahmininiz, her biri örnek noktalarınızdan birinde ortalanmış ve tümü standart bant sapması tahmini bant genişliğine eşit olan 100 normalin bir karışımıdır . Bir örnek çizmek için örnek noktalarınızdan birini (örneğin ) değiştirerek örnekleyebilir ve sonra . R cinsinden:x i N ( μ = x i , σ = 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)
Kesin olarak, karışımın bileşenlerinin eşit ağırlıklı olduğu göz önüne alındığında, yedek parça ile örneklemeden kaçınabilir ve sadece karışımın her bileşeninden boyutunda bir örnek çizebilirsiniz :
M = 10
hist(rnorm(N * M, mean = x, sd = bw))
Herhangi bir nedenden dolayı çekirdeğinizden çekemiyorsanız (örneğin, çekirdeğiniz bir yoğunluk değilse), önemli örnekleme veya MCMC ile deneyebilirsiniz . Örneğin, önemli örneklemeyi kullanarak:
# 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 Cevaba katkıda bulunan Glen_b'e teşekkürlerimi sunuyorum.