ฉันมีข้อมูลอนุกรมเวลารายเดือนและต้องการคาดการณ์ด้วยการตรวจจับค่าผิดปกติ
นี่คือตัวอย่างของชุดข้อมูลของฉัน:
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
ฉันได้อ้างถึงขั้นตอนและวิธีการวิเคราะห์ Timeseries โดยใช้ Rเพื่อทำชุดรูปแบบการพยากรณ์ที่แตกต่างกัน แต่ดูเหมือนว่าจะไม่ถูกต้อง นอกจากนี้ฉันไม่แน่ใจว่าจะรวม tsoutliers ลงในนั้นได้อย่างไร
ฉันได้โพสต์อีกครั้งเกี่ยวกับคำถามของฉันเกี่ยวกับการสร้างแบบจำลองนักออกแบบและขั้นตอนและขั้นตอนที่นี่เช่นกัน
ดังนั้นนี่คือรหัสของฉันในปัจจุบันซึ่งคล้ายกับลิงค์หมายเลข 1
รหัส:
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.
นี่คือพล็อตของการพยากรณ์ที่แตกต่างของฉันซึ่งดูไม่น่าเชื่อถือ / ถูกต้องมากนักผ่านการเปรียบเทียบชุด "ชุดทดสอบ" สีแดงและชุด "คาดการณ์" สีน้ำเงิน พล็อตของการคาดการณ์ที่แตกต่างกัน
ความแม่นยำที่แตกต่างกันของโมเดลการทดสอบและชุดการฝึกอบรมที่เกี่ยวข้อง
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
จากความถูกต้องของแบบจำลองเราจะเห็นได้ว่าแบบจำลองที่แม่นยำที่สุดคือแบบจำลอง theta ฉันไม่แน่ใจว่าทำไมการคาดการณ์จึงไม่ถูกต้องอย่างมากและฉันคิดว่าหนึ่งในเหตุผลที่เป็นเช่นนั้นฉันไม่ได้ปฏิบัติกับ "ค่าผิดปกติ" ในชุดข้อมูลของฉันทำให้การคาดการณ์ไม่ดีสำหรับทุกรุ่น
นี่คือแผนค่าผิดปกติของฉัน
เอาต์พุต 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
ฉันต้องการทราบว่าฉันจะ "วิเคราะห์" / คาดการณ์ข้อมูลของฉันเพิ่มเติมได้อย่างไรด้วยชุดข้อมูลที่เกี่ยวข้องเหล่านี้และการตรวจจับค่าผิดปกติ ฯลฯ โปรดช่วยฉันในการรักษาค่าผิดปกติของฉันด้วยเช่นกัน
ท้ายนี้ฉันอยากจะรู้วิธีผสมผสานตัวแบบพยากรณ์ต่าง ๆ เข้าด้วยกันเช่นเดียวกับสิ่งที่ @forecaster พูดถึงในลิงค์หมายเลข 1 การรวมตัวแบบที่แตกต่างกันจะทำให้การพยากรณ์ / พยากรณ์ดีขึ้น
แก้ไข
ฉันต้องการรวมค่าผิดปกติในรุ่นอื่นด้วย
ฉันลองใช้รหัสแล้วเช่น
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
มีข้อผิดพลาดเกิดขึ้นและฉันไม่แน่ใจเกี่ยวกับรหัสที่ถูกต้องเพื่อรวมค่าผิดปกติเป็น regressors นอกจากนี้ฉันจะทำงานกับ thetaf หรือ rwf ได้อย่างไรเนื่องจากไม่มี Forecast.theta หรือ forecast.rwf