我试图理解在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
答案 0 :(得分:0)
首先,您需要记住,HW需要级别,趋势和季节的组件的初始值,插入位置等级[0] ,趋势[0] 和赛季[0] ... 赛季[期间-1] 。重要的是要注意,初始季节组件是带有期间元素的向量。
HoltWinters函数开始估计时间序列的 i 值,然后计算级别,趋势和季节即可。变量 i0 对应于向量趋势和级别中的下一个空位置,变量 s0 对应于下一个空位置在矢量季节。
在第一次迭代中,为i0和s0分配以下值:
i0=1
s0=period
从第二次迭代开始,它们会增加1,就像 i0 ++ 和 s0 ++ 一样。他们更新这些变量的方式似乎令人困惑,因为它是在变量 i 的函数中完成的,但这是有充分理由的:所有迭代中的语句都是相同的,包括第一个。