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

如何在RStudio中执行Clark-West样本外检验?求LM模型验证方案

问题解决与模型检验方案

1. 修复forecast_comparison函数的缺失值错误

这个错误的核心原因是输入数据存在缺失值,或者变量选择参数包含缺失值,处理步骤如下:

  • 清理数据中的缺失值:用na.omit()直接移除含NA的行,或用dplyr::drop_na()指定清理模型用到的变量列:
    # 清理全数据集缺失值
    cleaned_data <- na.omit(your_platinum_data)
    # 仅清理模型涉及的变量列
    cleaned_data <- your_platinum_data %>% dplyr::drop_na(platinum_price, predictor1, predictor2)
    
  • 验证变量参数:调用forecast_comparison时,确保actual、forecasts指定的列名在数据集中存在且无缺失,避免传入含NA的列选择向量。

2. 样本外预测效果检验的可行方案

方案一:规范使用OOS包流程

先按时间顺序拆分样本(价格数据需避免数据泄露),再生成预测并对比:

# 拆分训练集与测试集(前80%训练,后20%测试)
train_idx <- 1:floor(nrow(cleaned_data)*0.8)
train_data <- cleaned_data[train_idx,]
test_data <- cleaned_data[-train_idx,]

# 训练线性模型并生成预测
lm_model <- lm(platinum_price ~ ., data = train_data)
lm_forecast <- predict(lm_model, newdata = test_data)

# 生成零收益模型预测(下一期价格等于当期价格)
zero_forecast <- c(train_data$platinum_price[nrow(train_data)], test_data$platinum_price[-nrow(test_data)])

# 整理对比数据并调用函数
comparison_df <- data.frame(
  actual = test_data$platinum_price,
  lm_pred = lm_forecast,
  zero_pred = zero_forecast
)

library(OOS)
forecast_comparison(comparison_df, actual = "actual", forecasts = c("lm_pred", "zero_pred"))

方案二:手动计算检验指标(不依赖OOS包)

如果仍遇到包的问题,可手动计算核心指标并做统计检验:

  1. 计算预测误差:
    lm_error <- test_data$platinum_price - lm_forecast
    zero_error <- test_data$platinum_price - zero_forecast
    
  2. 计算均方误差(MSE)、平均绝对误差(MAE):
    # MSE
    lm_mse <- mean(lm_error^2, na.rm = TRUE)
    zero_mse <- mean(zero_error^2, na.rm = TRUE)
    # MAE
    lm_mae <- mean(abs(lm_error), na.rm = TRUE)
    zero_mae <- mean(abs(zero_error), na.rm = TRUE)
    
    若线性模型的MSE/MAE更小,说明预测精度更高。
  3. Diebold-Mariano检验:用forecast包检验两个预测的误差是否存在显著差异:
    library(forecast)
    # 备择假设:线性模型误差显著小于零收益模型
    dm.test(lm_error, zero_error, alternative = "less")
    
    若p值<0.05,可认为线性模型预测显著更优。

方案三:滚动窗口预测(更适配时间序列)

时间序列数据用滚动窗口预测能更准确反映模型的样本外稳定性:

window_size <- floor(nrow(cleaned_data)*0.8)
n_test <- nrow(cleaned_data) - window_size
lm_errors <- numeric(n_test)
zero_errors <- numeric(n_test)

# 滚动训练与预测
for(i in 1:n_test){
  train_window <- cleaned_data[i:(i+window_size-1),]
  test_row <- cleaned_data[i+window_size,]
  
  lm_mod <- lm(platinum_price ~ ., data = train_window)
  lm_pred <- predict(lm_mod, newdata = test_row)
  zero_pred <- train_window$platinum_price[nrow(train_window)]
  
  lm_errors[i] <- test_row$platinum_price - lm_pred
  zero_errors[i] <- test_row$platinum_price - zero_pred
}

# 对比误差并检验
cat("线性模型MSE:", mean(lm_errors^2), "\n零收益模型MSE:", mean(zero_errors^2), "\n")
dm.test(lm_errors, zero_errors, alternative = "less")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:21:27