在R中优化函数变量A以实现平均误差为0的技术求助
优化A值使术后屈光平均误差为0的R实现
核心需求
调整变量A的取值,让Mean.Error函数计算的术后屈光平均误差趋近于0。以下是基于optimize函数的具体实现方案:
步骤说明
- 包装目标函数:
optimize要求待优化函数仅接受单个参数(即我们要调整的A),因此需要将原Mean.Error包装为单参数函数,固定其他输入数据(L,K,I,SE)。 - 定义优化目标:我们需要让平均误差趋近于0,因此将目标设为平均误差的绝对值(或平方),通过最小化这个值找到最优
A。 - 执行优化:使用
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
相关产品推荐
相关产品推荐

