STL тенденція часових рядів з використанням R


27

Я новачок у аналізі R та часових рядів. Я намагаюся знайти тенденцію тривалого (40 років) добового часового ряду температур і намагався до різних наближень. Перший - це просто проста лінійна регресія, а другий - Сезонне розкладання часових рядів Лоссом.

В останньому виявляється, що сезонна складова більша за тенденцію. Але як я можу оцінити тенденцію? Я хотів би, щоб лише число розповідало, наскільки сильна ця тенденція.

     Call:  stl(x = tsdata, s.window = "periodic")
     Time.series components:
        seasonal                trend            remainder               
Min.   :-8.482470191   Min.   :20.76670   Min.   :-11.863290365      
1st Qu.:-5.799037090   1st Qu.:22.17939   1st Qu.: -1.661246674 
Median :-0.756729578   Median :22.56694   Median :  0.026579468      
Mean   :-0.005442784   Mean   :22.53063   Mean   : -0.003716813 
3rd Qu.:5.695720249    3rd Qu.:22.91756   3rd Qu.:  1.700826647    
Max.   :9.919315613    Max.   :24.98834   Max.   : 12.305103891   

 IQR:
         STL.seasonal STL.trend STL.remainder data   
         11.4948       0.7382    3.3621       10.8051
       % 106.4          6.8      31.1         100.0  
     Weights: all == 1
     Other components: List of 5   
$ win  : Named num [1:3] 153411 549 365  
$ deg  : Named int [1:3] 0 1 1   
$ jump : Named num [1:3] 15342 55 37  
$ inner: int 2  
$ outer: int 0

введіть тут опис зображення

Відповіді:


20

Я б не stl()переймався цим - пропускна здатність для більш низької плавності, яка використовується для вилучення тенденції, далеко, далеко, до малих, що призводить до невеликих коливань масштабу, які ви бачите. Я б застосував модель присадки. Ось приклад використання даних та коду моделі з книги Саймона Вуда про ігри GAM:

require(mgcv)
require(gamair)
data(cairo)
cairo2 <- within(cairo, Date <- as.Date(paste(year, month, day.of.month, 
                                              sep = "-")))
plot(temp ~ Date, data = cairo2, type = "l")

дані температури в Каїрі

Підходить модель з трендом і сезонними компонентами --- попереджаючи, що це повільно:

mod <- gamm(temp ~ s(day.of.year, bs = "cc") + s(time, bs = "cr"),
            data = cairo2, method = "REML",
            correlation = corAR1(form = ~ 1 | year),
            knots = list(day.of.year = c(0, 366)))

Приталена модель виглядає приблизно так:

> summary(mod$gam)

Family: gaussian 
Link function: identity 

Formula:
temp ~ s(day.of.year, bs = "cc") + s(time, bs = "cr")

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  71.6603     0.1523   470.7   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Approximate significance of smooth terms:
                 edf Ref.df       F p-value    
s(day.of.year) 7.092  7.092 555.407 < 2e-16 ***
s(time)        1.383  1.383   7.035 0.00345 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

R-sq.(adj) =  0.848  Scale est. = 16.572    n = 3780

і ми можемо візуалізувати тенденцію та сезонні умови через

plot(mod$gam, pages = 1)

Каїр підходив до тренду і сезону

і якщо ми хочемо побудувати тенденцію на спостережуваних даних, ми можемо зробити це за допомогою прогнозування через:

pred <- predict(mod$gam, newdata = cairo2, type = "terms")
ptemp <- attr(pred, "constant") + pred[,2]
plot(temp ~ Date, data = cairo2, type = "l",
     xlab = "year",
     ylab = expression(Temperature ~ (degree*F)))
lines(ptemp ~ Date, data = cairo2, col = "red", lwd = 2)

Каїр підходив до тенденції

Або те саме для фактичної моделі:

pred2 <- predict(mod$gam, newdata = cairo2)
plot(temp ~ Date, data = cairo2, type = "l",
     xlab = "year",
     ylab = expression(Temperature ~ (degree*F)))
lines(pred2 ~ Date, data = cairo2, col = "red", lwd = 2)

Каїр підходить модель

Це лише приклад, і для більш глибокого аналізу, можливо, доведеться мати справу з тим, що є декілька відсутніх даних, але вищезазначене має стати гарною відправною точкою.

Щодо вашої точки зору, як оцінити тенденцію - добре, що це проблема, тому що тенденція не є лінійною, ні у вашій stl()версії, ні у GAM-версії, яку я показую. Якби це було, ви могли б дати швидкість зміни (нахилу). Якщо ви хочете дізнатись, наскільки змінилася орієнтована тенденція за період вибірки, то ми можемо використовувати дані, що містяться в, predта обчислити різницю між початком і кінцем серії лише в компоненті тренду :

> tail(pred[,2], 1) - head(pred[,2], 1)
    3794 
1.756163

тому температура в середньому на 1,76 градуса тепліша, ніж на початку рекорду.


Дивлячись на діаграму, я думаю, що може виникнути певна плутанина між Фаренгейтом і Цельсієм.
Генрі

Добре помічений - я займався чимось подібним вже кілька місяців, і дані знаходяться в ступені C. Була сила звички!
Відновіть Моніку - Г. Сімпсон

Дякую, Гевін, дуже приємна і зрозуміла відповідь. Я спробую ваші пропозиції. Це гарна ідея побудувати трендовий компонент stl () та здійснити лінійну регресію?
pacomet

1
@pacomet - ні, не дуже, якщо тільки ви не підходите до моделі, яка враховує автокореляцію в залишках, як я робив вище. Ви можете використовувати GLS для цього ( gls()у пакеті nlme). Але, як зазначено вище для Каїра, і STL пропонує для ваших даних, тенденція не є лінійною. Таким чином, лінійна тенденція не була б доречною - оскільки вона не описує дані належним чином. Вам потрібно спробувати це на своїх даних, але така АМ, як я показую, погіршиться до лінійної тенденції, якби це найкраще відповідало даним.
Відновіть Моніку - Г. Сімпсон

1
@ andreas-h, я б цього не робив; тенденція STL закінчена. Встановіть GAM зі структурою AR () та інтерпретуйте тенденцію. Це дасть правильну регресійну модель, яка буде набагато кориснішою для вас.
Відновіть Моніку - Г. Сімпсон

4

Gavin надав дуже ретельний відповідь, але для більш простого і більш швидкого вирішення, я рекомендую встановити на стла функцію t.window параметра на значення , яке є кратною частотою з Т.С. даних. Я б застосував висновок про періодичність інтересу (наприклад, значення 3660 для тенденцій десятиліття з даними добової роздільної здатності). Можливо, вас також зацікавить пакет stl2, описаний у авторській дисертації . Я застосував метод Гевіна до власних даних, і він дуже ефективний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.