web-dev-qa-db-ja.com

Rの前の3つの値の移動平均

Zooパッケージには、移動平均を作成できるrollmeanと呼ばれる関数があります。 rollmean(x,3)は、次の表の前、現在、次の値(つまり、4、6、2)を取ります。これは2番目の列に示されています。

x   rollmean    ma3
4       
6   4.0 
2   4.3 
5   3.0         4.0
2   6.3         4.3
12  6.0         3.0
4   6.0         6.3
2               6.0

同じ仕事をしたいのですが、4行目の前の3つの値を平均することによって。これは3番目の列に表示されます。誰かがこれを達成するのに役立つ関数の名前を教えてもらえますか?

12
Jochem

必要なことを実行するための柔軟性を備えた、移動平均の単純な関数を探すのに苦労しました。私はついに、rinniが上記のコメントで与えたフィルター関数に基づいて1つを拡張するいくつかの関数を書きました(ただし、3期間の平均に現在の観測が含まれるため、それ自体は機能しません)。

  1. 現在の観測値を含む移動平均関数

    mav <- function(x,n){filter(x,rep(1/n,n), sides=1)} 
    
  2. 現在の観測値を含まない移動平均関数

    mavback <- function(x,n){
      a<-mav(x,1)
      b<-mav(x,(n+1))
      c<-(1/n)*((n+1)*b - a)
      return(c)
    }
    
  3. [h1]期間から始まる[h2]の読み取り値に基づく、現在のobsを含まない後方視移動平均関数

    mavback1<-function(x,h1,h2){
      a<-mavback(x,h1)
      b<-mavback(x,h1-h2)
      c<-(1/h2)*(h1*a -(h1-h2)*b)
      return(c)
    }
    
4
w_i_l_l

rollmeanを使用できますが、align='right'を設定します。または、デフォルトとしてalign='right'を持つrollmeanrを使用することもできます。

ma3 <- rollmeanr(x[,1],3,fill=NA)

...しかし、それでも結果を遅らせる必要があります。別の解決策は、rollapply引数のリストとともにwidthを使用することです。

ma3 <- rollapplyr(x[,1],list(-(3:1)),mean,fill=NA)
16
Joshua Ulrich

彼のmav関数に基づくw_i_l_lのmavback関数のより単純な実装

mavback <- function(x,n){ filter(x, c(0, rep(1/n,n)), sides=1) }

0
Fede