如何在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包)
如果仍遇到包的问题,可手动计算核心指标并做统计检验:
- 计算预测误差:
lm_error <- test_data$platinum_price - lm_forecast zero_error <- test_data$platinum_price - zero_forecast - 计算均方误差(MSE)、平均绝对误差(MAE):
若线性模型的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) - Diebold-Mariano检验:用
forecast包检验两个预测的误差是否存在显著差异:
若p值<0.05,可认为线性模型预测显著更优。library(forecast) # 备择假设:线性模型误差显著小于零收益模型 dm.test(lm_error, zero_error, alternative = "less")
方案三:滚动窗口预测(更适配时间序列)
时间序列数据用滚动窗口预测能更准确反映模型的样本外稳定性:
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
相关产品推荐
相关产品推荐

