8
input = cbind(c(3,7,3,5,2,9,1,4,6,4,7,3,7,4))
library(zoo)
output = cbind(rollmean(input,4))
print(input)
print(output)

出力:

      [,1]
 [1,]    3
 [2,]    7
 [3,]    3
 [4,]    5
 [5,]    2
 [6,]    9
 [7,]    1
 [8,]    4
 [9,]    6
[10,]    4
[11,]    7
[12,]    3
[13,]    7
[14,]    4
      [,1]
 [1,] 4.50
 [2,] 4.25
 [3,] 4.75
 [4,] 4.25
 [5,] 4.00
 [6,] 5.00
 [7,] 3.75
 [8,] 5.25
 [9,] 5.00
[10,] 5.25
[11,] 5.25

しかし、私がそれを結合しようとすると:

Error in cbind(input, output) :
  number of rows of matrices must match (see arg 2)
Calls: print -> cbind
Execution halted

十分に賢く、ベクトルの両端でデータを取得せず、出力を計算し、そのデータのみに基づいて出力を計算しなくても諦めない関数を使用したいと思います。たとえば、input [1]では、右からの平均のみを計算します

4

3 に答える 3

14

na.padの引数を見てrollmean()、に設定しTRUEます。最後のビットを逃した; したがって、手段を右に揃える必要もあります。

> input <- c(3,7,3,5,2,9,1,4,6,4,7,3,7,4)
> rollmean(input, 4, na.pad = TRUE, align = "right")
 [1]   NA   NA   NA 4.50 4.25 4.75 4.25 4.00 5.00 3.75 5.25 5.00 5.25 5.25

これらを1列の行列として必要としない限り、cbind()呼び出しを削除してください。

OK、さらに明確にすることから、結果ベクトルの他の平均と実際には比較できないいくつかの平均を計算したいようです。しかし、あなたがしなければならないなら...

> k <- 4
> c( cumsum(input[1:(k-1)]) / 1:(k-1), rollmean(input, k, align = "right") )
 [1] 3.000000 5.000000 4.333333 4.500000 4.250000 4.750000 4.250000 4.000000
 [9] 5.000000 3.750000 5.250000 5.000000 5.250000 5.250000

OPはMAを推定してスプラインをそれに適合させることに関心があるため、データから直接スプラインを推定するのではなく、これを行うことで何が得られるかを確認することが役立つ場合があります。

> ## model observed data
> mod <- smooth.spline(seq_along(input), input, df = 3)
> ## plot data and fitted spline
> plot(seq_along(input), input)
> lines(predict(mod, seq_along(input)), col = "red", lwd = 2)
> ## model the fudged MA
> mod2 <- smooth.spline(seq_along(input),
+                       c( cumsum(input[1:(k-1)]) / 1:(k-1),
+                         rollmean(input, k, align = "right") ), df = 3)
> ## add this estimated spline
> lines(predict(mod2, seq_along(input)), col = "blue", lwd = 2)

これら2つの違いを区別するのは難しいでしょう MAの直接スムーズとスムーズの比較

そして、曲線は、MAの推定を強制している最初の部分で最もずれています。

于 2010-12-12T15:40:13.847 に答える
11

これは古い質問ですが、これを読んでいる人にとっては、それが役立つことを願っています。

関数meanでrollapplyを使用し、partial = TRUEを使用すると、関数を計算できない初期値が保持されます。

x <- rollapply(input, width = 5, FUN = mean, align = "centre", partial = TRUE)

??rollapply 
??rollapplyr # for right aligned moving average
于 2014-10-06T12:52:15.240 に答える
2

これまでのところ、この質問は3人の経験豊富なRコーダーによってあいまいであると見なされてきましたが、欠落している手段に対して何らかの外挿値が必要なようです。最初に帰属値が必要か、最後に入力値が必要かは不明です。このコードは、右揃えのベクトルを返し、最初のNAを最初の非NA値に置き換えます。左揃えのrollmeansを使用する場合は、zooにna.locf関数もあります。

long.roll <- function(input, k) { rtroll <-  
                           rollmean(input, k, align="right", na.pad=TRUE)
                return(c(rep(rtroll[k], k-1), rtroll[-(1:(k-1))]) ) }
long.roll(input,4)
#  [1] 4.50 4.50 4.50 4.50 4.25 4.75 4.25 4.00 5.00 3.75 5.25 5.00 5.25
# [14] 5.25
于 2010-12-12T16:09:11.580 に答える