如何推导用 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)
回归方程输出为黑线。这是最合适的,但有些值并没有很好地代表。
仔细看也不是直线
我在 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)
回归方程输出为黑线。这是最合适的,但有些值并没有很好地代表。
仔细看也不是直线