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

如何在R中用优化技术转换变量优化线性回归模型

在R中优化变量转换参数构建最优线性回归模型

需求说明

需要通过优化alpha和beta两个常数,按照指定公式转换自变量,构建线性回归模型以最大化R²(或最小化RMSE/MAE),复现Excel Solver的参数优化效果。当前使用初始参数得到的R²为0.8952383,目标是找到最优参数提升模型性能。

变量转换公式

转换规则为:

var_transformed = (var + lag(var_transformed) * beta)^alpha

其中lag(var_transformed)为转换后变量的前一期值。

R实现步骤与代码

1. 定义目标优化函数

根据优化目标(最大化R²/最小化RMSE),编写对应目标函数:

目标:最大化R²

由于R中优化器默认寻找最小值,我们返回负的R²,等价于最大化R²:

objective_r2 <- function(par, df) {
  alpha <- par[1]
  beta <- par[2]
  
  # 初始化转换变量(第一期无滞后项)
  var_transformed <- numeric(nrow(df))
  var_transformed[1] <- (df$var[1])^alpha
  
  # 循环计算后续期的转换变量
  for(i in 2:nrow(df)) {
    var_transformed[i] <- (df$var[i] + var_transformed[i-1] * beta)^alpha
  }
  
  # 拟合线性回归并提取R²
  model <- lm(y ~ var_transformed, data = df)
  r_squared <- summary(model)$r.squared
  
  # 返回负R²供优化器最小化
  return(-r_squared)
}

目标:最小化RMSE

直接计算模型预测的RMSE作为优化目标:

objective_rmse <- function(par, df) {
  alpha <- par[1]
  beta <- par[2]
  
  var_transformed <- numeric(nrow(df))
  var_transformed[1] <- (df$var[1])^alpha
  
  for(i in 2:nrow(df)) {
    var_transformed[i] <- (df$var[i] + var_transformed[i-1] * beta)^alpha
  }
  
  model <- lm(y ~ var_transformed, data = df)
  predictions <- predict(model)
  rmse <- sqrt(mean((df$y - predictions)^2))
  
  return(rmse)
}

2. 运行参数优化

使用R内置的optim()函数执行优化,设置初始参数与参数约束范围(避免不合理值):

# 假设你的数据框为df,包含自变量var和因变量y
# 初始参数(示例值,可替换为当前使用的参数)
initial_par <- c(1, 0)

# 优化R²:使用L-BFGS-B方法设置参数约束(alpha>0.1,beta∈[0,1])
optim_r2 <- optim(par = initial_par,
                  fn = objective_r2,
                  df = df,
                  method = "L-BFGS-B",
                  lower = c(0.1, 0),
                  upper = c(5, 1))

# 查看最优参数与对应的R²
cat("最优alpha:", optim_r2$par[1], "\n")
cat("最优beta:", optim_r2$par[2], "\n")
cat("最优R²:", -optim_r2$value, "\n")

# 优化RMSE(同理)
optim_rmse <- optim(par = initial_par,
                    fn = objective_rmse,
                    df = df,
                    method = "L-BFGS-B",
                    lower = c(0.1, 0),
                    upper = c(5, 1))

cat("最优RMSE:", optim_rmse$value, "\n")

3. 注意事项

  • 滞后项初始化:第一期的转换变量无滞后项,示例中直接用(df$var[1])^alpha,可根据数据特性调整。
  • 参数约束:设置lower和upper避免参数出现不合理值(如alpha为负导致复数、beta过大引发变量值爆炸)。
  • 优化方法选择:若参数无约束可使用默认的Nelder-Mead方法;有约束时优先选择L-BFGS-B。
  • 性能优化:若数据量极大,循环计算转换变量效率较低,可改用向量化操作或dplyr::accumulate()替代循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:48:38