C - C_Holt-Winters函数在R Holt-Winters函数中调用

时间:2017-11-10 19:24:34

标签: c r holtwinters

我试图理解在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

1 个答案:

答案 0 :(得分:0)

首先,您需要记住,HW需要级别趋势季节的组件的初始值,插入位置等级[0] 趋势[0] 赛季[0] ... 赛季[期间-1] 。重要的是要注意,初始季节组件是带有期间元素的向量。

HoltWinters函数开始估计时间序列的 i 值,然后计算级别趋势季节即可。变量 i0 对应于向量趋势级别中的下一个空位置,变量 s0 对应于下一个空位置在矢量季节

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

i0=1
s0=period

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