Rを使用した時系列のSTLトレンド


27

私はRと時系列分析を初めて使用します。私は長い(40年)毎日の気温の時系列の傾向を見つけようとしており、さまざまな近似を試みました。1つ目は単純な線形回帰で、2つ目は黄土による時系列の季節的分解です。

後者では、季節成分が傾向よりも大きいようです。しかし、どのようにトレンドを定量化できますか?その傾向がどれほど強いかを伝える数字をお願いします。

     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()-トレンドを抽出するために使用される最も低いスムーザーの帯域幅は、はるかに小さく、結果としてあなたが見る小さなスケールの変動になります。加算モデルを使用します。Simon Woodの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度です。習慣の力でした!
モニカの復職-G.シンプソン

非常に素晴らしく、理解可能な答えであるGavinに感謝します。あなたの提案を試みます。stl()トレンドコンポーネントをプロットし、線形回帰を行うのは良い考えですか?
パコメ

1
@pacomet-いいえ、実際にはそうではありません。上記のように残差の自己相関を考慮したモデルに適合しない限り。そのためにGLSを使用できます(gls()nlmeパッケージ内)。しかし、カイロについて上記が示しているように、STLがデータについて示唆しているように、傾向は線形ではありません。そのため、線形トレンドは適切ではありません-データを適切に説明していないためです。データで試してみる必要がありますが、上に示したようなAMは、データに最も適合した場合、線形トレンドに低下します。
モニカの復活-G.シンプソン

1
@ andreas-hそんなことはしません。STLトレンドが過剰に適合しています。GAMをAR()構造に適合させ、トレンドを解釈します。これにより、適切な回帰モデルが得られ、はるかに役立ちます。
モニカの復職-G.シンプソン

4

Gavinは非常に詳細な回答を提供しましたが、よりシンプルで高速なソリューションを得るには、stl関数のt.windowパラメーターをtsデータの周波数の倍数の値に設定することをお勧めします。推定された関心のある周期性を使用します(たとえば、日単位の解像度データを使用した10年ごとの傾向の場合は3660の値)。著者の論文に記載されているstl2パッケージにも興味があるかもしれません。Gavinの方法を自分のデータに適用しましたが、これも非常に効果的です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.