Tôi cần tham số hóa phân phối Weibull cho một số dữ liệu. Do đó, tôi sử dụng Ước tính khả năng tối đa (MLE) từ gói fitdistrplus trong R. Tuy nhiên, tôi muốn hiểu những gì được thực hiện trong gói, vì vậy ngoài việc sử dụng gói tôi đã thử hai giải pháp thủ công để kiểm tra este MLE được cung cấp bởi người phù hợp.
Tóm tắt, cách tiếp cận của tôi là:
(i) Sử dụng hàm fitdist với phương thức "MLE"
(ii) Giải các đạo hàm riêng của hàm khả năng
(iii) Giảm thiểu khả năng tiêu cực bằng cách sử dụng chức năng tối ưu
Đầu tiên, mô phỏng một số dữ liệu:
n <- 1e4
set.seed(1)
dat <- rweibull(n, shape=0.8, scale=1.2)
Cách tiếp cận 1: Áp dụng gói fitdistrplus:
library(fitdistrplus)
A1 <- fitdist(dat, "weibull", method="mle")$estimate
A1
shape scale
0.7914886 1.2032989
Cách tiếp cận 2:
Có mật độ Weibull
,
các dẫn xuất một phần là:
Tìm kiếm các gốc của các dẫn xuất một phần ở trên:
weib1 <- function(c) { 1/c - sum(dat^c*log(dat))/sum(dat^c) + 1/n*sum(log(dat)) }
shape <- uniroot(weib1, c(0,10), tol=1e-12)$root
scale <- (1/n*sum(dat^shape))^(1/shape)
A2 <- c(shape, scale)
A2
[1] 0.7914318 1.2033179
Cách tiếp cận 3: Tìm kiếm các tham số giảm thiểu khả năng log âm:
fobj <- function(params){
-sum(log(dweibull(dat, params[1], params[2])))
}
A3 <- optim(c(0.5, 1), fobj)$par
A3
[1] 0.7913756 1.2032748
So sánh các cách tiếp cận, các ước tính tham số (A1, A2, A3) khác nhau ở vị trí thập phân thứ tư. Xem xét tài liệu của fitdist, tôi đã dự kiến rằng A1 và A3 mang lại các ước tính giống nhau, vì cả hai đều sử dụng tối ưu.
Do đó, câu hỏi của tôi là:
Hàm mục tiêu được sử dụng bởi fitdist là gì và làm cách nào tôi có thể thay đổi cách tiếp cận 3 để mang lại các ước tính chính xác như fitdist? Và nói chung, cách tiếp cận ưa thích là gì, tôi cho rằng việc giải các đạo hàm riêng là cách tiếp cận sạch nhất?