ขั้นตอนและวิธีวิเคราะห์ Timeseries โดยใช้ R


13

ฉันกำลังทำงานในโครงการขนาดเล็กที่เราพยายามคาดการณ์ราคาสินค้า (น้ำมันอลูมิเนียมดีบุก ฯลฯ ) ในอีก 6 เดือนข้างหน้า ฉันมีตัวแปรดังกล่าว 12 ตัวที่จะทำนายและฉันมีข้อมูลตั้งแต่ เม.ย. 2551 - พ.ค. 2556

ฉันจะทำนายอย่างไรดี? ฉันทำสิ่งต่อไปนี้แล้ว:

  • นำเข้าข้อมูลเป็นชุดข้อมูล Timeseries
  • ฤดูกาลทั้งหมดของตัวแปรมีแนวโน้มที่จะแปรผันตามเทรนด์ดังนั้นฉันจะเป็นแบบจำลองแบบคูณ
  • ฉันนำ log ของตัวแปรมาแปลงเป็นสารเติมแต่ง
  • สำหรับแต่ละตัวแปรที่ย่อยสลายข้อมูลโดยใช้ STL

ฉันวางแผนที่จะใช้การทำให้เรียบแบบเลขชี้กำลังของโฮลท์วินเทอร์ ARIMA และโครงข่ายใยประสาทเทียมในการคาดการณ์ ฉันแบ่งข้อมูลเป็นการฝึกอบรมและทดสอบ (80, 20) วางแผนที่จะเลือกรุ่นที่มีแม่, MPE, MAPE และ MASE น้อยลง

ฉันทำถูกไหม?

อีกคำถามหนึ่งที่ฉันเคยมีก่อนที่จะส่งต่อไปยัง ARIMA หรือโครงข่ายประสาทฉันควรทำให้ข้อมูลราบรื่นหรือไม่? ถ้าใช่ใช้อะไร? ข้อมูลแสดงทั้งฤดูกาลและแนวโน้ม

แก้ไข:

การแนบพล็อตชุดข้อมูลและข้อมูล ป้อนคำอธิบายรูปภาพที่นี่

Year  <- c(2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2008, 2009, 2009, 
           2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2010, 
           2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 
           2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 
           2011, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 
           2012, 2012, 2013, 2013)
Month <- c(4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
           12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 
           8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2) 
Coil  <- c(44000, 44500, 42000, 45000, 42500, 41000, 39000, 35000, 34000, 
           29700, 29700, 29000, 30000, 30000, 31000, 31000, 33500, 33500, 
           33000, 31500, 34000, 35000, 35000, 36000, 38500, 38500, 35500, 
           33500, 34500, 36000, 35500, 34500, 35500, 38500, 44500, 40700, 
           40500, 39100, 39100, 39100, 38600, 39500, 39500, 38500, 39500, 
           40000, 40000, 40500, 41000, 41000, 41000, 40500, 40000, 39300, 
           39300, 39300, 39300, 39300, 39800)
coil <- data.frame(Year = Year, Month = Month, Coil = Coil)

แก้ไข 2: คำถามเดียวคุณช่วยบอกฉันได้ไหมว่าข้อมูลของฉันมีฤดูกาลหรือเทรนด์? และโปรดให้คำแนะนำเกี่ยวกับวิธีการระบุให้ฉันด้วย ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


2
หากคุณกำลังมองหาที่จะคาดการณ์กลุ่มของสินค้าเช่นโลหะประเภทต่างๆ (เหล็ก A, เหล็ก B, เหล็ก C, ฯลฯ ) นั่นอาจเป็นการทดสอบที่คุ้มค่าสำหรับการมีอยู่ของ cointegration ตัวอย่างเช่นสิ่งนี้: ราคาเหล็กเคลื่อนไหวไปด้วยกันไหม? . สิ่งนี้อาจให้การคาดการณ์ 6 เดือน (ระยะกลาง / ยาว) ที่ดีกว่าวิธีการที่ไม่เปลี่ยนแปลง แต่นี่เป็นเกมที่ยากที่คุณพยายามเล่น ;-)
Graeme Walsh

