R 的 HoltWinters 函数中的“系数”代表什么?

机器算法验证 r 时间序列 指数平滑
2022-04-04 17:54:42

我在 R 中使用 HoltWinters 函数,我试图了解“系数”在该函数返回的对象中代表什么。当您查看 $ 时,它们似乎与返回的值没有任何明显的匹配

4个回答

+1 这令人困惑。如果您的时间序列有长度N和频率p,那么所谓的“系数”(可以像HW$coeffHW返回的对象一样访问HoltWinters)正是这些值a[N],b[N]s[Np+1],s[Np+2],s[N]其中这些是由 Holt Winters 帮助页面中的公式定义的,可以从 R 中使用?HoltWinters.

对于默认的加法模型,假设my.ts是一个具有正频率的时间序列对象p. 的价值观a[N1],b[N1]和所有更早的s[t]取决于s[Np]表中给出HoltWinters(my.ts)$fittedHoltWinters(my.ts)$coeff使用公式 从这些值计算

a[t]=α(Y[t]s[tp])+(1α)(a[t1]+b[t1])

b[t]=β(a[t]a[t1])+(1β)b[t1]

, ,t=Nα= HoltWinters(my.ts)$alphaβ= HoltWinters(my.ts)$beta

s[t]=γ(Y[t]a[t])+(1γ)s[tp]

\ , , 和t=Np+1,,Nα= HoltWinters(my.ts)$alphaβ= HoltWinters(my.ts)$betaγ= HoltWinters(my.ts)$gamma

这适用于(水平和趋势),但是当我对季节性进行计算时,我得到的值与输出中给出的值略有不同(在 5% 左右)。我希望有人可以编辑这个答案来解释季节性的情况。以下是该函数调用的函数的 C 代码链接:abhwHoltWinters

https://svn.r-project.org/R/trunk/src/library/stats/src/HoltWinters.c

a、b、s、alpha、beta 和 gamma 参数的含义在详细信息下的 HoltWinters 函数(?HoltWinters在 R 中尝试)的帮助中进行了描述

例如,加法模型是这样描述的:

Yhat[t+h] = a[t] + h * b[t] + s[t - p + 1 + (h - 1) mod p],
where a[t], b[t] and s[t] are given by
a[t] = α (Y[t] - s[t-p]) + (1-α) (a[t-1] + b[t-1])
b[t] = β (a[t] - a[t-1]) + (1-β) b[t-1]
s[t] = γ (Y[t] - a[t]) + (1-γ) s[t-p]

如果我们查看帮助,其中一个示例是:

(m <- HoltWinters(co2))
plot(m)
plot(fitted(m))

带输出:

Holt-Winters exponential smoothing with trend and additive seasonal component.

Call:
 HoltWinters(x = co2) 

Smoothing parameters:
 alpha:  0.5126484 
 beta :  0.009497669 
 gamma:  0.4728868 

Coefficients:
           [,1]
a   364.7616237
b     0.1247438
s1    0.2215275
s2    0.9552801
s3    1.5984744
s4    2.8758029
s5    3.2820088
s6    2.4406990
s7    0.8969433
s8   -1.3796428
s9   -3.4112376
s10  -3.2570163
s11  -1.9134850
s12  -0.5844250

图的输出(米)

图的输出(拟合(m))

现在让我们看看调用系数的输出:

coefficients(m)
          a           b          s1          s2          s3          s4 
364.7616237   0.1247438   0.2215275   0.9552801   1.5984744   2.8758029 
         s5          s6          s7          s8          s9         s10 
  3.2820088   2.4406990   0.8969433  -1.3796428  -3.4112376  -3.2570163 
        s11         s12 
 -1.9134850  -0.5844250 

这与之前生成的相同数量的输出完全对应。

考虑到帮助页面上的 , , , 和 的描述abs不清楚哪些alpha部分betagamma

我同意存在谜题。为了看到这个谜题,我考虑了 R 中可用的 co2 系列。答案很长。愿你只是我今天添加的*部分

