R语言optim()优化qhalfnormal的scale参数返回多值问题问询
问题根源
你调用optim()时第一个入参par传入了长度为2的向量low_high,optim会默认你要优化长度为2的参数向量,因此返回两个参数值,不是函数自动遍历向量元素,是初始值传入错误导致的。
解决方案
单参数优化优先使用R内置的optimize()函数,专门用于一维无约束优化,不需要指定多维度初始值,只需要给定参数搜索区间即可。
正确示例代码
library(bayesmeta) low_high <- c(.1, 1) alpha <- c(.025, .975) # 定义损失函数:实际分位数和理论分位数的残差平方和 loss <- function(scale) { pred_quantiles <- qhalfnormal(alpha, scale = scale) sum((low_high - pred_quantiles)^2) } # 方法1:使用optimize做一维优化,指定scale的搜索区间为0.1到10 opt_1d <- optimize(loss, interval = c(0.1, 10)) # 输出最优scale值 cat("最优scale值:", opt_1d$minimum, "\n") # 验证结果 cat("对应分位数:", qhalfnormal(alpha, scale = opt_1d$minimum), "\n")
如果一定要使用optim,只需要给par传入单个数值的初始值即可:
# 方法2:使用optim,初始值传入长度为1的数值 opt_optim <- optim(par = 1, fn = loss) cat("optim得到的最优scale值:", opt_optim$par, "\n")
补充说明
半正态分布的两个分位数比值是固定值,你给定的0.1和1的比值(10倍)和半正态0.025/0.975分位数的理论比值(约71倍)不匹配,因此不存在能完全满足两个约束的scale值,上述优化结果是最小二乘准则下的最优近似解。
内容的提问来源于stack exchange,提问作者rnorouzian
相关产品推荐
相关产品推荐

