การคาดการณ์จากรุ่น BSTS (ใน R) ล้มเหลวอย่างสมบูรณ์


15

หลังจากอ่านโพสต์บล็อกนี้เกี่ยวกับแบบจำลองอนุกรมเวลาของ Bayesian ฉันต้องการดูการใช้สิ่งนี้ในบริบทของปัญหาที่ฉันเคยใช้ ARIMA สำหรับ

ฉันมีข้อมูลบางส่วนที่มีส่วนประกอบตามฤดูกาลที่ทราบ (แต่มีเสียงดัง) มีองค์ประกอบประจำปีรายเดือนและรายสัปดาห์สำหรับเรื่องนี้และยังมีผลกระทบบางอย่างเนื่องจากวันพิเศษ (เช่นวันหยุดราชการหรือวันหยุดทางศาสนา)

ฉันใช้bstsแพคเกจเพื่อใช้งานและเท่าที่ฉันสามารถบอกได้ว่าฉันไม่ได้ทำอะไรผิดพลาดถึงแม้ว่าส่วนประกอบและการคาดการณ์จะไม่ดูอย่างที่ฉันคาดไว้ ไม่ชัดเจนสำหรับฉันหากการนำไปใช้ของฉันผิดไม่สมบูรณ์หรือมีปัญหาอื่น

ซีรี่ส์เต็มเวลามีลักษณะดังนี้:

ข้อมูลเต็มรูปแบบ

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

library(bsts)

predict_length = 90
training_cut_date <- '2015-05-01'
test_cut_date <- as.Date(training_cut_date) + predict_length

df = read.csv('input.tsv', sep ='\t')

df$date <- as.Date(as.character(df$date),format="%Y-%m-%d")
df_train = df[df$date < training_cut_date,]

yts <- xts(log10(df_train$count), order.by=df_train$date)

ss <- AddLocalLinearTrend(list(), yts)
ss <- AddSeasonal(ss, yts, nseasons = 7)
ss <- AddSeasonal(ss, yts, nseasons = 12)
ss <- AddNamedHolidays(ss, named.holidays = NamedHolidays(), yts)

model <- bsts(yts, state.specification = ss, niter = 500, seed=2016)

รูปแบบดูสมเหตุสมผล:

พล็อตโมเดล

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

burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))

การทำนายที่บริสุทธิ์มีลักษณะเช่นนี้:

ทำนายบริสุทธิ์

