逐行迭代求解最优ratio值:R语言预测值加权拟合需求
R语言求解最优ratio值的解决方案
问题分析
我们需要为数据框的每一行计算ratio值,使得result = ratio * pred_1 + (1-ratio)*pred_2尽可能接近value_1;若计算出的ratio为负数,则将其设为0。
代数推导(高效解法)
直接通过代数变形求解精确解,无需迭代:
- 从目标等式出发:
ratio * pred_1 + (1-ratio)*pred_2 = value_1 - 展开整理:
ratio*(pred_1 - pred_2) = value_1 - pred_2 - 得到
ratio的表达式:ratio = (value_1 - pred_2) / (pred_1 - pred_2) - 边界处理:若计算出的
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
相关产品推荐
相关产品推荐

