R中使用optimize拟合Beta分布参数时遇逻辑值缺失错误求助
问题:使用optimize函数拟合Beta分布参数时出现逻辑判断错误
我正在计算分布参数以获取对数似然值,用optim()函数时结果随初始值变化,于是尝试改用optimize()函数,但一直报以下错误:
Error in if (par[1] < 0 | par[2] < 0) { :
missing value where TRUE/FALSE needed
我试过在函数里把par[1]定义为a、par[2]定义为b替换到目标函数里,还是解决不了,求帮忙!
相关代码
目标函数
optim_cBeta <- function(par) { if ( par[1]< 0 | par[2] < 0) { output_cBeta = -Inf } else { output_cBeta = ( qbeta(0.025,par[1],par[2]) - 0.06)^2 + ( qbeta(0.5,par[1],par[2]) - 0.07 )^2 + ( qbeta(0.975,par[1],par[2]) - 0.08 )^2 } print(c(output_cBeta, par[1],par[2])) return(output_cBeta) }
调用代码
optimize(optim_cBeta, lower = c(0,120), upper = c(100,3000), maximum = FALSE)
问题原因与解决办法
- 核心问题:
optimize()只能处理单参数优化,你要优化的是Beta分布的两个参数(α和β),传入双参数范围后,函数会把par当作单个数值而非向量,导致par[1]和par[2]返回NA,触发逻辑判断错误。 - 正确解决思路:
- 双参数优化必须用
optim(),指定合适的初始值(比如选你设定区间内的中间值c(50, 1500)),同时用支持参数边界约束的方法(比如L-BFGS-B),这样不用手动写if判断也能限制参数非负:
如果保留原来的if判断也没问题,相当于双重约束。# 改用optim()做双参数约束优化 result <- optim(par = c(50, 1500), fn = optim_cBeta, method = "L-BFGS-B", lower = c(0, 0), upper = c(Inf, Inf)) - 别再用
optimize()处理双参数问题,这个函数从设计上就只支持单变量优化。
- 双参数优化必须用
- 小建议:把函数里的
print()语句删掉,优化过程中会输出大量内容,拖慢运行速度。
内容的提问来源于stack exchange,提问作者kayp
相关产品推荐
相关产品推荐

