我最近遇到了一种情况,我知道分布尾部的一些概率点,我想“拟合”一个通过尾部这些点的分布。我意识到这很混乱而且不太准确,并且受到概念问题的困扰。但是,请相信我,我真的很想这样做。
如此有效地,我知道 CDF 尾部的一些点x
是值和该值y
的概率或更小。这是用于说明我的数据的 R 代码:
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)
然后我创建一个函数来最小化我的数据和使用pbeta
. 我使用 SSE 作为拟合指标,然后使用-sum
. 我将初始猜测作为第一个参数optim
,(9, .8)
尽管我已经尝试过不同的猜测并且我总是得到相同的结果。我使用的出发点猜测来自于手动设置看起来很接近的参数。
# 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
下面我用红色绘制了“优化”的 beta 分布,用蓝色绘制了我的实际数据,用黑色绘制了手动调整的 beta 参数的初始猜测。
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')
我无法理解正在发生的事情,optim
无法给出一个比我开始猜测更糟糕的解决方案。我计算了我的起始猜测与optim
解决方案的 SSE,看起来我的猜测有一个更大的 -SSE:
# 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
使用过去的历史作为我的贝叶斯先验,我的猜测是我误解optim
或输入不正确的输入。但是,我无法理解发生了什么。任何提示将非常感谢。
我尝试过使用CG
优化方法,但结果并没有明显的不同,而且看起来仍然没有我最初的猜测那么好。
out <- optim(c(9,.8), beta_func, method="CG", x=x)
out <- out$par
print(out)
#> [1] 2.287611 11.124736