通过平均数据点组合两个时间序列


10

我想通过最小化均方预测误差,将一个时间序列数据集的预测值和预测值(即过去的预测值)组合为一个时间序列。

假设我有一个2001-2010年的时间序列,与2007年之间有一个间隔。我已经能够使用2001-2007年数据(红线-称为Yf)来预测2007年,并能够使用2008-2009年数据进行反向预测(光蓝线-称为Yb)。

我想将Yf和的数据点合并为每个月的估算数据点Y_i。理想情况下,我希望获得权重,以使其最小化的均方预测误差(MSPE)。如果这不可能,那么我如何才能找到两个时间序列数据点之间的平均值? w ^ ÿ YbwYi

Yi=wYf+(1w)Yb

作为一个简单的例子:

tt_f <- ts(1:12, start = 2007, freq = 12)
tt_b <- ts(10:21, start=2007, freq=12)

tt_f
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007   1   2   3   4   5   6   7   8   9  10  11  12
tt_b
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007  10  11  12  13  14  15  16  17  18  19  20  21

我想要得到(仅显示平均值...理想情况下将MSPE最小化)

tt_i
     Jan Feb Mar Apr May Jun  Jul  Aug  Sep  Oct  Nov  Dec
2007 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5 13.5 14.5 15.5 16.5

在此处输入图片说明


什么是预测模型(ARIMA,ETS和其他)?(+1)对于方法建议,我曾经考虑过这种方法,但是在插值后一直处于Expectation-Maximization之内。原则上,学习期可能很重要,以便基于较大的信息(图中的红色预测)为模型提供更高的权重。某些准确性标准也可能对权重有用,而不是确定性地与时间序列长度关联。
Dmitrij Celov 2011年

很抱歉遗漏了预测模型。上面的一个简单地使用predict了预测包的功能。但是,我认为我将使用HoltWinters预测模型进行预测和回播。我有一个时间序列,计数小于50,并且尝试了Poisson回归预测-但由于某种原因,预测非常微弱。
OSlOSO

计数数据似乎正好在您显示的位置中断,预测和倒推也说明了同一件事。在泊松所做的回归上的时间趋势牛逼log(counts)t
Dmitrij Celov 2011年

您是否只有计数或一些没有NA值的其他相关时间序列?似乎使学习期成为MSPE可能会产生误导,因为子周期可以用线性趋势很好地描述,但是在错过的时期中,某处会出现下降,这实际上可能是任何一点。还应注意,由于预测在趋势上是共线的,因此它们的平均值将引入两个结构性突破,而不是看似一个。
2011年

抱歉,现在只能返回@Dmitij。您所说的“休息”是什么?我确实做了GLM回归的日志(计数)。并且计数数据中有一个子集的计数小于6,这将迫使我使用它。我只有伯爵。如果您看这个问题,您将对我拥有的数据有所了解。以上数字仅适用于“ 15up”年龄组。这有道理吗?
OSlOlSO 2011年

Answers:


0

假设您分别对预测和反向预测有平方预测误差,我建议这样做:令w为长度为12的向量,令m为您感兴趣的月份。

w=rep(NA,12);
for(w in 1:12){
w[m]=SPE_Backcast[m]/(SPE_Backcast[m]+SPE_Forecast[m]);
}

现在w是预测的权重,而1-w是预测的权重。


这似乎只是对最小值进行了更高的加权(以至于负数最终可能具有权重> 1)。重点是什么?另外,第二行s/w/m/
naught101

您将如何获得负平方预测误差?
Owe Jessen

3

您的目的是对时间序列执行固定间隔(FI)平滑。在时间的观测平滑值被定义为条件期望 Ŷ= Èý | ÿ 1 - [R t 其中符号 Y u v=[ Y u

Y^t:=E(Yt|Y1:r,Ys:n)
Yu:v:=[Yu,Yu+1,,Yv]是从时间到时间v的观测向量。以上,间隙被假定为从时间间隔- [R + 1小号- 1,和Ñ 是整个系列的长度。时间 牛逼是在差距和期望可以写成ÿ牛逼| 1 r s n 回顾其条件性质。uvr+1s1ntY^t|1:r,s:n

Y^tt

αtYtt

有趣的是,FI平滑可以写成两个过滤器的组合:一个向前和一个向后,得出您期望的那种公式,但是对于隐藏状态估计 (预测和反向),但不是为了观察ÿ αtYt。这被称为Rauch-Tung-Striebel滤波

至少在乘法版本中,像Holt-Winters这样的“临时”预测程序依赖于随机模型,没有简单的FI算法,因为它们不能以SS形式放置。可以通过使用SS模型来近似平滑公式,但是比起使用 带有对数转换的“ 结构时间序列”模型要简单得多。R stats软件包的“ KalmanSmooth”,“ tsSmooth”和“ StructTS”功能可以完成此任务。您应该看一下Harvey或R帮助页面中引用的Durbin和Koopman的书。平滑算法可以为估计的提供条件方差Yt并可以用于建立平滑间隔,该间隔通常在间隙的中间变大。但是请注意,结构模型的估计可能很困难。

AP <- log10(AirPassengers) 
## Fit a Basic Structural Model
fit <- StructTS(AP, type = "BSM")

## Fit with a gap
AP.gap <- AP
AP.gap[73:96] <- NA
fit.gap <- StructTS(AP.gap, type = "BSM", optim.control = list(trace = TRUE))

# plot in orginal (non-logged) scale
plot(AirPassengers, col = "black", ylab = "AirPass")
AP.missing <- ts(AirPassengers[73:96], start=1955, , freq=12)
lines(AP.missing, col = "grey", lwd = 1)

## smooth and sum 'level' and 'sea' to retrieve series
sm <- tsSmooth(fit.gap)
fill <- apply(as.matrix(sm[ , c(1,3)]), 1, sum)
AP.fill <- ts(fill[73:96], start=1955, , freq=12)
lines(10^AP.fill, col = "red", lwd = 1)

平滑填充


2

我发现您建议的方法,利用前后预测的方法很有趣。

可能需要指出的一件事是,在任何显示出混沌结构的系统中,预测都可能在较短的时间内更加准确。并非所有系统都如此,例如,阻尼摆可以用错误周期的函数建模,在这种情况下,所有中期预测都可能是错误的,而长期预测都将是错误的。非常精确,因为系统收敛到零。但是从问题的图表来看,在我看来,这可能是一个合理的假设。

这意味着我们最好不在失踪期的前半部分更多地依赖于预测数据,而在后半期更多地依赖于后备数据。最简单的方法是对预测使用线性递减的权重,对于后向预测则使用相反的权重:

> 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月峰值并不那么强)。但是,从图像中可以看出,这显然比仅进行预测或进行反向投射要好。我想您的数据可能不会获得可靠的结果,因为没有如此强烈的季节性变化。

我的猜测是您也可以尝试包括置信区间的操作,但是我不确定这样做的有效性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.