שְׁאֵלָה:
כיצד להתאים דגם ARIMAX עם R?
utdiscant
2011-11-15 02:41:03 UTC
view on stackexchange narkive permalink

יש לי ארבע סדרות זמן שונות של מדידות לפי שעה:

  1. צריכת החום בתוך הבית
  2. הטמפרטורה מחוץ לבית
  3. השמש קרינה
  4. מהירות הרוח

אני רוצה להיות מסוגל לחזות את צריכת החום בתוך הבית. ישנה מגמה עונתית ברורה, הן על בסיס שנתי והן על בסיס יומי. מכיוון שיש מתאם ברור בין הסדרות השונות, אני רוצה להתאים אותן באמצעות מודל ARIMAX. ניתן לעשות זאת ב- R, באמצעות הפונקציה arimax מהחבילה TSA.

ניסיתי לקרוא את התיעוד על פונקציה זו ולקרוא על פונקציות העברה, אך עד כה הקוד שלי:

  regParams = ts.union (ts (dayy)) transferParams = ts.union (ts (temp)) מודל 10 = arimax (חום, סדר = c (2,1,1), עונתי = רשימה (סדר = c (0,1,1), נקודה = 24), xreg = regParams, xtransf = transferParams, transfer = list (c (1,1)) pred10 = לחזות (model10, newxreg = regParams)  

נותן לי: enter image description here

כאשר הקו השחור הוא הנתונים שנמדדו בפועל, והקו הירוק הוא המודל המתאים שלי בהשוואה. לא רק שהוא לא מודל טוב, אבל ברור שמשהו לא בסדר.

אני מודה שהידע שלי על מודלים של ARIMAX ופונקציות העברה מוגבל. בפונקציה arimax (), (עד כמה שהבנתי), xtransf הוא הזמן האקסוגני סדרות בהן אני רוצה להשתמש (באמצעות פונקציות העברה) כדי לחזות את סדרות הזמן העיקריות שלי. אבל מה ההבדל בין xreg ל- xtransf באמת?

באופן כללי יותר, מה האם טעיתי? הייתי רוצה להיות בכושר טוב יותר מזה שהושג מ- lm (חום ~ טמפ רדי רוח * זמן).

עריכות: בהתבסס על חלק מהתגובות, הסרתי את ההעברה והוספתי במקום זאת xreg:

regParams = ts.union (ts (dayy), ts (temp), ts (time)) model10 = arimax (חום, סדר = c (2,1,1), עונתי = רשימה (סדר = c (0,1,1), נקודה = 24), xreg = regParams)

כאשר יום הוא "יום מספר השנה", והשעה היא שעת היום. טמפ הוא שוב הטמפרטורה בחוץ. זה נותן לי את התוצאה הבאה:

enter image description here

שהיא טובה יותר, אך לא כמעט מה שציפיתי לראות.

שְׁלוֹשָׁה תשובות:
Zach
2011-11-17 21:04:32 UTC
view on stackexchange narkive permalink

תהיה לך קצת בעיה לדגמן סדרה עם 2 רמות עונתיות באמצעות מודל ARIMA. השגת נכון זה תלויה מאוד בהגדרת הדברים בצורה נכונה. שקלת כבר מודל לינארי פשוט? הם הרבה יותר מהירים וקלים יותר להתאמה מאשר דגמי ARIMA, ואם אתה משתמש במשתני דמה עבור רמות העונתיות השונות שלך, הם לרוב די מדויקים.

  1. אני מניח שיש לך נתונים לפי שעה, לכן וודאו כי אובייקט ה- TS שלכם מוגדר בתדירות 24.
  2. תוכלו לדגם רמות עונתיות אחרות באמצעות משתני דמה. לדוגמה, ייתכן שתרצה קבוצה של 0/1 בובות המייצגות את חודש השנה.
  3. כלול את משתני הדמה בארגומנט xreg , יחד עם כל משתנים משתנים (כמו טמפרטורה)
  4. התאימו את המודל לפונקציית ארימה בבסיס R. פונקציה זו יכולה להתמודד עם דגמי ARMAX באמצעות הארגומנט xreg .
  5. נסה את פונקציות ארימה ו- auto.arima בחבילת התחזית. auto.arima נחמד מכיוון שהוא ימצא באופן אוטומטי פרמטרים טובים לדגם ה- arima שלך. עם זאת, ייקח לנצח להתאים למערך הנתונים שלך.
  6. נסה את הפונקציה tslm בחבילה ארימה, תוך שימוש במשתני דמה לכל רמה של עונתיות. זה יתאים הרבה יותר מהר מדגם ארימה, ואולי אפילו יעבוד טוב יותר במצבך.
  7. אם 4/5/6 לא עובדים, אז תתחיל לדאוג לפונקציות העברה. עליך לזחול לפני שתוכל ללכת.
  8. אם אתה מתכנן לחזות לעתיד, תחילה תצטרך לחזות את משתני ה- xreg שלך. זה קל עבור בובות עונתיות, אבל תצטרך לחשוב איך לעשות תחזיות מזג אוויר טובות. אולי השתמש בחציון הנתונים ההיסטוריים?

הנה דוגמה לאופן בו הייתי מתקרב לכך:

  # הגדרת זמן מזויף seriesset.seed (1 ) אינדקס ספרייה (lubridate) <- ISOdatetime (2010,1,1,0,0,0) +1: 8759 * 60 * 60month <- חודש (אינדקס) שעה <- שעה (אינדקס)
שימוש <- 1000 + 10 * rnorm (אורך (אינדקס)) - 25 * (חודש -6) ^ 2- (שעה -12) ^ 2 שימוש <- ts (שימוש, תדירות = 24) # צור דומיות חודשיות. הוסף xvars אחרים למטריצה ​​xreg <- model.matrix (~ as.factor (month)) [, 2:12] colnames (xreg) <- c ('Feb', 'Mar', 'Apr', 'May', 'יוני', 'יול', 'אוג' ',' ספט ',' אוקטובר ',' נובמבר ',' דצמבר ') # התאם מודל ספרייה (תחזית) מודל <- ארימה (שימוש, סדר = c (0,0, 0), עונתי = רשימה (סדר = c (1,0,0), נקודה = 24), xreg = xreg) שורות מגרש (שימוש) (מצויד (דגם), col = 2) # סימן שווי מול דגמים אחרים model2 <- tslm (שימוש ~ כ.factor (חודש) + as.factor (שעה)) מודל 3 <- tslm (שימוש ~ as.factor (חודש)) דגם 4 <- rep (ממוצע (שימוש), אורך (שימוש)) # השווה את 4 modelslibrary (plyr) #for rbind.fillACC <- rbind.fill (data.frame (t (accuracy (model))), data.frame (t (accuracy (model2))), data.frame (t (accuracy (model3) ))), data.frame (t (דיוק (דגם 4, שימוש)))) ACC <- עגול (ACC, 2) ACC <- cbind (Type = c ('Arima', 'LM1', 'Monthly mean') 'מתכוון'), ACC) ACC [סדר (ACC $ MAE),]  
מהי הפונקציה () המותאמת. אם אני משתמש בכך, אני משיג תוצאות טובות בהרבה מאשר עם לנבא (model10, newxreg = regParams).
@utdiscant: `לחזות ()` משמש לחיזוי, בעוד ש'מצויד () 'מחזיר את התאמת המודל לאורך התקופה ההיסטורית. אם אתה רוצה עזרה ספציפית יותר, עליך לפרסם דוגמה לשחזור עם קוד כלשהו.
@utdiscant:, אם אתה משתמש ב- dayy כ- xreg, אתה מסתכן בהתאמת יתר, מכיוון שיש לך רק 24 תצפיות ביום. ייתכן שתשיג תוצאות חיזוי טובות יותר אם תשתמש בחודש השנה.
@utdiscant: יתר על כן, ה- xregs המבוססים על הזמן שלך צריכים להיות * משתני דמה *. האופן שבו אתה מעצב את זה עכשיו הוא שאתה מצפה ש"חום "יגדל באופן ליניארי עם שעה ביום, ואז יקפוץ חזרה למטה כשהשעה תחזור ל 1. אם אתה משתמש במשתני דמה, כל שעה ביום תקבל את האפקט שלה . עברו על קוד הדוגמה שלי, ושימו לב היטב לאופן בו אני בונה את אובייקט ה- xreg שלי.
חסרון אחד של פונקציות ה- ARIMA בחבילות 'סטטיסטיקה' ו'תחזית 'הוא שהן אינן מתאימות לפונקציות העברת גשמים.בתיעוד הפונקציה 'סטטיסטיקה :: ארימה' נאמר את הדברים הבאים: _ אם כלול מונח של xreg, רגרסיה ליניארית (עם מונח קבוע אם include.mean נכון ואין הבדל) מצויד במודל ARMA עבורמונח שגיאה. אז אם אתה באמת צריך להתאים לפונקציות העברה, נראה שהפונקציה `TSA :: arimax` היא הדרך ללכת ב- 'R'.
Matteo De Felice
2011-11-17 20:45:16 UTC
view on stackexchange narkive permalink

אני משתמש ב- R בכדי לבצע חיזוי עומס במשך זמן מה ואני יכול להציע לך להשתמש בחבילה תחזית ובפונקציות החשובות מפז שלה (כמו auto.arima ).

באפשרותך לבנות מודל ARIMA עם הפקודה הבאה:

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

עם y התחזית שלך (אני מניח dayy ), order סדר המודל שלך (בהתחשב בעונתיות) ו- exogenous_data ​​code > הטמפרטורה שלך, קרינת השמש וכו '. הפונקציה auto.arima עוזרת לך למצוא את סדר המודל האופטימלי. תוכלו למצוא הדרכה קצרה על חבילת 'תחזית' כאן.

מה שיש לחזות זה חום (צריכת החום של הבית).
Wayne
2011-11-17 02:38:44 UTC
view on stackexchange narkive permalink

אני באופן אישי לא מבין בפונקציות העברה, אבל אני חושב שהופכת את xtransf ו- xreg . לפחות ב- ארימה של R זה xreg שמכיל את המשתנים האקסוגניים שלך. התרשמתי כי פונקציית העברה מתארת ​​ כיצד (נתונים בפיגור משפיעים על ערכים עתידיים) ולא על מה .

הייתי מנסה להשתמש ב xreg עבור המשתנים האקסוגניים שלך, אולי באמצעות ארימה אם arimax דורש פונקציית העברה. הבעיה היא שהמודל שלך הוא יומי, אך לנתונים שלך יש עונתיות יומית וגם שנתית, ואני לא בטוח כרגע אם ההבדל הראשון ( order = (*, 1, *) ) ידאג לזה או לא. (בוודאי לא תקבל תחזיות קסומות לכל השנה ממודל שרק מתחשב בעונתיות יומית.)

P.S. מהו הזמן שבו אתה משתמש ב- lm שלך? זמן שעון מילולי או מספר תצפית 1-up? אני חושב שתוכל להשיג משהו על ידי שימוש במודל אפקט מעורב ( lmer בחבילה lme4 ), אם כי לא הבנתי אם פעולה נכונה מחשבת את המתאם האוטומטי שיתרחש בסדרת זמנים. אם לא מביאים בחשבון, ש- lm לא, אתה עשוי לקבל התאמה מעניינת, אך הרעיון שלך עד כמה החיזוי שלך מדויק יהיה אופטימי מדי.

יש לי גם את שעת המדידה וגם את "יום השנה" של המדידה.


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...