วิธีการพอดีกับรุ่น ARIMAX กับ R


33

ฉันมีการวัดรายชั่วโมงสี่แบบต่อเนื่อง

  1. การใช้ความร้อนภายในบ้าน
  2. อุณหภูมิภายนอกบ้าน
  3. รังสีดวงอาทิตย์
  4. ความเร็วลม

ฉันต้องการที่จะทำนายการใช้ความร้อนภายในบ้าน มีแนวโน้มตามฤดูกาลที่ชัดเจนทั้งรายปีและรายวัน เนื่องจากมีความสัมพันธ์ที่ชัดเจนระหว่างซีรีย์ที่แตกต่างกันฉันต้องการให้พอดีกับพวกเขาโดยใช้โมเดล ARIMAX สิ่งนี้สามารถทำได้ใน R โดยใช้ฟังก์ชั่น arimax จากแพ็คเกจ TSA

ฉันพยายามอ่านเอกสารเกี่ยวกับฟังก์ชั่นนี้และอ่านฟังก์ชั่นการถ่ายโอน แต่จนถึงตอนนี้รหัสของฉัน:

regParams = ts.union(ts(dayy))
transferParams = ts.union(ts(temp))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams,xtransf=transferParams,transfer=list(c(1,1))
pred10 = predict(model10, newxreg=regParams)

ให้ฉัน: ป้อนคำอธิบายรูปภาพที่นี่

โดยที่เส้นสีดำคือข้อมูลจริงที่วัดได้และเส้นสีเขียวเป็นแบบจำลองที่ได้ทำการเปรียบเทียบของฉัน ไม่เพียง แต่เป็นแบบอย่างที่ดีเท่านั้น

ฉันจะยอมรับว่าความรู้เกี่ยวกับโมเดล ARIMAX และฟังก์ชั่นการถ่ายโอนมี จำกัด ในฟังก์ชั่น arimax (), (เท่าที่ฉันเข้าใจ), xtransf เป็นอนุกรมเวลาภายนอกที่ฉันต้องการใช้ (โดยใช้ฟังก์ชั่นถ่ายโอน) เพื่อทำนายอนุกรมเวลาหลักของฉัน แต่อะไรคือความแตกต่างระหว่าง xreg และ xtransf จริง ๆ ?

โดยทั่วไปแล้วฉันทำอะไรผิด ฉันต้องการที่จะสามารถที่จะได้รับแบบที่ดีขึ้นกว่าหนึ่งที่ประสบความสำเร็จจาก LM (ความร้อน ~ อุณหภูมิRadiลม * เวลา)

การแก้ไข: จากความคิดเห็นบางส่วนฉันได้ลบการถ่ายโอนและเพิ่ม xreg แทน:

regParams = ts.union(ts(dayy), ts(temp), ts(time))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams)

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

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

ซึ่งดีกว่า แต่ไม่ใช่สิ่งที่ฉันคาดหวัง

คำตอบ:


34

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

  1. ฉันสมมติว่าคุณมีข้อมูลรายชั่วโมงดังนั้นตรวจสอบให้แน่ใจว่าวัตถุ TS ของคุณตั้งค่าด้วยความถี่ 24
  2. คุณสามารถจำลองระดับของฤดูกาลอื่น ๆ โดยใช้ตัวแปรจำลอง ตัวอย่างเช่นคุณอาจต้องการชุดของหุ่น 0/1 ที่แสดงถึงเดือนของปี
  3. รวมตัวแปรดัมมี่ในการxregโต้แย้งพร้อมกับโควาเรีย (เช่นอุณหภูมิ)
  4. พอดีกับรุ่นที่มีฟังก์ชั่น arima ในฐาน R ฟังก์ชั่นนี้สามารถจัดการกับรุ่น ARMAX ผ่านการใช้xregอาร์กิวเมนต์
  5. ลองใช้ฟังก์ชันArimaและauto.arimaในแพ็คเกจพยากรณ์ auto.arima นั้นดีเพราะมันจะหาพารามิเตอร์ที่ดีสำหรับโมเดล Arima ของคุณโดยอัตโนมัติ อย่างไรก็ตามมันจะใช้เวลาตลอดไปให้พอดีกับชุดข้อมูลของคุณ
  6. ลองใช้ฟังก์ชัน tslm ในแพ็คเกจ arima โดยใช้ตัวแปรจำลองสำหรับแต่ละระดับของฤดูกาล วิธีนี้จะเร็วกว่ารุ่น Arima มากและอาจทำงานได้ดีขึ้นในสถานการณ์ของคุณ
  7. หาก 4/5/6 ไม่ทำงานแล้วเริ่มกังวลเกี่ยวกับฟังก์ชั่นการถ่ายโอน คุณต้องคลานก่อนจึงจะเดินได้
  8. หากคุณวางแผนที่จะคาดการณ์ในอนาคตคุณจะต้องคาดการณ์ตัวแปร xreg ของคุณก่อน นี้เป็นเรื่องง่ายสำหรับหุ่นตามฤดูกาล แต่คุณต้องคิดเกี่ยวกับวิธีการพยากรณ์อากาศที่ดี อาจใช้ค่ามัธยฐานของข้อมูลประวัติศาสตร์หรือไม่