1
AS @GraemeWalsh ชี้ให้เห็นว่าการคาดการณ์แนวโน้มที่ไม่เปลี่ยนแปลงอาจไม่เหมาะกับข้อมูลประเภทนี้ มีวิธีการที่กำหนดไว้อย่างดีในวรรณคดีสำหรับการพยากรณ์น้ำมันราคาเหล็กที่อาจคุ้มค่าที่จะสำรวจ
พยากรณ์

1
คุณสามารถโพสต์การแก้ไขใหม่เป็นคำถามแยกต่างหากได้หรือไม่ เนื่องจากคุณยอมรับคำตอบแล้วคำถามใหม่อาจไม่ได้รับความสนใจ จากการมองข้อมูลฉันบอกได้เลยว่าไม่มีใครมีแนวโน้มหรือรูปแบบตามฤดูกาล ตามที่ระบุไว้ในโพสต์ของฉันด้านล่างดูเหมือนว่าแนวโน้มลดลงก่อนปี 2009 เป็นปรากฏการณ์ทางเศรษฐกิจมหภาคเช่นภาวะถดถอย?
พยากรณ์

@ forecaster, @ GraemeWalsh: ขอบคุณ ฉันวางแผนที่จะใช้วิธีการ cointegration โดยใช้การทดสอบ ADF
Niranjan Sonachalam

