Auto.arima พร้อมข้อมูลรายวัน: วิธีจับฤดูกาลและช่วงเวลา


21

ฉันเหมาะสมกับโมเดล ARIMA ในซีรีย์เวลารายวัน ข้อมูลจะถูกรวบรวมทุกวันตั้งแต่ 02-01-2010 ถึง 30-07-2011 และเกี่ยวกับการขายหนังสือพิมพ์ เนื่องจากสามารถหารูปแบบการขายรายสัปดาห์ได้ (โดยปกติปริมาณการขายต่อวันโดยทั่วไปจะเหมือนกันทุกวันจันทร์ถึงศุกร์จากนั้นเพิ่มขึ้นในวันเสาร์และวันอาทิตย์) ฉันพยายามจับภาพ "ฤดูกาล" นี้ รับข้อมูลการขาย "ข้อมูล" ฉันสร้างอนุกรมเวลาดังนี้

salests<-ts(data,start=c(2010,1),frequency=365)

จากนั้นฉันใช้ฟังก์ชั่น auto.arima (.) เพื่อเลือกรุ่น ARIMA ที่ดีที่สุดผ่านเกณฑ์ AIC ผลลัพธ์จะเป็นโมเดล ARIMA ที่ไม่ใช่ฤดูกาลเสมอ แต่ถ้าฉันลองใช้แบบจำลอง SARIMAs ด้วยไวยากรณ์ต่อไปนี้เป็นตัวอย่าง:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

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

ปรับปรุง:

ฉันได้เปลี่ยนแปลงข้อโต้แย้งบางอย่างแล้ว แม่นยำยิ่งขึ้นขั้นตอนการเลือก ARIMA (4,1,3) เป็นแบบจำลองที่ดีที่สุดเมื่อฉันตั้งค่าD=7แต่ AIC และดัชนีที่เหมาะสมและการคาดการณ์เช่นกัน) ไม่ได้ปรับปรุงเลย ฉันเดาว่ามีข้อผิดพลาดบางอย่างเนื่องจากความสับสนระหว่างฤดูกาลและระยะเวลา .. ?!

รับการโทรอัตโนมัติและได้รับ:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

ดังนั้นฉันคิดว่าควรใช้ฟังก์ชัน arima เป็น:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

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

คำตอบ:


28

หากมีฤดูกาลรายสัปดาห์ให้ตั้งระยะเวลาตามฤดูกาลเป็น 7

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

โปรดทราบว่าการเลือกความแตกต่างของฤดูกาลไม่ดีนักauto.arima()จนกระทั่งเมื่อไม่นานมานี้ หากคุณใช้ v2.xx ของforecastแพ็คเกจตั้งค่าD=1ในการโทรauto.arima()เพื่อบังคับให้มีความแตกต่างของฤดูกาล หากคุณใช้ v3.xx ของforecastแพ็คเกจการเลือกอัตโนมัติจะDทำงานได้ดีขึ้นมาก (ใช้การทดสอบ OCSB แทนการทดสอบ CH)

อย่าพยายามเปรียบเทียบ AIC สำหรับรุ่นที่มีระดับความต่างต่างกัน พวกเขาไม่ได้เปรียบเทียบโดยตรง คุณสามารถเปรียบเทียบ AIC กับรุ่นที่มีคำสั่งซื้อต่างกันได้อย่างน่าเชื่อถือ

auto.arima()คุณไม่จำเป็นต้องเหมาะสมกับรูปแบบหลังจากที่โทร มันจะส่งคืนวัตถุ Arima เช่นเดียวกับที่คุณเรียกarima()ด้วยลำดับโมเดลที่เลือก


ขอบคุณที่ชี้ให้เห็นข้อผิดพลาดที่โง่ของฉัน ฉันจะถอนคำตอบของฉัน
mpiktas

1
กว่าคุณมากสำหรับคำแนะนำที่เป็นประโยชน์มาก ฉันใช้แพ็คเกจคาดการณ์รุ่น 2.19 ดังนั้นฉันจึงทำตามคำแนะนำของคุณและตั้งค่าพารามิเตอร์ D เท่ากับ 1 ในการโทร auto.arima () ตอนนี้รุ่นที่ดีที่สุดที่เลือกไว้สำหรับซีรีส์ salests คือ ARIMA (1,0,0) ที่มีค่าเฉลี่ยไม่ใช่ศูนย์ ฉันควรคาดหวังว่าคุณสมบัติของฤดูกาลตามแบบจำลองที่ดีที่สุดที่ส่งคืนฉันหมายถึงค่าของ P, D, Q หรืออย่างน้อยสำหรับ D?
Giulia

2
ตราบใดที่ข้อมูลของคุณมีความถี่อื่นที่ไม่ใช่ 1 โมเดล ARIMA ตามฤดูกาลจะได้รับการพิจารณา หากแบบจำลองที่ไม่ใช่ฤดูกาลกำลังถูกส่งคืนฤดูกาลนั้นจะอ่อนมากหรือข้อมูลไม่ได้อยู่ในวัตถุทีมีความถี่> 1
Rob Hyndman

