Rで移動平均
Rで移動平均をやってみます。
Rで移動平均を求めるには、自前で計算をしろ、というのが検索すると出てくるのですが、もうちょっとよく調べたら、パッケージがあるようなので、それをそのまま利用します。
そもそも移動平均は、SMA(Simple moving average)とEMA(Exponential moving average=指数平滑)がよくあるようで、このSMAというキーワードで検索し、パッケージを見つけました。
http://rss.acs.unt.edu/Rdoc/library/TTR/html/MovingAverages.html
パッケージのロードについては、library() を使います。
パッケージをダウンロードしたあと、
> library(TTR) 要求されたパッケージ xts をロード中です 要求されたパッケージ zoo をロード中です 次のパッケージを付け加えます: 'zoo' The following object(s) are masked from 'package:base': as.Date 警告メッセージ: 1: パッケージ 'TTR' はバージョン 2.13.2 の R の下で造られました 2: パッケージ 'xts' はバージョン 2.13.2 の R の下で造られました 3: パッケージ 'zoo' はバージョン 2.13.2 の R の下で造られました
これで、SMA() により、移動平均を求めることができます。
> x <- c(1,2,3,4,5,4,3,2,1) > x [1] 1 2 3 4 5 4 3 2 1 > SMA(x, 5) [1] NA NA NA NA 3.0 3.6 3.8 3.6 3.0
最初の3.0は区間5の移動平均、つまり (1+2+3+4+5)/5 = 3.0だし、次は (2+3+4+5+4)/5 = 18/5 = 3.6 で正しいですね。
ここでこれらの変数について、グラフを書いてみます。
> x [1] 1 2 3 4 5 4 3 2 1 > sx <- SMA(x, 5) > sx [1] NA NA NA NA 3.0 3.6 3.8 3.6 3.0 > plot(x) > par(new=T) > plot(sx, type="b")
parを使うことで、二つのグラフを重ねることができるようです。*1
移動平均なので、本来は移動平均の遅れを解消、つまり、sxn <- c(NA,NA, 3.0, 3.6, 3.8, 3.6, 3.0) となるようなデータ構造にしたうえでplotすべきなのですが、この配列の操作が分からなかったので今日のところは保留します。
いい加減Rの基本的な変数の型?の操作を学習しておかないといけないなという気がしてきました。
10/17 追記
下記のようにすれば、配列の要素の任意の部分を取り出すことができるようです。pythonみたいに、sx[5:]とかで取りたいけどそれは使えないようです。配列長についてはlength(sx) で求めることもできるので、
> sx = sx[5:length(sx)] > sx [1] 3.0 3.6 3.8 3.6 3.0
でOKです。
*1:横の軸も重なってしまい見づらいので、これは解消法を調べればいいんじゃなかろうか