1
คุณได้ระบุบริบทในคำถามใหม่ของคุณแล้วและตอนนี้ก็สมเหตุสมผลแล้ว ดังนั้นการลดลงก่อนปี 2009 จึงเป็นปรากฏการณ์ทางเศรษฐกิจมหภาค ในกรณีนั้นโปรดใช้วิธีการเดินแบบสุ่มพร้อมดริฟท์หรือ (อาริมา (0,1,0) + ดริฟท์
ทำนาย

คำตอบ:


21

คุณควรใช้แพ็คเกจพยากรณ์ซึ่งรองรับโมเดลเหล่านี้ทั้งหมด (และอื่น ๆ ) และปรับให้เข้ากับรูปแบบเหล่านี้:

library(forecast)
x <- AirPassengers
mod_arima <- auto.arima(x, ic='aicc', stepwise=FALSE)
mod_exponential <- ets(x, ic='aicc', restrict=FALSE)
mod_neural <- nnetar(x, p=12, size=25)
mod_tbats <- tbats(x, ic='aicc', seasonal.periods=12)
par(mfrow=c(4, 1))
plot(forecast(mod_arima, 12), include=36)
plot(forecast(mod_exponential, 12), include=36)
plot(forecast(mod_neural, 12), include=36)
plot(forecast(mod_tbats, 12), include=36)

ฉันจะแนะนำให้ปรับข้อมูลให้เรียบก่อนปรับแบบจำลองของคุณ แบบจำลองของคุณกำลังพยายามทำให้ข้อมูลราบรื่นขึ้นดังนั้นการปรับให้เรียบล่วงหน้าเป็นเรื่องที่ยุ่งยาก

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไขตามข้อมูลใหม่:

จริงๆแล้วดูเหมือนว่า arima เป็นหนึ่งในโมเดลที่แย่ที่สุดที่คุณสามารถเลือกสำหรับชุดการฝึกอบรมและการทดสอบนี้

ฉันบันทึกข้อมูลของคุณลงในการเรียกใช้ไฟล์coil.csvโหลดลงใน R และแยกเป็นการฝึกอบรมและชุดทดสอบ:

library(forecast)
dat <- read.csv('~/coil.csv')
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
test_x <- window(x, start=c(2012, 3))
x <- window(x, end=c(2012, 2))

ต่อไปฉันพอดีกับพวงของแบบอนุกรมเวลา: arima, การทำให้เรียบแบบเอ็กซ์โปเนนเชียล, โครงข่ายประสาทเทียม, ค้างคาว, ค้างคาว, การสลายตัวตามฤดูกาลและอนุกรมเวลาเชิงโครงสร้าง:

models <- list(
  mod_arima = auto.arima(x, ic='aicc', stepwise=FALSE),
  mod_exp = ets(x, ic='aicc', restrict=FALSE),
  mod_neural = nnetar(x, p=12, size=25),
  mod_tbats = tbats(x, ic='aicc', seasonal.periods=12),
  mod_bats = bats(x, ic='aicc', seasonal.periods=12),
  mod_stl = stlm(x, s.window=12, ic='aicc', robust=TRUE, method='ets'),
  mod_sts = StructTS(x)
  )

จากนั้นฉันก็ทำการพยากรณ์และเปรียบเทียบกับชุดการทดสอบ ฉันรวมการคาดการณ์ที่ไร้เดียงสาที่คาดการณ์เส้นแนวนอนและแนวราบเสมอ:

forecasts <- lapply(models, forecast, 12)
forecasts$naive <- naive(x, 12)
par(mfrow=c(4, 2))
for(f in forecasts){
  plot(f)
  lines(test_x, col='red')
}

ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่คุณเห็นแบบจำลอง Arima ทำให้แนวโน้มผิด แต่ฉันชอบรูปลักษณ์ของ "โมเดลโครงสร้างพื้นฐาน"

ในที่สุดฉันวัดความแม่นยำของแต่ละรุ่นในชุดทดสอบ:

acc <- lapply(forecasts, function(f){
  accuracy(f, test_x)[2,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
                ME    RMSE     MAE   MPE MAPE MASE ACF1 Theil's U
mod_sts     283.15  609.04  514.46  0.69 1.27 0.10 0.77      1.65
mod_bats     65.36  706.93  638.31  0.13 1.59 0.12 0.85      1.96
mod_tbats    65.22  706.92  638.32  0.13 1.59 0.12 0.85      1.96
mod_exp      25.00  706.52  641.67  0.03 1.60 0.12 0.85      1.96
naive        25.00  706.52  641.67  0.03 1.60 0.12 0.85      1.96
mod_neural   81.14  853.86  754.61  0.18 1.89 0.14 0.14      2.39
mod_arima   766.51  904.06  766.51  1.90 1.90 0.14 0.73      2.48
mod_stl    -208.74 1166.84 1005.81 -0.52 2.50 0.19 0.32      3.02

ตัวชี้วัดที่ใช้มีการอธิบายไว้ในHyndman, RJ และ Athanasopoulos, G. (2014) "การคาดการณ์: หลักการและการปฏิบัติ"ซึ่งเกิดขึ้นเป็นผู้เขียนแพ็คเกจพยากรณ์ ฉันขอแนะนำให้คุณอ่านข้อความของพวกเขา: มันสามารถออนไลน์ได้ฟรี อนุกรมเวลาเชิงโครงสร้างเป็นโมเดลที่ดีที่สุดโดยตัวชี้วัดหลายตัวรวมถึง MASE ซึ่งเป็นตัวชี้วัดที่ฉันมักจะชอบสำหรับการเลือกแบบจำลอง

หนึ่งคำถามสุดท้ายคือ: แบบจำลองโครงสร้างได้รับโชคดีในชุดทดสอบนี้หรือไม่ วิธีหนึ่งในการประเมินสิ่งนี้คือการดูข้อผิดพลาดของชุดฝึกอบรม ข้อผิดพลาดของชุดการฝึกอบรมมีความน่าเชื่อถือน้อยกว่าข้อผิดพลาดของชุดทดสอบ (เพราะสามารถมีขนาดพอดี) แต่ในกรณีนี้รูปแบบโครงสร้างยังคงปรากฏอยู่ด้านบน:

acc <- lapply(forecasts, function(f){
  accuracy(f, test_x)[1,,drop=FALSE]
})
acc <- Reduce(rbind, acc)
row.names(acc) <- names(forecasts)
acc <- acc[order(acc[,'MASE']),]
round(acc, 2)
                ME    RMSE     MAE   MPE MAPE MASE  ACF1 Theil's U
mod_sts      -0.03    0.99    0.71  0.00 0.00 0.00  0.08        NA
mod_neural    3.00 1145.91  839.15 -0.09 2.25 0.16  0.00        NA
mod_exp     -82.74 1915.75 1359.87 -0.33 3.68 0.25  0.06        NA
naive       -86.96 1936.38 1386.96 -0.34 3.75 0.26  0.06        NA
mod_arima  -180.32 1889.56 1393.94 -0.74 3.79 0.26  0.09        NA
mod_stl     -38.12 2158.25 1471.63 -0.22 4.00 0.28 -0.09        NA
mod_bats     57.07 2184.16 1525.28  0.00 4.07 0.29 -0.03        NA
mod_tbats    62.30 2203.54 1531.48  0.01 4.08 0.29 -0.03        NA

(โปรดทราบว่าเครือข่ายประสาทเทียมมีประสิทธิภาพดีเยี่ยมในชุดฝึกอบรมและชุดทดสอบไม่ดี)

ในที่สุดมันก็เป็นความคิดที่ดีที่จะตรวจสอบความถูกต้องของโมเดลเหล่านี้ทั้งหมดโดยการฝึกอบรมในปี 2008-2009 / การทดสอบในปี 2010 การฝึกอบรม 2008-2010 / การทดสอบในปี 2011 การฝึกอบรมในปี 2008-2011 / การทดสอบในปี 2012 ใน 2008-2012 / การทดสอบ 2013 และข้อผิดพลาดค่าเฉลี่ยในช่วงเวลาทั้งหมดเหล่านี้ หากคุณต้องการลงเส้นทางนั้นฉันมีแพ็กเกจที่สมบูรณ์บางส่วนสำหรับรุ่นอนุกรมเวลาตรวจสอบความถูกต้องบน githubที่ฉันรักคุณลองและให้ข้อเสนอแนะ / ดึงคำขอใน:

devtools::install_github('zachmayer/cv.ts')
library(cv.ts)

แก้ไข 2: ให้ดูว่าฉันจำวิธีใช้แพ็คเกจของฉันเองได้ไหม!

ก่อนอื่นให้ติดตั้งและโหลดแพ็คเกจจาก gitHub (ดูด้านบน) จากนั้นตรวจสอบความถูกต้องของบางรุ่น (โดยใช้ชุดข้อมูลแบบเต็ม):

library(cv.ts)
x <- ts(dat$Coil, start=c(dat$Year[1], dat$Month[1]), frequency=12)
ctrl <- tseriesControl(stepSize=1, maxHorizon=12, minObs=36, fixedWindow=TRUE)
models <- list()

models$arima = cv.ts(
  x, auto.arimaForecast, tsControl=ctrl,
  ic='aicc', stepwise=FALSE)

models$exp = cv.ts(
  x, etsForecast, tsControl=ctrl,
  ic='aicc', restrict=FALSE)

models$neural = cv.ts(
  x, nnetarForecast, tsControl=ctrl,
  nn_p=6, size=5)

models$tbats = cv.ts(
  x, tbatsForecast, tsControl=ctrl,
  seasonal.periods=12)

models$bats = cv.ts(
  x, batsForecast, tsControl=ctrl,
  seasonal.periods=12)

models$stl = cv.ts(
  x, stl.Forecast, tsControl=ctrl,
  s.window=12, ic='aicc', robust=TRUE, method='ets')

models$sts = cv.ts(x, stsForecast, tsControl=ctrl)

models$naive = cv.ts(x, naiveForecast, tsControl=ctrl)

models$theta = cv.ts(x, thetaForecast, tsControl=ctrl)

(โปรดทราบว่าฉันลดความยืดหยุ่นของโมเดลโครงข่ายประสาทเทียมเพื่อพยายามช่วยป้องกันไม่ให้เกิดการโอเวอร์โหลด)

เมื่อเราได้พอดีกับแบบจำลองเราสามารถเปรียบเทียบได้โดย MAPE (cv.ts ยังไม่รองรับ MASE):

res_overall <- lapply(models, function(x) x$results[13,-1])
res_overall <- Reduce(rbind, res_overall)
row.names(res_overall) <- names(models)
res_overall <- res_overall[order(res_overall[,'MAPE']),]
round(res_overall, 2)
                 ME    RMSE     MAE   MPE MAPE
naive     91.40 1126.83  961.18  0.19 2.40
ets       91.56 1127.09  961.35  0.19 2.40
stl     -114.59 1661.73 1332.73 -0.29 3.36
neural     5.26 1979.83 1521.83  0.00 3.83
bats     294.01 2087.99 1725.14  0.70 4.32
sts     -698.90 3680.71 1901.78 -1.81 4.77
arima  -1687.27 2750.49 2199.53 -4.23 5.53
tbats   -476.67 2761.44 2428.34 -1.23 6.10

อุ๊ยตาย ดูเหมือนว่าการคาดการณ์เชิงโครงสร้างของเราจะโชคดี ในระยะยาวการคาดการณ์ที่ไร้เดียงสาทำให้การคาดการณ์ที่ดีที่สุดโดยเฉลี่ยอยู่ในขอบฟ้า 12 เดือน (โมเดล Arima ยังคงเป็นหนึ่งในโมเดลที่เลวร้ายที่สุด) ลองเปรียบเทียบแบบจำลองที่ขอบฟ้าคาดการณ์ 12 แบบและดูว่ามีรูปแบบใดบ้างที่เอาชนะแบบจำลองที่ไร้เดียงสา:

library(reshape2)
library(ggplot2)
res <- lapply(models, function(x) x$results$MAPE[1:12])
res <- data.frame(do.call(cbind, res))
res$horizon <- 1:nrow(res)
res <- melt(res, id.var='horizon', variable.name='model', value.name='MAPE')
res$model <- factor(res$model, levels=row.names(res_overall))
ggplot(res, aes(x=horizon, y=MAPE, col=model)) +
  geom_line(size=2) + theme_bw() +
  theme(legend.position="top") +
  scale_color_manual(values=c(
    "#1f78b4", "#ff7f00", "#33a02c", "#6a3d9a",
    "#e31a1c", "#b15928", "#a6cee3", "#fdbf6f",
    "#b2df8a")
    )

เปรียบเทียบแบบจำลอง

แบบจำลองการยกกำลังแบบเลขชี้กำลังจะเลือกรุ่นไร้เดียงสาเสมอ (เส้นสีส้มและเส้นสีน้ำเงินทับซ้อนกัน 100%) กล่าวอีกนัยหนึ่งการคาดการณ์ที่ไร้เดียงสาของ "ราคาขดลวดของเดือนถัดไปจะเหมือนกันกับราคาขดลวดของเดือนนี้" มีความแม่นยำมากขึ้น หากคุณไม่มีข้อมูลลับตลาดคอยล์ยังไม่ทราบการคาดการณ์ราคาขดลวดที่ไร้เดียงสานั้นยากมาก

ไม่ใช่คำตอบที่ทุกคนต้องการได้ยิน แต่ถ้าความแม่นยำในการพยากรณ์คือเป้าหมายของคุณคุณควรใช้โมเดลที่แม่นยำที่สุด ใช้โมเดลไร้เดียงสา


มันน่าสนใจที่จะดูความแตกต่างของรุ่นเหล่านี้ NNAR โดยเฉพาะมีลักษณะแตกต่างกัน ระบุว่านี่เป็นชุดข้อมูลที่มีชื่อเสียง (และเก่าแก่ในอดีตฉันเชื่อว่า) เป็นที่รู้จักกันว่าถูกต้องหรือไม่และรูปแบบหนึ่งมีประสิทธิภาพดีกว่าหรือไม่ (Nb ฉันรู้เรื่อง TS ค่อนข้างน้อย)
gung - Reinstate Monica

@gung วิธีที่ดีที่สุดในการทำเช่นนี้คือการแยกชุด holdout ออกและทดสอบโมเดล โปรดทราบว่ารูปแบบที่ทำให้การคาดการณ์ระยะสั้นที่ดีที่สุดอาจไม่ใช่แบบจำลองที่ทำให้การคาดการณ์ระยะยาวที่ดีที่สุด ....
Zach

ขอบคุณมาก แต่ฉันไม่ได้รับการคาดการณ์ที่ดีสำหรับชุดข้อมูลข้างต้น (ฉันคิดว่าฉันพลาดขั้นตอนสำคัญบางอย่างที่นี่) คุณช่วยบอกฉันหน่อยได้ไหมว่าฉันพลาดอะไรบางอย่าง
นิรันจารยชนกนาคาลัม

@Niranjan คุณสามารถบอกเราได้ / แสดงว่าคุณสรุปได้อย่างไรว่าคุณไม่ได้รับการคาดการณ์ที่ดี?
พยากรณ์

@forecaster: โปรดตรวจสอบที่นี่pbrd.co/1DRPRsq ฉันใหม่สำหรับการคาดการณ์ แจ้งให้เราทราบหากคุณต้องการข้อมูลเฉพาะ ฉันลองใช้แบบจำลอง Arima
Niranjan Sonachalam

12

วิธีการที่คุณใช้นั้นสมเหตุสมผล หากคุณยังใหม่ต่อการคาดการณ์ฉันจะแนะนำหนังสือต่อไปนี้:

  1. วิธีการพยากรณ์และการประยุกต์ใช้โดย Makridakis, Wheelright และ Hyndman
  2. การพยากรณ์: หลักการและการปฏิบัติโดย Hyndman และ Athanasopoulos

หนังสือเล่มแรกเป็นหนังสือคลาสสิกที่ฉันขอแนะนำ หนังสือเล่มที่สองเป็นหนังสือที่เปิดแหล่งที่มาซึ่งคุณสามารถดูวิธีการพยากรณ์และวิธีการที่จะนำไปใช้โดยใช้ Rแพคเกจซอฟต์แวร์โอเพนซอร์สการคาดการณ์ หนังสือทั้งสองเล่มมีพื้นฐานที่ดีเกี่ยวกับวิธีการที่ฉันใช้ หากคุณจริงจังกับการคาดการณ์ฉันจะแนะนำหลักการพยากรณ์โดย Armstrong ซึ่งเป็นการรวบรวมงานวิจัยจำนวนมากในการคาดการณ์ว่าผู้ปฏิบัติงานอาจพบว่ามีประโยชน์มาก

เมื่อมาถึงตัวอย่างเฉพาะของคุณบนคอยล์มันทำให้ฉันนึกถึงแนวคิดเรื่องการคาดการณ์ซึ่งหนังสือเรียนส่วนใหญ่มักไม่สนใจ ซีรีส์บางอย่างเช่นซีรีส์ของคุณนั้นไม่สามารถคาดการณ์ได้เพราะมันมีรูปแบบที่น้อยกว่าเพราะมันไม่แสดงแนวโน้มหรือ patters ตามฤดูกาลหรือการเปลี่ยนแปลงที่เป็นระบบ ในกรณีนั้นฉันจะจัดหมวดหมู่ซีรีส์เป็นที่คาดการณ์ได้น้อยลง ก่อนที่จะใช้วิธีการคาดการณ์ฉันจะดูข้อมูลและถามคำถามชุดของฉันสามารถคาดการณ์ได้หรือไม่ในตัวอย่างนี้การคาดการณ์อย่างง่ายเช่นการคาดการณ์การเดินแบบสุ่มซึ่งใช้ค่าสุดท้ายของการพยากรณ์ถูกต้องที่สุด .

ยังเป็นหนึ่งในการแสดงความคิดเห็นเพิ่มเติมเกี่ยวกับเครือข่ายประสาท: โครงข่ายประสาทเทียมจะฉาวโฉ่รู้ที่จะล้มเหลวในการแข่งขันเชิงประจักษ์ ฉันจะลองใช้วิธีการทางสถิติแบบดั้งเดิมสำหรับอนุกรมเวลาก่อนที่จะพยายามใช้เครือข่ายประสาทเทียมสำหรับงานการคาดการณ์อนุกรมเวลา

ฉันพยายามที่จะสร้างแบบจำลองข้อมูลของคุณในR's forecast packageหวังว่าความคิดเห็นที่อธิบายด้วยตนเอง

coil <- c(44000, 44500, 42000, 45000, 42500, 41000, 39000, 35000, 34000, 
          29700, 29700, 29000, 30000, 30000, 31000, 31000, 33500, 33500, 
          33000, 31500, 34000, 35000, 35000, 36000, 38500, 38500, 35500, 
          33500, 34500, 36000, 35500, 34500, 35500, 38500, 44500, 40700, 
          40500, 39100, 39100, 39100, 38600, 39500, 39500, 38500, 39500, 
          40000, 40000, 40500, 41000, 41000, 41000, 40500, 40000, 39300, 
          39300, 39300, 39300, 39300, 39800)


coilts <- ts(coil,start=c(2008,4),frequency=12)

library("forecast")

# Data for modeling
coilts.mod <- window(coilts,end = c(2012,3))

#Data for testing
coil.test <- window(coilts,start=c(2012,4))

# Model using multiple methods - arima, expo smooth, theta, random walk, structural time series

#arima
coil.arima <- forecast(auto.arima(coilts.mod),h=11)

#exponential smoothing
coil.ets <- forecast(ets(coilts.mod),h=11)

#theta
coil.tht <- thetaf(coilts.mod, h=11)

#random walk
coil.rwf <- rwf(coilts.mod, h=11)

#structts
coil.struc <- forecast(StructTS(coilts.mod),h=11)


##accuracy 

arm.acc <- accuracy(coil.arima,coil.test)
ets.acc <- accuracy(coil.ets,coil.test)
tht.acc <- accuracy(coil.tht,coil.test)
rwf.acc <- accuracy(coil.rwf,coil.test)
str.acc <- accuracy(coil.struc,coil.test)

เมื่อใช้แม่กับข้อมูลที่ระงับไว้ฉันจะเลือก ARIMA สำหรับการพยากรณ์ระยะสั้น (1 - 12 เดือน) ในระยะยาวฉันจะใช้การคาดการณ์การเดินแบบสุ่ม โปรดทราบว่า ARIMA เลือกโมเดลการเดินแบบสุ่มที่มีการเลื่อน(0,1,0) + การเลื่อนซึ่งมีความแม่นยำมากกว่าการเดินแบบสุ่มแบบบริสุทธิ์ในปัญหาระยะสั้นเหล่านี้โดยเฉพาะ ดูแผนภูมิด้านล่าง นี่คือฟังก์ชั่นความแม่นยำตามที่แสดงในรหัสข้างต้น

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบเฉพาะสำหรับคำถามเฉพาะของคุณ: คำถามเดียวที่ฉันมีก่อนส่งผ่านไปยัง ARIMA หรือโครงข่ายประสาทฉันควรทำให้ข้อมูลราบรื่นหรือไม่? ถ้าใช่ใช้อะไร?

  • ไม่วิธีการพยากรณ์ทำให้ข้อมูลของคุณเป็นแบบอย่างที่ราบรื่น

ข้อมูลแสดงทั้งฤดูกาลและแนวโน้ม

  • ข้อมูลข้างต้นไม่แสดงแนวโน้มหรือฤดูกาล หากคุณพิจารณาว่าข้อมูลแสดงฤดูกาลและแนวโน้มให้เลือกวิธีการที่เหมาะสม

เคล็ดลับการปฏิบัติเพื่อปรับปรุงความแม่นยำ:

รวมวิธีการพยากรณ์ที่หลากหลาย: - คุณสามารถลองใช้วิธีการคาดการณ์ที่ไม่ใช่การคาดการณ์เช่นการเปรียบเทียบการพยากรณ์การตัดสินใจหรือเทคนิคอื่น ๆ และรวมเข้ากับวิธีการทางสถิติของคุณ ดูบทความนี้สำหรับประโยชน์ของการรวม ฉันพยายามรวมทั้ง 5 วิธีข้างต้น แต่การคาดคะเนไม่แม่นยำเหมือนวิธีแต่ละวิธีเหตุผลหนึ่งที่เป็นไปได้คือการคาดการณ์ของแต่ละคนมีความคล้ายคลึงกัน คุณได้รับประโยชน์จากการรวมการคาดการณ์เมื่อคุณรวมวิธีการที่หลากหลายเช่นการพยากรณ์ทางสถิติและการตัดสิน

ตรวจจับและทำความเข้าใจกับค่าผิดปกติ: - ข้อมูลในโลกแห่งความจริงเต็มไปด้วยค่าผิดปกติ ระบุและจัดการค่าผิดปกติอย่างเหมาะสมในอนุกรมเวลา แนะนำให้อ่านโพสต์นี้ ในการดูข้อมูลคอยล์ของคุณการลดลงก่อนปี 2009 เป็นค่าผิดปกติหรือไม่?

แก้ไข

ข้อมูลดูเหมือนจะเป็นไปตามแนวโน้มเศรษฐกิจมหภาคบางประเภท ฉันเดาว่าแนวโน้มที่ลดลงที่เห็นก่อนปี 2009 เป็นไปตามภาวะเศรษฐกิจที่ตกต่ำระหว่างปี 2008 - 2009 และเริ่มรับโพสต์เมื่อปี 2009 หากเป็นกรณีนี้ฉันทุกคนจะหลีกเลี่ยงการใช้วิธีการประมาณค่าใด ๆ แนวโน้มเศรษฐกิจเหล่านี้มีพฤติกรรมเช่นที่อ้างอิงโดย @GraemeWalsh

หวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.