在拟合 ARIMA(1,0,1) 模型之前,我已经转换了一些数据以使其平稳。 我特别想手动转换数据以更好地理解该过程。
我可以成功地拟合模型并做出 n 预测,我现在的问题是反向转换该数据,以便我的预测有意义。我无法使用原始函数的反函数,因为训练数据和预测数量可能总是不同的长度,这似乎与函数冲突。
remove_seasonality <- function(x) {
t <- seq_along(x)
sin_term <- sin(2 * pi * t / 52)
cos_term <- cos(2 * pi * t / 52)
lm_model <- lm(x ~ sin_term + cos_term)
residuals(lm_model)
}
subset_data_two$x_deseasonalized <- remove_seasonality(subset_data_two$Nitrogen_Dioxide)
detrended_data <- subset_data_two
split_data <- function(data, train_or_test, prop) {
ordered_data <- data[order(data$Date), ]
row_count <- nrow(ordered_data)
train_size <- round(prop * row_count)
if (train_or_test == "train") {
train_data <- ordered_data[1:train_size, ]
return(train_data)
} else if (train_or_test == "test") {
test_data <- ordered_data[(train_size + 1):row_count, ]
return(test_data)
} else {
stop("train_or_test must be either 'train' or 'test'")
}
}
training_data <- split_data(detrended_data, "train", 0.85)
test_data <- split_data(detrended_data, "test", 0.85)
# 3.0 Fit Model
fix <- training_data[,c("Date", "x_deseasonalized")]
fixed_tseries <- read.zoo(fix)
fix_model <- arima(fix$x_deseasonalized, order=c(1,0,1))
# 4.0 Forecast
forecasted <- forecast(fix_model, h = 3
您正在通过拟合线性模型并使用残差来消除季节性。 对于简单的正弦季节性,这是一种合理的方法,尽管不同形状的季节性可能需要额外的谐波,即更高频率的项。
去除季节性后,您将丢弃线性拟合的系数。 那时你就失去了恢复它的可能性。 您应该保存这些系数,或者根据原始数据重新计算它们,然后将使用该模型的预测添加到 ARIMA 模型的预测中。
您提到您正在分别使用训练和测试数据。 只要您使用基于相同协变量的预测,这应该不重要。 这从您的代码中并不明显,因为您使用数据索引作为协变量而不是一年中的一周,这是您的去趋势表明您正在使用的。 只要
train_size
带走确切的年数就可以了,否则就行不通。
所以我建议如下:为了消除趋势,从日期计算一年中的某一天或一年中的一周,并将其用作协变量。 然后您可以使用相同的方法对不同的数据集进行预测。
顺便说一句,如果您发布了可重现的代码,我可以发布演示代码,但您没有,所以我没有。