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

逐行迭代求解最优ratio值:R语言预测值加权拟合需求

R语言求解最优ratio值的解决方案

问题分析

我们需要为数据框的每一行计算ratio值,使得result = ratio * pred_1 + (1-ratio)*pred_2尽可能接近value_1;若计算出的ratio为负数,则将其设为0。

代数推导(高效解法)

直接通过代数变形求解精确解,无需迭代:

  1. 从目标等式出发:ratio * pred_1 + (1-ratio)*pred_2 = value_1
  2. 展开整理:ratio*(pred_1 - pred_2) = value_1 - pred_2
  3. 得到ratio的表达式:
    ratio = (value_1 - pred_2) / (pred_1 - pred_2)
    
  4. 边界处理:若计算出的ratio < 0,则将其设为0,此时result = pred_2;否则用该ratio计算的result将精确等于value_1。

实现代码

方法1:使用tidyverse(dplyr)

library(dplyr)

df1 <- read.table(text = "value_1 pred_1  pred_2
20.4  15.188 13.15
20.3  4.849  12.54
20.2  1.115  26.54
20.3  13.136  15.65", header = TRUE)

df_result <- df1 %>%
  mutate(
    ratio = (value_1 - pred_2) / (pred_1 - pred_2),
    ratio = ifelse(ratio < 0, 0, ratio),
    result = ifelse(ratio == 0, pred_2, value_1)
  )

print(df_result)

方法2:基础R(无需额外包)

df1 <- read.table(text = "value_1 pred_1  pred_2
20.4  15.188 13.15
20.3  4.849  12.54
20.2  1.115  26.54
20.3  13.136  15.65", header = TRUE)

# 计算初始ratio
df1$ratio <- (df1$value_1 - df1$pred_2) / (df1$pred_1 - df1$pred_2)
# 修正负数ratio为0
df1$ratio <- ifelse(df1$ratio < 0, 0, df1$ratio)
# 计算result
df1$result <- ifelse(df1$ratio == 0, df1$pred_2, df1$value_1)

print(df1)

结果验证

运行代码后得到的结果与参考结果一致(注:参考数据中第四行的pred_2可能存在输入误差,原数据框中为15.65,对应result应为15.65而非16.6):

value_1 pred_1 pred_2     ratio result
1    20.4 15.188  13.15 3.5574092   20.4
2    20.3  4.849  12.54 0.0000000   12.54
3    20.2  1.115  26.54 0.2493609   20.2
4    20.3 13.136  15.65 0.0000000   15.65

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:52:44