นี่คือตัวอย่างของวิธีที่ฉันจะเข้าหานี้:

#Setup a fake time series
set.seed(1)
library(lubridate)
index <- ISOdatetime(2010,1,1,0,0,0)+1:8759*60*60
month <- month(index)
hour <- hour(index)
usage <- 1000+10*rnorm(length(index))-25*(month-6)^2-(hour-12)^2
usage <- ts(usage,frequency=24)

#Create monthly dummies.  Add other xvars to this matrix
xreg <- model.matrix(~as.factor(month))[,2:12]
colnames(xreg) <- c('Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')

#Fit a model
library(forecast)
model <- Arima(usage, order=c(0,0,0), seasonal=list(order=c(1,0,0), period=24), xreg=xreg)
plot(usage)
lines(fitted(model),col=2)

#Benchmark against other models
model2 <- tslm(usage~as.factor(month)+as.factor(hour))
model3 <- tslm(usage~as.factor(month))
model4 <- rep(mean(usage),length(usage))

#Compare the 4 models
library(plyr) #for rbind.fill
ACC <- rbind.fill(  data.frame(t(accuracy(model))),
                    data.frame(t(accuracy(model2))),
                    data.frame(t(accuracy(model3))),
                    data.frame(t(accuracy(model4,usage)))
                )
ACC <- round(ACC,2)
ACC <- cbind(Type=c('Arima','LM1','Monthly Mean','Mean'),ACC)
ACC[order(ACC$MAE),]

ฟังก์ชั่น fitted () คืออะไร ถ้าฉันใช้สิ่งนั้นฉันจะได้ผลลัพธ์ที่ดีกว่าการคาดการณ์ (model10, newxreg = regParams)
utdiscant

@utdiscant: predict()ใช้สำหรับการคาดการณ์ในขณะที่fitted()ส่งคืนโมเดลพอดีกับช่วงเวลาในอดีต หากคุณต้องการความช่วยเหลือที่เฉพาะเจาะจงมากขึ้นคุณควรโพสต์ตัวอย่างที่ทำซ้ำได้ด้วยรหัสบางส่วน
ซัค

@utdiscant: ถ้าคุณใช้ dayy เป็น xreg คุณจะเสี่ยงต่อการ overfitting เนื่องจากคุณมีเพียง 24 ข้อสังเกตต่อวัน คุณอาจได้ผลลัพธ์การพยากรณ์ที่ดีขึ้นหากคุณใช้เดือนของปี
ซัค

@utdiscant: นอกจาก xregs ตามเวลาของคุณจะต้องมีตัวแปรดัมมี่ วิธีที่คุณสร้างแบบจำลองในตอนนี้คือคุณคาดหวังว่าheatจะเพิ่มขึ้นเป็นเส้นตรงตามชั่วโมงของวันจากนั้นกระโดดกลับลงมาเมื่อชั่วโมงกลับมาเป็น 1 หากคุณใช้ตัวแปรจำลองแต่ละชั่วโมงของวันจะได้รับผลของมันเอง ทำงานผ่านโค้ดตัวอย่างของฉันและให้ความสนใจกับวิธีการสร้างวัตถุ xreg ของฉัน
ซัค

