R을 사용한 시계열의 STL 추세


27

저는 R과 시계열 분석에 익숙하지 않습니다. 나는 긴 (40 년) 일일 온도 시계열의 추세를 찾으려고 노력하고 다른 근사치를 시도했습니다. 첫 번째는 단순한 선형 회귀이고 두 번째는 Loess의 시계열의 계절 분해입니다.

후자의 경우 계절 성분이 추세보다 큰 것으로 보입니다. 그러나 트렌드를 어떻게 수량화합니까? 나는 그 추세가 얼마나 강한지를 말하는 숫자를 원합니다.

     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()이것을 귀찮게하지 않을 것입니다 -추세를 추출하는 데 사용되는 lowess smoother의 대역폭은 훨씬 작습니다. 이로 인해 작은 규모 변동이 발생합니다. 나는 추가 모델을 사용합니다. 다음은 GAM에 대한 Simon Wood의 책의 데이터 및 모델 코드를 사용하는 예입니다.

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도 더 따뜻합니다.


차트를 보면 화씨와 섭씨 사이에 약간의 혼란이있을 수 있습니다.
Henry

잘 발견-몇 달 동안 비슷한 일을 해왔고 데이터는 C 등급입니다. 습관의 힘이었습니다!
복원 모니카-G. 심슨

매우 훌륭하고 이해하기 쉬운 답변 Gavin에게 감사드립니다. 나는 당신의 제안을 시도합니다. stl () 트렌드 구성 요소를 플로팅하고 선형 회귀를 만드는 것이 좋습니다?
pacomet

1
@pacomet-위에서 말한 것처럼 잔차의 자기 상관을 설명하는 모델에 적합하지 않으면 실제로는 아닙니다. 이를 위해 GLS를 사용할 수 있습니다 ( gls()패키지 nlme에 있음). 그러나 위의 카이로와 STL이 데이터에 대해 제시 한 것처럼 추세는 선형이 아닙니다. 따라서 선형 추세는 데이터를 올바르게 설명하지 않기 때문에 적절하지 않습니다. 당신은 당신의 데이터에 그것을 시도해야하지만, 내가 보여주는 것과 같은 AM은 데이터에 가장 적합하다면 선형 추세로 떨어질 것입니다.
복원 모니카-G. 심슨

1
@ andreas-h 나는 그렇게하지 않을 것이다; STL 트렌드가 너무 적합합니다. AR () 구조에 GAM을 맞추고 추세를 해석하십시오. 그것은 당신에게 훨씬 유용한 적절한 회귀 모델을 줄 것입니다.
복원 모니카

4

Gavin은 매우 철저한 답변을 제공했지만 더 간단하고 빠른 솔루션을 위해 stl 함수 t.window 매개 변수를 ts 데이터 의 주파수 의 배수 인 값으로 설정하는 것이 좋습니다 . 유추 된 관심주기 (예를 들어, 일별 분해능 데이터가있는 10 년 추세의 경우 3660)를 사용합니다. 저자의 논문에 설명 된 stl2 패키지에 관심이있을 수도 있습니다 . Gavin의 방법을 내 데이터에 적용했으며 매우 효과적입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.