Làm thế nào để làm dự báo với việc phát hiện các ngoại lệ trong R? - Phương pháp và quy trình phân tích chuỗi thời gian


16

Tôi có dữ liệu chuỗi thời gian hàng tháng và muốn thực hiện dự báo với việc phát hiện các ngoại lệ.

Đây là mẫu tập dữ liệu của tôi:

       Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
2006  7.55  7.63  7.62  7.50  7.47  7.53  7.55  7.47  7.65  7.72  7.78  7.81
2007  7.71  7.67  7.85  7.82  7.91  7.91  8.00  7.82  7.90  7.93  7.99  7.93
2008  8.46  8.48  9.03  9.43 11.58 12.19 12.23 11.98 12.26 12.31 12.13 11.99
2009 11.51 11.75 11.87 11.91 11.87 11.69 11.66 11.23 11.37 11.71 11.88 11.93
2010 11.99 11.84 12.33 12.55 12.58 12.67 12.57 12.35 12.30 12.67 12.71 12.63
2011 12.60 12.41 12.68 12.48 12.50 12.30 12.39 12.16 12.38 12.36 12.52 12.63

Tôi đã đề cập đến quy trình và phương pháp phân tích Timeseries bằng R , để thực hiện một loạt mô hình dự báo khác nhau, tuy nhiên nó có vẻ không chính xác. Ngoài ra, tôi không chắc chắn làm thế nào để kết hợp các tsoutliers vào nó.

Tôi đã có một bài viết khác liên quan đến yêu cầu của tôi về tsoutliers và mô hình và thủ tục arima ở đây là tốt.

Vì vậy, đây là mã của tôi hiện tại, tương tự như liên kết số 1.

Mã số:

product<-ts(product, start=c(1993,1),frequency=12)

#Modelling product Retail Price

#Training set
product.mod<-window(product,end=c(2012,12))
#Test set
product.test<-window(product,start=c(2013,1))
#Range of time of test set
period<-(end(product.test)[1]-start(product.test)[1])*12 + #No of month * no. of yr
(end(product.test)[2]-start(product.test)[2]+1) #No of months
#Model using different method
#arima, expo smooth, theta, random walk, structural time series
models<-list(
#arima
product.arima<-forecast(auto.arima(product.mod),h=period),
#exp smoothing
product.ets<-forecast(ets(product.mod),h=period),
#theta
product.tht<-thetaf(product.mod,h=period),
#random walk
product.rwf<-rwf(product.mod,h=period),
#Structts
product.struc<-forecast(StructTS(product.mod),h=period)
)

##Compare the training set forecast with test set
par(mfrow=c(2, 3))
for (f in models){
    plot(f)
    lines(product.test,col='red')
}

##To see its accuracy on its Test set, 
#as training set would be "accurate" in the first place
acc.test<-lapply(models, function(f){
    accuracy(f, product.test)[2,]
})
acc.test <- Reduce(rbind, acc.test)
row.names(acc.test)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.test <- acc.test[order(acc.test[,'MASE']),]

##Look at training set to see if there are overfitting of the forecasting
##on training set
acc.train<-lapply(models, function(f){
    accuracy(f, product.test)[1,]
})
acc.train <- Reduce(rbind, acc.train)
row.names(acc.train)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.train <- acc.train[order(acc.train[,'MASE']),]

 ##Note that we look at MAE, MAPE or MASE value. The lower the better the fit.

Đây là âm mưu dự báo khác nhau của tôi, có vẻ không đáng tin cậy / chính xác, thông qua việc so sánh "bộ thử nghiệm" màu đỏ và bộ "dự báo" màu xanh. Lô đất dự báo khác nhau Dự báo khác nhau

Độ chính xác khác nhau của các mô hình thử nghiệm và đào tạo tương ứng

Test set
                    ME      RMSE       MAE        MPE     MAPE      MASE      ACF1 Theil's U