15

ปัญหาเกี่ยวกับข้อมูลตามฤดูกาลของ ARIMA ที่เหมาะสมกับข้อมูลรายวันคือ "องค์ประกอบตามฤดูกาล" อาจทำงานในวันหยุดสุดสัปดาห์หรืออาจเป็นแค่วันธรรมดาเท่านั้น ตอนนี้สิ่งที่คุณต้องทำคือการเพิ่มชุดข้อมูลของคุณด้วย 6 หุ่นที่เป็นตัวแทนของวันในสัปดาห์และบางทีตัวบ่งชี้รายเดือนเพื่อเป็นตัวแทนผลกระทบประจำปี ตอนนี้ให้พิจารณาการรวมเหตุการณ์ต่างๆเช่นวันหยุดพักผ่อนและรวมถึงโอกาสในการขายผลกระทบที่เกิดขึ้นพร้อมกันหรือความล่าช้ารอบ ๆ ตัวแปรที่รู้จักเหล่านี้ ไม่มีอาจมีค่าที่ผิดปกติ (พัลส์) หรือการเลื่อนระดับหรือแนวโน้มเวลาท้องถิ่นในข้อมูล นอกจากนี้เอฟเฟกต์แบบวันต่อสัปดาห์อาจมีการเปลี่ยนแปลงเมื่อเวลาผ่านไปเช่นไม่มีผลวันเสาร์ในช่วง 20 สัปดาห์แรก แต่มีผลแบบเสาร์ในช่วง 50 สัปดาห์ที่ผ่านมา


ในกรณีนั้น (IrishStat) จะไม่เป็นเทคนิคแบบจำลองผสมแทนที่จะเป็น ARIMA ความล่าช้าจะไม่ถูกนำไปใช้ใน ARIMA ยกเว้นการทดสอบ Box Jlung Auto.arima (ล่าสุด) แก้ไขทุกอย่างรวมถึงการปรับขนาดของข้อมูลความผันผวนตามฤดูกาล (นั่นเป็นเหตุผลที่ฉันพบพารามิเตอร์ p, d, q ที่ดีที่สุด)
wackyanil

มันเรียกว่าฟังก์ชั่นการถ่ายโอนและสะท้อนให้เห็นถึงวิธีการทำงานร่วมกันดูautobox.com/pdfs/capable.pdเริ่มต้นด้วยสไลด์ 42 Auto.arima อาจใช้งานได้ง่าย แต่ก็ไม่ได้เป็นความคิดของฉัน หากคุณมีชุดข้อมูลอยู่ในใจให้ตั้งคำถามใหม่และรวมไว้ด้วย
IrishStat

@IrishStat คุณหมายถึง ARIMA กับการแทรกแซงหรือไม่ วันของสัปดาห์เป็นตัวแปรจำลอง? และตัวแปรหุ่นที่คล้ายกันสำหรับวันหยุด?
ผู้ที่กระตือรือร้น

ใช่ .. นั่นจะเป็นแนวทางของฉันต่อข้อมูลประจำวัน
IrishStat

0

เพื่อกำหนดลำดับของฤดูกาลใน ts ของฉัน (ข้อมูลรายวันตลอด 3 ปี) ฉันใช้รหัสนี้ใน Matlab:

s = 0; นาที = 1e + 07; n = ความยาว (x); สำหรับ i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = SUM (เอบีเอส (ต่าง)); ถ้า (s (i)

มันทำให้ฉัน 365 ซึ่งเป็นตรรกะ


1
ยินดีต้อนรับสู่เว็บไซต์ ไม่ชัดเจนสำหรับฉันว่าวิธีนี้ตอบคำถามเดิมและไม่ชัดเจนสำหรับฉันว่าโค้ดที่คุณโพสต์ทำอะไรได้บ้างจากการดู บางทีคุณสามารถขยายคำตอบได้เล็กน้อย?
einar

1
วิธีการแก้ปัญหาของคุณจะจัดการกับผลกระทบประจำวันแบบถาวรสัปดาห์ผลแบบวันต่อเดือนแบบคงที่ผลกระทบแบบสัปดาห์ต่อเดือนผลแบบวันต่อสัปดาห์ผลตะกั่วและความล่าช้าของวันหยุด , วันจันทร์หลังจากวันหยุดวันศุกร์, วันศุกร์ก่อนวันหยุดวันจันทร์, ผลรายเดือน, ผลรายสัปดาห์, การเปลี่ยนแปลงผลวันหยุดประจำสัปดาห์ในช่วงเวลา, พัลส์, การเลื่อนระดับ / ขั้นตอน?
IrishStat

รหัส Matlab s = 0; min = 1e + 07; n = length (x); สำหรับ i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = SUM (เอบีเอส (ต่าง)); if (s (i) <min) min = s (i); i end end
nkabouche
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.