set.seed(123)
n <- 500
mu <- 0.25
phi1 <- 1.5
phi2 <- -0.75
yt <- numeric(n)
yt[1] <- 1
for (t in 2:n) {
yt[t] <- mu + phi1 * yt[t-1] + phi2 * yt[t-2] + rnorm(1)
}
yt_est <- yt[1:400]
y_est <- mean(yt_est)
i_est <- sum(diff(yt_est)^2) / (n-1)
d2_est <- sum((yt_est - y_est)^2) / n
yt_pred <- yt[401:500]
yt_iterative <- numeric(5)
yt_iterative[1] <- yt[400]
for (i in 2:5) {
yt_iterative[i] <- mu + phi1 * yt_iterative[i-1] + phi2 * yt[400 + i-2]
}
yt_direct <- mu + phi1 * yt[400:404] + phi2 * yt[399:403]
mse_iterative <- mean((yt_pred - yt_iterative)^2)
mse_direct <- mean((yt_pred - yt_direct)^2)
mae_iterative <- mean(abs(yt_pred - yt_iterative))
mae_direct <- mean(abs(yt_pred - yt_direct))
library(ggplot2)
df <- data.frame(yt = yt_pred, lower = yt_direct - 1.96 * sqrt(mse_direct), upper = yt_direct + 1.96 * sqrt(mse_direct))
df <- mutate(df, index = 401:500)
ggplot(df, aes(x = index, y = yt)) +
geom_line(color = "blue", size = 1) +
geom_line(aes(y = lower), color = "red", linetype = "dashed") +
geom_line(aes(y = upper), color = "red", linetype = "dashed") +
labs(x = "Index", y = "yt", title = "Forecast Limits") +
theme_minimal()
if (mse_iterative < mse_direct) {
approach <- "迭代预测"
} else if (mse_iterative > mse_direct) {
approach <- "直接预测"
} else {
approach <- "两种方法效果相同"
}
approach