Gần đây tôi đã gặp phải một tình huống mà tôi biết một vài điểm xác suất ở đuôi phân phối và tôi muốn "khớp" một phân phối đi qua các điểm này ở đuôi. Tôi nhận ra điều này là lộn xộn và không quá chính xác, và bị vướng vào các vấn đề khái niệm. Tuy nhiên, hãy tin tôi rằng tôi thực sự muốn làm điều này.
Vì vậy, hiệu quả tôi biết một số điểm trong phần đuôi của CDF x
là các giá trị và y
là xác suất của giá trị đó hoặc nhỏ hơn. Đây là mã R để minh họa dữ liệu của tôi:
x <- c(0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85)
y <- c(0.0666666666666667, 0.0625, 0.0659340659340659, 0.0563106796116505,
0.0305676855895196, 0.0436953807740325, 0.0267459138187221)
Sau đó, tôi tạo một hàm để giảm thiểu lỗi giữa dữ liệu của mình và CDF phân phối beta bằng cách sử dụng pbeta
. Tôi sử dụng SSE như một số liệu phù hợp sau đó giảm thiểu điều đó với -sum
. Tôi ném vào một đoán ban đầu là param đầu tiên optim
của (9, .8)
mặc dù tôi đã thử điều này với dự đoán khác nhau và tôi luôn luôn nhận được kết quả tương tự. Dự đoán điểm bắt đầu tôi sử dụng đến từ việc tự nấu các thông số bằng tay có vẻ gần.
# function to optomize with optim
beta_func <- function(par, x) -sum( (pbeta( x, par[1], par[2]) - y)**2 )
out <- optim(c(9,.8), beta_func, lower=c(1,.5), upper=c(200,200), method="L-BFGS-B", x=x)
out <- out$par
print(out)
#> [1] 0.90000 23.40294
Dưới đây tôi vẽ biểu đồ phân phối beta 'được tối ưu hóa' bằng màu đỏ, dữ liệu thực tế của tôi có màu xanh lam và một bàn tay được điều chỉnh bắt đầu đoán các tham số beta có màu đen.
plot(function(x) pbeta(x, shape1=out[1], shape2=out[2] ), 0, 1.5, col='red')
plot(function(x) pbeta(x, 9,.8), 0, 1.5, col='black', add=TRUE)
lines(x,y, col='blue')
Tôi không thể mò mẫm những gì đang diễn ra optim
để đưa ra một giải pháp tồi tệ hơn dự đoán ban đầu của tôi. Tôi đã tính SSE cho dự đoán bắt đầu của mình so với optim
giải pháp và có vẻ như dự đoán của tôi có -SSE lớn hơn nhiều:
# my guess
-sum( (pbeta( x, 9, .8) - y)**2)
#> [1] -0.03493344
# optim's output
-sum( (pbeta( x, .9, 23) - y)**2)
#> [1] -6.314587
Sử dụng lịch sử trong quá khứ như Bayesian của tôi trước đây, tôi đoán là tôi đang hiểu lầm optim
hoặc cho nó ăn đầu vào không đúng. Tuy nhiên, tôi không thể mò mẫm những gì đang diễn ra. Bất kỳ lời khuyên sẽ được đánh giá rất cao.
Tôi đã thử sử dụng CG
phương pháp tối ưu hóa, nhưng kết quả không có ý nghĩa khác biệt và vẫn không có vẻ tốt như dự đoán ban đầu của tôi.
out <- optim(c(9,.8), beta_func, method="CG", x=x)
out <- out$par
print(out)
#> [1] 2.287611 11.124736
optim
hiện đấu thầu.