You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,触发逻辑判断错误。
  • 正确解决思路:
    1. 双参数优化必须用optim(),指定合适的初始值(比如选你设定区间内的中间值c(50, 1500)),同时用支持参数边界约束的方法(比如L-BFGS-B),这样不用手动写if判断也能限制参数非负:
      # 改用optim()做双参数约束优化
      result <- optim(par = c(50, 1500), 
                      fn = optim_cBeta, 
                      method = "L-BFGS-B", 
                      lower = c(0, 0), 
                      upper = c(Inf, Inf))
      
      如果保留原来的if判断也没问题,相当于双重约束。
    2. 别再用optimize()处理双参数问题,这个函数从设计上就只支持单变量优化。
  • 小建议:把函数里的print()语句删掉,优化过程中会输出大量内容,拖慢运行速度。

内容的提问来源于stack exchange,提问作者kayp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:01:40