theta      -0.07408833 0.2277015 0.1881167 -0.6037191 1.460549 0.2944165 0.1956893 0.8322151
expsmooth  -0.12237967 0.2681452 0.2268248 -0.9823104 1.765287 0.3549976 0.3432275 0.9847223
randomwalk  0.11965517 0.2916008 0.2362069  0.8823040 1.807434 0.3696813 0.4529428 1.0626775
arima      -0.32556886 0.3943527 0.3255689 -2.5326397 2.532640 0.5095394 0.2076844 1.4452932
struc      -0.39735804 0.4573140 0.3973580 -3.0794740 3.079474 0.6218948 0.3841505 1.6767075

Training set
                     ME      RMSE       MAE         MPE     MAPE      MASE    ACF1 Theil's U
theta      2.934494e-02 0.2101747 0.1046614  0.30793753 1.143115 0.1638029  0.2191889194        NA
randomwalk 2.953975e-02 0.2106058 0.1050209  0.31049479 1.146559 0.1643655  0.2190857676        NA
expsmooth  1.277048e-02 0.2037005 0.1078265  0.14375355 1.176651 0.1687565 -0.0007393747        NA
arima      4.001011e-05 0.2006623 0.1079862 -0.03405395 1.192417 0.1690063 -0.0091275716        NA
struc      5.011615e-03 1.0068396 0.5520857  0.18206018 5.989414 0.8640550  0.1499843508        NA

Từ độ chính xác của mô hình, chúng ta có thể thấy rằng mô hình chính xác nhất sẽ là mô hình theta. Tôi không chắc tại sao dự báo rất không chính xác và tôi nghĩ rằng một trong những lý do là tôi đã không xử lý "ngoại lệ" trong tập dữ liệu của mình, dẫn đến dự báo không tốt cho tất cả mô hình.

Đây là âm mưu ngoại lệ của tôi

Âm mưu ngoại lệ Ngoại lệ

đầu ra tsoutliers

ARIMA(0,1,0)(0,0,1)[12]                    

Coefficients:
        sma1    LS46    LS51    LS61    TC133   LS181   AO183   AO184   LS185   TC186    TC193    TC200
      0.1700  0.4316  0.6166  0.5793  -0.5127  0.5422  0.5138  0.9264  3.0762  0.5688  -0.4775  -0.4386
s.e.  0.0768  0.1109  0.1105  0.1106   0.1021  0.1120  0.1119  0.1567  0.1918  0.1037   0.1033   0.1040
       LS207    AO237    TC248    AO260    AO266
      0.4228  -0.3815  -0.4082  -0.4830  -0.5183
s.e.  0.1129   0.0782   0.1030   0.0801   0.0805

sigma^2 estimated as 0.01258:  log likelihood=205.91
AIC=-375.83   AICc=-373.08   BIC=-311.19

 Outliers:
    type ind    time coefhat  tstat
1    LS  46 1996:10  0.4316  3.891
2    LS  51 1997:03  0.6166  5.579
3    LS  61 1998:01  0.5793  5.236
4    TC 133 2004:01 -0.5127 -5.019
5    LS 181 2008:01  0.5422  4.841 
6    AO 183 2008:03  0.5138  4.592
7    AO 184 2008:04  0.9264  5.911
8    LS 185 2008:05  3.0762 16.038
9    TC 186 2008:06  0.5688  5.483
10   TC 193 2009:01 -0.4775 -4.624
11   TC 200 2009:08 -0.4386 -4.217
12   LS 207 2010:03  0.4228  3.746
13   AO 237 2012:09 -0.3815 -4.877
14   TC 248 2013:08 -0.4082 -3.965
15   AO 260 2014:08 -0.4830 -6.027
16   AO 266 2015:02 -0.5183 -6.442

Tôi muốn biết làm thế nào tôi có thể "phân tích" / dự báo dữ liệu của mình hơn nữa, với các bộ dữ liệu có liên quan này và phát hiện các ngoại lệ, v.v. Xin hãy giúp tôi xử lý các ngoại lệ cũng như dự báo của tôi.

Cuối cùng, tôi muốn biết cách kết hợp các dự báo mô hình khác nhau lại với nhau, như từ những gì @forecaster đã đề cập trong liên kết số 1, kết hợp mô hình khác nhau rất có thể sẽ dẫn đến dự báo / dự đoán tốt hơn.

