我发现你建议的方法,即采用前后投射的方法,很有趣。
可能值得指出的一件事是,在任何表现出混乱结构的系统中,预测可能在较短的时期内更准确。并非所有系统都是如此,例如阻尼摆可以由具有错误周期的函数建模,在这种情况下,所有中期预测都可能是错误的,而长期预测都将是非常准确,因为系统收敛到零。但在我看来,从问题中的图表来看,这可能是一个合理的假设。
这意味着我们最好更多地依赖缺失期早期的预测数据,而更多地依赖后期的回溯数据。最简单的方法是使用线性递减的权重进行预测,反之则相反:
> n <- [number of missing datapoints]
> w <- seq(1, 0, by = -1/(n+1))[2:(n+1)]
这在第一个元素上给出了一点权重。如果您只想使用第一个插值点的预测值,也可以使用 n-1,末尾不带下标。
> w
[1] 0.92307692 0.84615385 0.76923077 0.69230769 0.61538462 0.53846154
[7] 0.46153846 0.38461538 0.30769231 0.23076923 0.15384615 0.07692308
我没有你的数据,所以让我们在 R 中的 AirPassenger 数据集上试试这个。我将删除中心附近的两年期:
> APearly <- ts(AirPassengers[1:72], start=1949, freq=12)
> APlate <- ts(AirPassengers[97:144], start=1957, freq=12)
> APmissing <- ts(AirPassengers[73:96], start=1955, freq=12)
> plot(AirPassengers)
# plot the "missing data" for comparison
> lines(APmissing, col="#eeeeee")
# use the HoltWinters algorithm to predict the mean:
> APforecast <- hw(APearly)[2]$mean
> lines(APforecast, col="red")
# HoltWinters doesn't appear to do backcasting, so reverse the ts, forecast,
# and reverse again (feel free to edit if there's a better process)
> backwards <- ts(rev(APlate), freq=12)
> backcast <- hw(backwards)[2]$mean
> APbackcast <- ts(rev(backcast), start=1955, freq=12)
> lines(APbackcast, col='blue')
# now the magic:
> n <- 24
> w <- seq(1, 0, by=-1/(n+1))[2:(n+1)]
> interpolation = APforecast * w + (1 - w) * APbackcast
> lines(interpolation, col='purple', lwd=2)
还有你的插值。
当然,它并不完美。我猜这是因为数据前半部分的模式与后半部分的模式不同(早些年 7 月至 8 月的峰值并不那么强烈)。但正如您从图像中看到的那样,这显然比仅预测或仅靠背投要好。我想您的数据可能会得到稍微不太可靠的结果,因为没有如此强烈的季节性变化。
我的猜测是你也可以尝试这个,包括置信区间,但我不确定这样做的有效性。