และเมื่อปรับสเกลกลับไปที่การแจกแจงเริ่มต้น (ด้วยเส้นประที่แสดงการเปลี่ยนจากการฝึกอบรมเป็นการทำนายปัญหาที่เห็นได้ชัด:

distro เต็ม

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


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

ขอบคุณมากสำหรับความคิดเห็นของคุณ. ฉันได้อัปโหลดข้อมูลดิบที่นี่ในกรณีที่คุณมีเวลาตรวจสอบ ข้อมูลมีตั้งแต่เริ่มต้นปี 2556 ถึงสิ้นปีนี้ ฉันได้พยายามคาดการณ์ด้วยโมเดล ARIMA แต่การคาดการณ์จากนั้นไม่ตรงกับข้อมูลที่ระงับไว้เช่นกัน ข้อมูลการพักถือเป็นเพียงเศษเสี้ยวของปี 2558 หรือ 2559 ขึ้นอยู่กับจำนวนข้อมูลการฝึกอบรมที่ฉันต้องการใช้
anthr

ฉันมีปัญหาในการดาวน์โหลด .. โปรดส่งไฟล์ csv ไปยังที่อยู่อีเมลของฉัน
IrishStat

คำตอบ:


26

Steve Scott ที่นี่ ฉันเขียนแพ็คเกจ bsts ฉันมีข้อเสนอแนะเล็กน้อยสำหรับคุณ ครั้งแรกส่วนประกอบตามฤดูกาลของคุณไม่ได้ทำในสิ่งที่คุณคิด ฉันคิดว่าคุณมีข้อมูลรายวันเพราะคุณกำลังพยายามเพิ่มองค์ประกอบ 7 ฤดูซึ่งควรทำงานอย่างถูกต้อง แต่คุณได้บอกส่วนประกอบประจำปีของคุณให้ทำซ้ำทุก ๆ 12 วัน การเดินทางเป็นส่วนประกอบตามฤดูกาลรายเดือนที่มีข้อมูลรายวันเป็นชนิดของยากที่จะทำ แต่คุณสามารถทำ 52 AddSeasonal(..., nseasons = 52, season.duration = 7)สัปดาห์โดยตามฤดูกาล

seasonal.durationอาร์กิวเมนต์บอกรูปแบบวิธีการที่เวลาหลายจุดในแต่ละฤดูกาลควรมีอายุการใช้ nseasonsอาร์กิวเมนต์บอกว่าหลายฤดูกาลที่อยู่ในวงจร season.duration * nseasonsจำนวนรวมของจุดเวลาในวงจรคือ

ข้อเสนอแนะที่สองคือคุณอาจต้องการพิจารณารูปแบบที่แตกต่างกันสำหรับแนวโน้ม LocalLinearTrendรูปแบบที่มีความยืดหยุ่นมาก แต่มีความยืดหยุ่นนี้จะแสดงขึ้นเป็นความแปรปรวนที่ไม่พึงประสงค์ในการคาดการณ์ในระยะยาว มีบางรุ่นเทรนด์อื่น ๆ ที่มีโครงสร้างอีกเล็กน้อย GeneralizedLocalLinearTrend(ขออภัยเกี่ยวกับชื่อที่ไม่บรรยาย) สมมติว่าองค์ประกอบ "ความชัน" ของเทรนด์เป็นกระบวนการ AR1 แทนการเดินแบบสุ่ม เป็นตัวเลือกเริ่มต้นของฉันหากฉันต้องการคาดการณ์ในอนาคต ส่วนใหญ่ของการเปลี่ยนแปลงอนุกรมเวลาของคุณน่าจะมาจากฤดูกาลดังนั้นคุณอาจลองAddLocalLevelหรือแม้กระทั่งแทนAddArAddLocalLinearTrend

สุดท้ายโดยทั่วไปหากคุณได้รับการคาดการณ์ที่แปลกและคุณต้องการทราบว่าส่วนใดของแบบจำลองที่จะตำหนิลองplot(model, "components")ดูแบบจำลองที่แยกออกเป็นชิ้น ๆ ที่คุณร้องขอ


FYI: ฉันมีปัญหาคล้ายกันกับข้อมูลของฉันซึ่งก็เป็นรายวันด้วย ฉันได้ดำเนินการตามคำแนะนำของคุณทั้งหมดแล้วและดูเหมือนว่าไม่มีใครช่วยเหลือ
ZakJ

1
@Steve Scott ขออภัยที่รบกวนคุณสตีฟฉันต้องการถามคุณว่า: ถ้าฉันพยายามสร้างแบบจำลองหลายครั้งและฉันอยู่ในกรอบการทำงานแบบผสมแบบลำดับชั้นฉันสามารถทำแบบจำลองนี้โดยใช้แพ็คเกจของคุณได้หรือไม่? ขอบคุณมากสำหรับแพ็คเกจของคุณ!
Tommaso Guerrini

4

ฉันคิดว่าคุณสามารถเปลี่ยนการเผาไหม้เริ่มต้น ในขณะที่ฉันใช้ bsts ฉันได้สร้างตารางการเบิร์นและค่า niter ด้วย MAPE เป็นสถิติของฉันในช่วงเวลาพัก ลองใช้ AddStudentLocalLinearTrend แทนหากข้อมูลของคุณมีความหลากหลายมากเพื่อให้แบบจำลองคาดหวังความเปลี่ยนแปลงดังกล่าว


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