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

在R中优化函数变量A以实现平均误差为0的技术求助

优化A值使术后屈光平均误差为0的R实现

核心需求

调整变量A的取值,让Mean.Error函数计算的术后屈光平均误差趋近于0。以下是基于optimize函数的具体实现方案:

步骤说明

  1. 包装目标函数:optimize要求待优化函数仅接受单个参数(即我们要调整的A),因此需要将原Mean.Error包装为单参数函数,固定其他输入数据(L,K,I,SE)。
  2. 定义优化目标:我们需要让平均误差趋近于0,因此将目标设为平均误差的绝对值(或平方),通过最小化这个值找到最优A。
  3. 执行优化:使用optimize在合理区间内搜索最优A值。

完整代码示例

Constants <- list(IOL = list(A_to_pACD_a0 = -63.896, 
             A_to_pACD_a1 = 0.58357,
             A_to_S_a0 = -65.60,
             A_to_S_a1 = 0.5663,
             pACD_to_S_a0 = -3.595,
             pACD_to_S_a1 = 0.9704,
             A_to_ACD_a0 = -68.747, 
             A_to_ACD_a1 = 0.62467))
set.seed(123)
num_rows <- 100

L <- sample(22:26, num_rows, replace = TRUE)
K <- sample(40:45, num_rows, replace = TRUE)
A <- 118
I <- sample(16:28, num_rows, replace = TRUE)
SE <- runif(num_rows, min = -4, max = 4)

df <- data.frame(L, K, A, I, SE)

Mean.Error <- function(L, K, A, I, SE) {
  ACD <- Constants$IOL$A_to_pACD_a0 + Constants$IOL$A_to_pACD_a1 * A
  ELP <- 0.292 * L - 2.93 + (ACD - 3.94)
  Ref <- (1.336 / ((1.336 / (1336/(L-ELP-0.05)-I)) + (ELP+0.05)/1000)) - K
  results <- SE - Ref
  result <- mean(results)
  return(result)
}

# 1. 包装目标函数:仅传入A,其余参数使用df中的数据
target_func <- function(A) {
  abs(Mean.Error(df$L, df$K, A, df$I, df$SE))
}

# 2. 使用optimize搜索最优A,指定区间(根据业务合理设置,这里用100-130)
optim_result <- optimize(f = target_func, interval = c(100, 130), tol = 1e-6)

# 3. 查看结果
cat("最优A值:", round(optim_result$minimum, 4), "\n")
cat("对应的平均误差绝对值:", round(optim_result$objective, 6), "\n")

# 验证:用最优A计算平均误差
Mean.Error(df$L, df$K, optim_result$minimum, df$I, df$SE)

关键说明

  • optimize是R中专门用于单变量优化的函数,比optim更简洁高效,适合当前场景。
  • 搜索区间c(100,130)可根据实际业务中A的合理取值范围调整,确保覆盖最优解。
  • tol = 1e-6用于控制优化精度,数值越小结果越精确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:42:51