7

時系列の最初にNAを生成せずに、特定の時間ウィンドウでの移動平均を計算したいと思います。たとえば、時間枠を3に設定すると、最初の2つの観測値にNAが含まれます。私が欲しいのは、最初の観測に1、2番目の観測に2、残りのすべての観測に3の時間枠を設定することです。

私の現在のコード:

#example data
x <- c(3,9,2,8,4,6,5,8)
#moving average with time window of length 3
(ma3 <- filter(x,rep(1/3,3),sides=1))
4

6 に答える 6

3

rollapplyも電車に飛び乗らせてください:

> rollapply(c(NA, NA, x), width=3, FUN=mean, na.rm=T)
[1] 3.000000 6.000000 4.666667 6.333333 4.666667 6.000000 5.000000 6.333333

2 つの = 3-1NA値を先頭に追加しna.rm=Tて使用すると、時系列が拡張されますが、平均を計算するための新しい値は無視されます。少し難しいが、それ以外は同等の構文

> rollapply(c(NA, NA, x), width=3, FUN=function(v) mean(v, na.rm=T))

これを指摘してくれたマシューに感謝します。

于 2013-02-17T22:15:50.377 に答える
2

@thelatemail はすばらしい仕事をしてくれましたが、コードにエラーがあり (は関数内test[]で置き換える必要がx[]あります)、さらに重要なことに、ベクトルの最後で同じことをしなければなりませんでした (side=2 が必要な場合)。また、ウィンドウ サイズは、ベクトルの i 番目の要素の 2 倍 + 1 (および最後の n-i 番目の要素) にする必要があります。したがって、これが最終バージョンです。

movavg.grow = function(x,window) {
  startma = sapply(1:(floor(window/2)),function(y) mean(x[1:((y-1)*2+1)]))
  endma = sapply(1:(floor(window/2)),function(y) mean(x[(length(x)-((y-1)*2)):length(x)]))
  endma = rev(endma)
  c(startma,
    filter(x,rep(1/window,window))[(floor(window/2):(length(x)- floor(window)/2)+1)],
    endma)
}

テストに関しては、あなたが望むものは返さなければなりませ1:10x=1:10

> x=1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> movavg.grow(x,5)
 [1]  1  2  3  4  5  6  7  8  9 10
> movavg.grow(x,3)
 [1]  1  2  3  4  5  6  7  8  9 10
于 2014-04-20T02:41:53.790 に答える
1

そこに到達するためのベースRのカスタム関数:

movavg.grow <- function(x,window,sides) {
 startma <- sapply(1:(window-1),function(y) mean(x[1:y]))
 c(startma,filter(x,rep(1/window,window),sides=sides)[window:length(x)])
}

試して:

> test <- c(3,9,2,8,4,6,5,8)
> movavg.grow(x=test,window=3,sides=1)
[1] 3.000000 6.000000 4.666667 6.333333 4.666667 6.000000 5.000000 6.333333
于 2013-02-17T22:58:01.247 に答える