Như Henry đã lưu ý , bạn đang giả sử phân phối bình thường và hoàn toàn ổn nếu dữ liệu của bạn tuân theo phân phối bình thường, nhưng sẽ không chính xác nếu bạn không thể giả sử phân phối bình thường cho nó. Dưới đây tôi mô tả hai cách tiếp cận khác nhau mà bạn có thể sử dụng cho phân phối không xác định chỉ được cung cấp dữ liệu x
và ước tính mật độ kèm theo px
.
Điều đầu tiên cần xem xét là chính xác những gì bạn muốn tóm tắt bằng cách sử dụng khoảng thời gian của bạn. Ví dụ: bạn có thể quan tâm đến các khoảng thu được bằng cách sử dụng lượng tử, nhưng bạn cũng có thể quan tâm đến khu vực mật độ cao nhất (xem tại đây hoặc tại đây ) trong phân phối của bạn. Mặc dù điều này sẽ không tạo ra sự khác biệt (nếu có) trong các trường hợp đơn giản như phân phối đối xứng, không chính thống, điều này sẽ tạo ra sự khác biệt cho các phân phối "phức tạp" hơn. Nói chung, các lượng tử sẽ cung cấp cho bạn khoảng thời gian chứa khối lượng xác suất tập trung quanh trung vị (trung bình phân phối của bạn), trong khi khu vực mật độ cao nhất là khu vực xung quanh các chế độ100α%của phân phối. Điều này sẽ rõ ràng hơn nếu bạn so sánh hai ô trên hình dưới đây - lượng tử "cắt" phân phối theo chiều dọc, trong khi vùng mật độ cao nhất "cắt" theo chiều ngang.
Điều tiếp theo cần xem xét là làm thế nào để đối phó với thực tế là bạn có thông tin không đầy đủ về phân phối (giả sử rằng chúng ta đang nói về phân phối liên tục, bạn chỉ có một loạt các điểm chứ không phải là một hàm). Những gì bạn có thể làm về nó là lấy các giá trị "nguyên trạng" hoặc sử dụng một số loại nội suy hoặc làm mịn để có được các giá trị "ở giữa".
Một cách tiếp cận sẽ là sử dụng phép nội suy tuyến tính (xem ?approxfun
trong R), hoặc cách khác là một cái gì đó trơn tru hơn như spline (xem ?splinefun
trong R). Nếu bạn chọn cách tiếp cận như vậy, bạn phải nhớ rằng các thuật toán nội suy không có kiến thức về miền về dữ liệu của bạn và có thể trả về kết quả không hợp lệ như các giá trị dưới 0, v.v.
# 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
Cách tiếp cận thứ hai mà bạn có thể xem xét là sử dụng phân phối hỗn hợp / mật độ hạt nhân để xấp xỉ phân phối của bạn bằng cách sử dụng dữ liệu bạn có. Phần khó khăn ở đây là quyết định về băng thông tối ưu.
# 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
Tiếp theo, bạn sẽ tìm thấy các khoảng quan tâm. Bạn có thể tiến hành bằng số hoặc bằng cách mô phỏng.
1a) Lấy mẫu để thu được các khoảng lượng tử
# 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) Lấy mẫu để thu được vùng mật độ cao nhất
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) Tìm số lượng tử
cpxx <- cumsum(pxx) / sum(pxx)
xx[which(cpxx >= 0.025)[1]] # lower boundary
xx[which(cpxx >= 0.975)[1]-1] # upper boundary
2b) Tìm vùng mật độ cao nhất bằng số
const <- sum(pxx)
spxx <- sort(pxx, decreasing = TRUE) / const
crit <- spxx[which(cumsum(spxx) >= 0.95)[1]] * const
Như bạn có thể thấy trên các ô bên dưới, trong trường hợp phân phối đối xứng, không đối xứng, cả hai phương thức đều trả về cùng một khoảng.
100α%Pr(X∈μ±ζ)≥αζ