Câu trả lời:
Một ước tính mật độ hạt nhân là một phân phối hỗn hợp; cho mỗi quan sát, có một hạt nhân. Nếu hạt nhân là mật độ tỷ lệ, điều này dẫn đến một thuật toán đơn giản để lấy mẫu từ ước tính mật độ hạt nhân:
repeat nsim times:
sample (with replacement) a random observation from the data
sample from the kernel, and add the previously sampled random observation
Nếu (ví dụ) bạn đã sử dụng hạt nhân Gaussian, ước tính mật độ của bạn là hỗn hợp của 100 quy tắc, mỗi trung tâm tại một trong các điểm mẫu của bạn và tất cả đều có độ lệch chuẩn bằng với băng thông ước tính. Để vẽ mẫu, bạn chỉ có thể lấy mẫu bằng một trong những điểm mẫu của bạn (giả sử) và sau đó lấy mẫu từ một . Trong R:
# 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)
Nói một cách chính xác, do các thành phần của hỗn hợp có trọng số như nhau, bạn có thể tránh việc lấy mẫu với bộ phận thay thế và chỉ cần vẽ một mẫu có kích thước từ mỗi thành phần của hỗn hợp:
M = 10
hist(rnorm(N * M, mean = x, sd = bw))
Nếu vì lý do nào đó bạn không thể rút ra từ hạt nhân của mình (ví dụ: hạt nhân của bạn không phải là mật độ), bạn có thể thử lấy mẫu quan trọng hoặc MCMC . Ví dụ: sử dụng lấy mẫu quan trọng:
# 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 Với lời cảm ơn của tôi đến Glen_b, người đã đóng góp cho câu trả lời.