tetsunosukeのnotebook

tetsunosukeのメモです

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")

f:id:kidd-number5:20111013124546p:image:w200

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:横の軸も重なってしまい見づらいので、これは解消法を調べればいいんじゃなかろうか