Kết hợp phân phối để khớp với các điểm đã biết trên CDF


6

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 xlà các giá trị và ylà 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 optimcủ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')

nhập mô tả hình ảnh ở đây

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 optimgiả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 optimhoặ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 CGphươ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

1
Làm thế nào những điểm này có thể được "biết đến" đối với CDF và vẫn có xu hướng giảm khi tăng giá trị của x?
JimB

1
Tôi nghĩ đây là những vấn đề sẽ biến mất nếu bạn ước tính số lượng này bằng các công cụ thống kê tiêu chuẩn thay vì phát minh lại bánh xe.
Sycorax nói phục hồi Monica

@JimB nguồn của độ dốc xuống là hai lần. Ước tính của mỗi điểm đến từ một quy trình lấy mẫu khác nhau, do đó, có hai điều xảy ra: 1) nhiễu mẫu 2) vi phạm giả định iid về từng cơ sở. Tôi không quan tâm nhiều đến các vấn đề thống kê ở đây cũng như cố gắng thực optimhiện đấu thầu.
JD Long

@Sycorax đề xuất của bạn cho rằng các công cụ thống kê tiêu chuẩn sẽ hoạt động trong tình huống của tôi. Đó là một giả định không chính xác.
JD Long

Câu trả lời:


5

Tôi nghĩ rằng bạn đang vô tình cố gắng tối đa hóa các lỗi bình phương. Mặc định cho Optim () là để thu nhỏ hàm, do đó, dấu âm trong beta_func () của bạn dẫn đến việc tìm kiếm tối đa.

Nếu bạn sửa đổi chức năng của mình như vậy, bạn sẽ có được các giá trị gần hơn với dự đoán của mình:

beta_func2 <- function(par, x) sum( (pbeta( x, par[1], par[2]) - y)**2 ) 
out2 <- optim(c(9,.8), beta_func2, lower=c(1,.5), upper=c(200,200), method="L-BFGS-B", x=x)
out2 <- out2$par
print(out2)
[1] 11.04296  0.50000

Bạn có thể kiểm tra chức năng mới dựa trên các quan sát của bạn (trong đó out, x và y được xác định như trong ví dụ của bạn):

plot(x,(pbeta(x,out[1],out[2])), ylim=c(-.1,1), col="red", type="l")
points(x, (pbeta(x,9,0.8)), col="black", type="l")
points(x,(pbeta(x,out2[1],out2[2])), col="orange", type="l")
lines(x,y, col='blue')
title(main="Blue observed CDF, black guesstimate, gold optimized")

nhập mô tả hình ảnh ở đây


1
vâng, đó rõ ràng là sai lầm của tôi. Tôi nghĩ rằng tôi đã cố gắng thay đổi dấu hiệu, trong một ý thích bất chợt, nhưng rõ ràng tôi đã không. Tôi đã khá cố chấp với ý tưởng hành vi mặc định optimlà tối đa hóa. Cảm ơn!
JD Long
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.