2

我试图理解在 R Holt-Winters 函数中调用的 C 函数。

我感到困惑的部分内容如下:

     for (i = *start_time - 1; i < *xl; i++) { 
56         /* indices for period i */ 
57         i0 = i - *start_time + 2; 
58         s0 = i0 + *period - 1; 
59 

60         /* forecast *for* period i */ 
61         xhat = level[i0 - 1] + (*beta > 0 ? trend[i0 - 1] : 0); 
62         stmp = *gamma > 0 ? season[s0 - *period] : (*seasonal != 1); 
63         if (*seasonal == 1) 
64             xhat += stmp; 
65         else 
66             xhat *= stmp; 

这看起来好像,如果“t”是 13 并且有 12 个季节性周期(即“周期”是 12),那么 i0 将是 1,s0 将是 12。然后 stmp 将采用基于“季节”的值" 来自时间 (s0-12) 的值,在本例中为时间 0。但这没有意义,因为 Holt-Winters 模型中的季节性分量来自(在本例中)之前的 12 个周期。

如果有人能解释 i0 和 s0 实际上是什么,以及我对此的理解失败的地方,我将不胜感激。

完整代码:

https://github.com/pierre/holt-winters/blob/master/holt-winters.c

4

1 回答 1

0

首先,您需要记住,硬件需要组件leveltrendseason的初始值,插入位置level[0]trend[0]season[0] ... season[period-1]。需要注意的是,初始季节分量是一个带有周期元素的向量。

HoltWinters 函数开始估计时间序列的第i个值,然后计算水平趋势季节的下一个值。变量i0对应向量trendlevel中的下一个空位置,变量s0对应向量season中的下一个空位置。

在第一次迭代中,为 i0 和 s0 分配了以下值:

i0=1
s0=period

从第二次迭代开始,它们会加一,就像i0++s0++一样。他们更新这些变量的方式似乎令人困惑,因为它是在变量i的函数中完成的,但这是有充分理由的:语句在所有迭代中都是相同的,包括第一次。

于 2017-11-24T07:52:48.980 回答