如何推导用 R 构建的非线性时间序列回归模型的方程?

How to derive the equation for a non-linear time series regression model built in R?

我在 R 中建立了一个非线性时间序列回归模型,我想将其写为一个方程,这样我就可以在 Excel 电子表格中对我的数据进行回测。我创建了一个 .ts 对象并使用 tslm 函数创建了一个模型,如下所示:

model16 <- tslm(production ~ date + I(date^2) + I(date^3) +
                   I(temp_neg_32^3) +
                   I(humidity_avg^3) +
                   I(dew_avg^3) +
                  below_freezing_min, 
                data = production_temp_no_outlier.ts)

我使用以下代码找到模型中每个变量的系数:

summary(model16)

输出如下:

所以,我的理解是我的模型方程应该是:

y = -7924000000 + 1268000*date -67.62*(date^2) + 0.001202*(date^3) +
0.04395*(temp_neg_32^3) + 0.008658*(humidity_avg^3) -0.03762*(dew_avg^3) + -11930*below_freezing_min

但是,每当我将数据代入该方程式时,输出就完全消失了——它与我基于该模型在 R 中构建的拟合曲线可视化没有任何共同之处。所以我显然做错了什么。如果有人能帮助指出我的错误,我将不胜感激!

这种回归的使用不会给你精确拟合,它给你最佳拟合线。决定系数是多少? (又名解释方差或 R^2)

看看这组数据(有点模仿你的例子)。

library(forecast)
library(tidyverse)

data("us_change", package = "fpp3")

fit <-  tslm(Production~Savings + I(Savings^2) + I(Savings^3) + I(Income^3) + Unemployment,
             data = ts(us_change))
summary(fit)

这里我提取了系数,所以我可以向你展示更多我的意思。然后我创建了一个函数来计算回归方程的结果。

cFit <- coefficients(fit)
#   (Intercept)       Savings  I(Savings^2)  I(Savings^3)   I(Income^3)  Unemployment 
#  5.221684e-01  6.321979e-03 -2.472784e-04 -6.376422e-06  7.029079e-03 -3.144743e+00  


regFun <- function(cFit, data){
  attach(data)
  f = cFit[[2]] * Savings + cFit[[3]] * Savings^2 + cFit[[4]] * Savings^3 + cFit[[5]] * Income^3 + Unemployment + cFit[[1]]
  detach(data)
  return(f)
}

以下是预测结果与实际结果的一些示例。

fitOne <- regFun(cFit, us_change[1,])
# [1] 1.455793 

us_change[1,]$Production
# [1] -2.452486 

fitTwo <- regFun(cFit, us_change[2,])
# [1] 1.066338 

us_change[2,]$Production
# [1] -0.5514595 

fitThree <- regFun(cFit, us_change[3,])
# [1] 1.08083 

us_change[3,]$Production
# [1] -0.3586518 

从此处的差异可以看出,我提供的输入并不能很好地解释产量。

现在看看当我画这个图时会发生什么:

plt <- ggplot(data = us_change %>% 
                mutate(Regression = regFun(cFit, us_change)),
       aes(x = Production)) +
  geom_point(aes(y = Savings, color = "Savings")) +
  geom_point(aes(y = Savings^2, color = "Savings^2")) + 
  geom_point(aes(y = Savings^3, color = "Savings^3")) +
  geom_point(aes(y = Savings^3, color = "Savings^3")) +
  geom_point(aes(y = Unemployment, color = "Unemployment")) +
  geom_line(aes(y = Regression, color = "Regression")) +  # regression line
  scale_color_viridis_d(end = .8) + theme_bw()

plotly::ggplotly(plt)

回归方程输出为黑线。这是最合适的,但有些值并没有很好地代表。

仔细看也不是直线