EDITED

Tôi muốn kết hợp các ngoại lệ trong các mô hình khác là tốt.

Tôi đã thử một số mã, ví dụ.

forecast.ets( res$fit ,h=period,xreg=newxreg)
Error in if (object$components[1] == "A" & is.element(object$components[2], : argument is of length zero

forecast.StructTS(res$fit,h=period,xreg=newxreg)
Error in predict.Arima(object, n.ahead = h) : 'xreg' and 'newxreg' have different numbers of columns

Có một số lỗi được tạo ra và tôi không chắc chắn về mã chính xác để kết hợp các ngoại lệ như các biến hồi quy. Hơn nữa, làm thế nào để tôi làm việc với thetaf hoặc rwf, vì không có dự báo.theta hoặc dự báo.rwf?


1
Có lẽ bạn nên thực hiện một cách tiếp cận khác để nhận trợ giúp vì việc chỉnh sửa lại liên tục dường như không hiệu quả
IrishStat

Tôi đồng ý với @irishstat, cả hai câu trả lời dưới đây đều cung cấp câu trả lời trực tiếp cho câu hỏi của bạn và dường như ít được chú ý.
dự báo

Hãy thử đọc tài liệu về các chức năng cụ thể gây ra lỗi cho bạn, ETS và thetaf không có khả năng xử lý các biến hồi quy.
dự báo

Câu trả lời:


7

Câu trả lời này cũng liên quan đến điểm 6 và 7 của câu hỏi khác của bạn .

Các ngoại lệ được hiểu là các quan sát không được mô hình giải thích, do đó vai trò của chúng trong các dự báo bị hạn chế theo nghĩa là sự hiện diện của các ngoại lệ mới sẽ không được dự đoán. Tất cả bạn cần làm là bao gồm các ngoại lệ này trong phương trình dự báo.

Trong trường hợp ngoại lệ phụ gia (ảnh hưởng đến một quan sát đơn lẻ), biến chứa ngoại lệ này sẽ chỉ đơn giản chứa đầy các số không, vì ngoại lệ được phát hiện cho một quan sát trong mẫu; trong trường hợp thay đổi cấp độ (thay đổi vĩnh viễn trong dữ liệu), biến sẽ được điền với các biến để giữ sự thay đổi trong dự báo.


Tiếp theo, tôi trình bày cách lấy dự báo trong R theo mô hình ARIMA với các ngoại lệ được phát hiện bởi 'tsoutliers'. Điều quan trọng là xác định đúng đối số newxregđược truyền vào predict.

(Điều này chỉ để minh họa câu trả lời cho câu hỏi của bạn về cách xử lý các ngoại lệ khi dự báo, tôi không giải quyết vấn đề cho dù mô hình kết quả hoặc dự báo là giải pháp tốt nhất.)

require(tsoutliers)
x <- c(
  7.55,  7.63,  7.62,  7.50,  7.47,  7.53,  7.55,  7.47,  7.65,  7.72,  7.78,  7.81,
  7.71,  7.67,  7.85,  7.82,  7.91,  7.91,  8.00,  7.82,  7.90,  7.93,  7.99,  7.93,
  8.46,  8.48,  9.03,  9.43, 11.58, 12.19, 12.23, 11.98, 12.26, 12.31, 12.13, 11.99,
 11.51, 11.75, 11.87, 11.91, 11.87, 11.69, 11.66, 11.23, 11.37, 11.71, 11.88, 11.93,
 11.99, 11.84, 12.33, 12.55, 12.58, 12.67, 12.57, 12.35, 12.30, 12.67, 12.71, 12.63,
 12.60, 12.41, 12.68, 12.48, 12.50, 12.30, 12.39, 12.16, 12.38, 12.36, 12.52, 12.63)
x <- ts(x, frequency=12, start=c(2006,1))
res <- tso(x, types=c("AO","LS","TC"))

# define the variables containing the outliers for
# the observations outside the sample
npred <- 12 # number of periods ahead to forecast 
newxreg <- outliers.effects(res$outliers, length(x) + npred)
newxreg <- ts(newxreg[-seq_along(x),], start = c(2012, 1))

# obtain the forecasts
p <- predict(res$fit, n.ahead=npred, newxreg=newxreg)

# display forecasts
plot(cbind(x, p$pred), plot.type = "single", ylab = "", type = "n", ylim=c(7,13))
lines(x)
lines(p$pred, type = "l", col = "blue")
lines(p$pred + 1.96 * p$se, type = "l", col = "red", lty = 2)  
lines(p$pred - 1.96 * p$se, type = "l", col = "red", lty = 2)  
legend("topleft", legend = c("observed data", 
  "forecasts", "95% confidence bands"), lty = c(1,1,2,2), 
  col = c("black", "blue", "red", "red"), bty = "n")

dự báo

Biên tập

Hàm predictnhư được sử dụng ở trên trả về dự báo dựa trên mô hình ARIMA đã chọn, ARIMA (2,0,0) được lưu trữ trong res$fitvà các ngoại lệ được phát hiện , res$outliers. Chúng ta có một phương trình mô hình như thế này:

yt= =Σj= =1mωjLj(B)Tôit(tj)+θ(B)φ(B)α(B)εt,εt~NTôiD(0,σ2),

trong đó là đa thức liên quan đến ngoại lệ thứ (xem tài liệu về hoặc bài báo gốc của Chen và Liu đã trích dẫn trong câu trả lời của tôi cho bạn câu hỏi khác); là một biến chỉ báo; và thuật ngữ cuối cùng bao gồm các đa thức xác định mô hình ARMA.LjjtsoutliersTôit


Vì vậy, những gì bạn đã làm là thêm các ngoại lệ vào đối số "newxreg". Đây có được gọi là hồi quy không? Tôi có thể biết việc sử dụng hồi quy không? Ngoài ra, thông qua việc sử dụng hàm hồi quy trong chức năng "dự đoán", liệu nó có còn sử dụng ARIMA không? hoặc nó là phương pháp dự báo khác nhau? Cảm ơn rất nhiều vì sự giúp đỡ của bạn trong việc sử dụng tsoutliers. = D
Ted

có thể kết hợp các ngoại lệ như là hồi quy để được sử dụng trong dự báo trong các mô hình khác không? như Mô hình kết cấu cơ bản, Theta, Đi bộ ngẫu nhiên và vv?
Ted

@Ted Có, các dự báo dựa trên mô hình ARMA. Tôi đã chỉnh sửa câu trả lời của tôi với một số chi tiết về điều này.
javlacalle

Bạn có thể kết hợp các biến hồi quy có chứa các hiệu ứng như dịch chuyển cấp, ngoại lệ phụ gia, ... trong các mô hình khác, ví dụ: đi bộ ngẫu nhiên, mô hình chuỗi thời gian cấu trúc, ... Nếu bạn đang hỏi cách sử dụng một số phần mềm để làm điều đó, bạn có lẽ nên hỏi nó trong một bài đăng khác và xem xét liệu câu hỏi có phù hợp hơn với các trang web khác như stackoverflow không .
javlacalle

ồ được thôi. Một câu hỏi khác là, bạn có biết nếu có sự khác biệt giữa sử dụng dự đoándự báo ? Nếu có, sự khác biệt là gì
Ted

2

Sử dụng một phần mềm mà tôi đã giúp phát triển một mô hình hợp lý cho 72 quan sát của bạn sẽ bao gồm một biến đổi công suất (nhật ký) vì phương sai lỗi có thể liên kết với giá trị mong đợi. Điều này cũng khá rõ ràng từ cốt truyện ban đầu, nơi mắt có thể phát hiện phương sai gia tăng ở cấp độ cao hơn. nhập mô tả hình ảnh ở đâyvới fact.fit/forecast nhập mô tả hình ảnh ở đâyvà một âm mưu của nhập mô tả hình ảnh ở đâyphần dư cuối cùng . Lưu ý các giới hạn tin cậy thực tế hơn có tính đến việc chuyển đổi sức mạnh. Mặc dù phản hồi này không sử dụng R nhưng nó sẽ nâng cao mức độ mà một mô hình hợp lý sử dụng R có thể bao gồm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.