我曾预料到

co2HWBis$coefficients[2]

等于

co2HW$fitted[length(co2HW$fitted[,3]),3]

即 coeff 等于最后估计的趋势。您可以在下面检查情况是否如此。然而

co2HW$fitted[length(co2HW$fitted[,3]),3]

等于如果您删除该系列的最后一个值,您将获得的系数,如下所示。我怀疑该系数以某种方式“向前写入”。如果你允许估计 beta,我觉得更令人费解的是,事情是不同的。

我阅读了源代码(http://svn.r-project.org/R/trunk/src/library/stats/R/HoltWinters.R),但我还不确定发生了什么。

这是完整的代码

    rm(list=ls()) 

    co2HW = HoltWinters(co2, alpha = 0.2, gamma = 0.2, beta = 0.5)
    # co2HW$coeff[2]
        co2HW$fitted[length(co2HW$fitted[,3]),3]

    co2Bis = window(co2,end=c(1997,11))
    co2HWBis = HoltWinters(co2Bis, alpha=0.2, gamma=0.2, beta=0.5)
    co2HWBis$coefficients[2] 
        # co2HWBis$fitted[length(co2HWBis$fitted[,3])-1,3]

    co2HW$beta*(co2HW$fitted[length(co2HW$fitted[,2]),2] -  
        co2HW$fitted[length(co2HW$fitted[,2])-1,2]) +
        (1 - co2HW$beta)*co2HW$fitted[length(co2HW$fitted[,3])-1,3]

    #####################



    co2HW = HoltWinters(co2, alpha = 0.2, gamma = 0.2)
    # co2HW$coeff[2]
        co2HW$fitted[length(co2HW$fitted[,3]),3]

    co2Bis = window(co2,end=c(1997,11))
    co2HWBis = HoltWinters(co2Bis, alpha=0.2, gamma=0.2)
    co2HWBis$coefficients[2] 
        # co2HWBis$fitted[length(co2HWBis$fitted[,3])-1,3]

    co2HW$beta*(co2HW$fitted[length(co2HW$fitted[,2]),2] -  
        co2HW$fitted[length(co2HW$fitted[,2])-1,2]) +
        (1 - co2HW$beta)*co2HW$fitted[length(co2HW$fitted[,3])-1,3]

* - 部分

...一晚后,我想我可以给出一个看起来像答案的答案。在我看来,问题在于表 co2HW$fitted 的时间安排。最后一行不是样本中最后一个时期的估计趋势水平和季节。系数是上一时期的估计水平、趋势和季节,但这些值未显示在表中。我希望以下代码令人信服

rm(list=ls()) 
x = co2
m = HoltWinters(x)
# m$fitted[length(m$fitted[,3]),3]

aux1 = m$alpha*( x[length(x)] - m$fitted[length(m$fitted[,3]),4]  ) + 
    ( 1 - m$alpha )*( m$fitted[length(m$fitted[,3]),3] + 
m$fitted[length(m$fitted[,3]),2] );
aux1
m$coeff[1]

aux2 = m$beta*(aux1 - m$fitted[length(m$fitted[,3]),2] ) +
     (1-m$beta)*m$fitted[length(m$fitted[,3]),3]
aux2
m$coeff[2]

m$coeff[14]
    aux3 = m$gamma*(x[length(x)] - aux1) + 
( 1 - m$gamma )*m$fitted[length(m$fitted[,3]),4]
aux3

我认为关于系数的关键点是,我在其他答案中看不到但可能错过了,它们是预测所依据的时间序列中最后一个时期的平滑水平和平滑趋势的值/制成; 并平滑了该时间序列最后 12 个月的季节性成分。

了解预测的拟合值表也有帮助。对于时间t对应的每一行,level和trend的值是时间t-1的平滑值,season的值是tp的平滑值。这些被添加以给出时间 t 的估计真实水平 Xhat。

我最近才开始使用 R,如果我的术语不完全准确,敬请见谅。