Bạn đang cố gắng dự báo một chuỗi thời gian thành phần . Đó là, bạn có ba thành phần bị hạn chế nằm giữa 0 và 1 và thêm tối đa 1.
Bạn có thể giải quyết vấn đề này bằng cách sử dụng làm mịn theo cấp số nhân tiêu chuẩn, bằng cách sử dụng một chuyển đổi logistic tổng quát thích hợp. Có một bài thuyết trình về điều này của Koehler, Snyder, Ord & Beaumont tại Hội nghị chuyên đề quốc tế về dự báo năm 2010 , đã biến thành một bài báo ( Snyder et al., 2017, Tạp chí dự báo quốc tế ).
Hãy đi bộ mặc dù điều này với dữ liệu của bạn. Đọc dữ liệu thành một ma trận obs
của chuỗi thời gian:
obs <- structure(c(0.03333333, 0.03810624, 0, 0.03776683, 0.06606607,
0.03900325, 0.03125, 0, 0.04927885, 0.0610687, 0.03846154, 0,
0.06028636, 0.09646302, 0.04444444, 0.01111111, 0.02309469, 0.03846154,
0.03119869, 0.01201201, 0.02058505, 0.015625, 0, 0.01802885,
0.02290076, 0, 0, 0.03843256, 0.05144695, 0.06666667, 0.9555556,
0.9387991, 0.9615385, 0.9310345, 0.9219219, 0.9404117, 0.953125,
1, 0.9326923, 0.9160305, 0.9615385, 1, 0.9012811, 0.85209, 0.8888889
), .Dim = c(15L, 3L), .Dimnames = list(NULL, c("Series 1", "Series 2",
"Series 3")), .Tsp = c(1, 15, 1), class = c("mts", "ts", "matrix"
))
Bạn có thể kiểm tra xem cái này có hoạt động không bằng cách gõ
obs
εε
epsilon <- 0.0001
obs[obs<epsilon] <- epsilon
Bây giờ các hàng sửa đổi không tổng thành 1 nữa. Chúng ta có thể khắc phục điều đó (mặc dù tôi nghĩ rằng điều này có thể làm cho dự báo tồi tệ hơn):
obs <- obs/matrix(rowSums(obs),nrow=nrow(obs),ncol=ncol(obs),byrow=FALSE)
Bây giờ chúng tôi chuyển đổi dữ liệu theo trang 35 của bản trình bày:
zz <- log(obs[,-ncol(obs)]/obs[,ncol(obs)])
colnames(zz) <- head(colnames(obs),-1)
zz
Tải forecast
gói và đặt chân trời 5 điểm thời gian:
library(forecast)
horizon <- 5
Bây giờ mô hình và dự báo cột dữ liệu được chuyển đổi theo cột. Ở đây tôi chỉ đơn giản là gọi ets()
, mà sẽ cố gắng để phù hợp với một mô hình làm mịn theo cấp số nhân không gian trạng thái. Nó chỉ ra rằng nó sử dụng làm mịn theo cấp số nhân cho cả ba loạt, nhưng đặc biệt nếu bạn có nhiều hơn 15 khoảng thời gian, nó có thể chọn các mô hình xu hướng. Hoặc nếu bạn có dữ liệu hàng tháng, hãy giải thích cho R rằng bạn có tính thời vụ tiềm năng, bằng cách sử dụng ts()
với frequency=12
- sau đó ets()
sẽ xem xét các mô hình theo mùa.
baz <- apply(zz,2,function(xx)forecast(ets(xx),horizon=horizon)["mean"])
forecasts.transformed <- cbind(baz[[1]]$mean,baz[[2]]$mean)
Tiếp theo, chúng tôi quay lại dự báo theo trang 38 của bản trình bày:
forecasts <- cbind(exp(forecasts.transformed),1)/(1+rowSums(exp(forecasts.transformed)))
Cuối cùng, hãy vẽ lịch sử và dự báo:
plot(obs[,1],ylim=c(0,1),xlim=c(1,nrow(obs)+horizon),type="n",ylab="")
for ( ii in 1:ncol(obs) ) {
lines(obs[,ii],type="o",pch=19,col=ii)
lines(forecasts[,ii],type="o",pch=21,col=ii,lty=2)
}
legend("left",inset=.01,lwd=1,col=1:ncol(obs),pch=19,legend=colnames(obs))
EDIT: một bài báo về dự báo chuỗi thời gian thành phần vừa xuất hiện. Tôi chưa đọc nó, nhưng nó có thể được quan tâm.