ข้อเสียประการหนึ่งของฟังก์ชั่น ARIMA ในstatsและforecastแพคเกจก็คือว่ามันไม่เหมาะกับฟังก์ชั่นการถ่ายโอนข้อมูล เอกสารของstats::arimaฟังก์ชั่นของรัฐดังต่อไปนี้: ถ้าคำ xreg รวมอยู่ด้วยการถดถอยเชิงเส้น (ด้วยคำที่คงที่ถ้า include.mean เป็นจริงและไม่มีความแตกต่าง) จะถูกติดตั้งด้วยแบบจำลอง ARMA สำหรับคำผิดพลาด ดังนั้นถ้าคุณต้องการจริงฟังก์ชั่นการถ่ายโอนพอดีมันดูเหมือนว่าฟังก์ชั่นเป็นวิธีที่จะไปTSA::arimax R
Christoffer

8

ฉันใช้ R เพื่อทำการพยากรณ์โหลดเป็นระยะเวลาหนึ่งและฉันสามารถแนะนำให้คุณใช้forecastแพ็คเกจและฟังก์ชั่นที่ประเมินค่าไม่ได้ (เช่นauto.arima)

คุณสามารถสร้างแบบจำลอง ARIMA ด้วยคำสั่งต่อไปนี้:

model = arima(y, order, xreg = exogenous_data)

ด้วยการyคาดเดาของคุณ (ฉันคิดว่าdayy) orderลำดับของแบบจำลองของคุณ (พิจารณาตามฤดูกาล) และexogenous_dataอุณหภูมิของคุณรังสีแสงอาทิตย์ ฯลฯ ฟังก์ชั่นauto.arimaช่วยให้คุณค้นหาลำดับโมเดลที่ดีที่สุด คุณสามารถค้นหากวดวิชาสั้น ๆ เกี่ยวกับแพคเกจ `คาดการณ์' ที่นี่


สิ่งที่จะทำนายได้คือความร้อน (การบริโภคความร้อนของบ้าน)
utdiscant

3

ฉันเองไม่เข้าใจฟังก์ชั่นการถ่ายโอน แต่ฉันคิดว่าคุณได้รับxtransfและxregย้อนกลับ อย่างน้อยก็ในฐานของ R arimaนั่นคือมันxregมีตัวแปรภายนอกของคุณ มันเป็นความประทับใจของฉันที่ฟังก์ชั่นการถ่ายโอนอธิบายวิธีการ (ข้อมูลล่าช้าส่งผลกระทบต่อค่าในอนาคต) มากกว่าสิ่งที่

ฉันจะลองใช้xregกับตัวแปรภายนอกของคุณบางทีใช้arimaถ้าarimaxต้องการฟังก์ชันถ่ายโอน ปัญหาคือว่าแบบจำลองของคุณเป็นรายวัน แต่ข้อมูลของคุณมีทั้งแบบรายวันและรายปีและฉันไม่แน่ใจว่าตอนนี้ถ้าความแตกต่างครั้งแรก ( order=(*, 1, *)) จะดูแลหรือไม่ (แน่นอนคุณจะไม่ได้รับการคาดการณ์ตลอดทั้งปีจากโมเดลที่พิจารณาเฉพาะฤดูกาลตามฤดูกาล)

ป.ล. timeคุณใช้lmอะไรในตัวคุณ เวลานาฬิกาตัวอักษรหรือหมายเลขการสังเกต 1-up? ฉันคิดว่าคุณจะได้รับบางสิ่งบางอย่างจากการใช้โมเดลมิกซ์เอฟเฟกต์ ( lmerในlme4แพ็คเกจ) แม้ว่าฉันจะไม่ทราบว่าการทำเช่นนั้นถูกต้องหรือไม่สำหรับความสัมพันธ์แบบอัตโนมัติที่จะเกิดขึ้นในอนุกรมเวลา หากไม่นับรวมถึงสิ่งที่lmไม่ใช่คุณอาจได้รับแบบที่น่าสนใจ แต่แนวคิดของคุณเกี่ยวกับความแม่นยำในการทำนายของคุณจะเป็นไปในแง่ดีเกินไป


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