動物園を強制する方法はありますか:: Rollmean関数は、入力と同じ長さのベクトルを返しますか? (または、他の機能を使用するかもしれませんか?)
質問
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
しかし、私がそれをcbindしようとするとき:
Error in cbind(input, output) :
number of rows of matrices must match (see arg 2)
Calls: print -> cbind
Execution halted
ベクトルの両端でデータを取得していない場合は、あきらめない関数を使用したいと思います。たとえば、入力[1]では、右からの平均のみを計算します
解決
を見てください 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()
電話。
さて、さらなる説明から、結果ベクトルの他の手段に実際に匹敵しないいくつかの手段を計算したいと思うようです。しかし、あなたがしなければならないなら...
> 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の推定を強制している最初に最も逸脱します。
他のヒント
これは古い質問ですが、これを読んでいる人にとっては、それが役立つことを願っています。
lollapplyを使用して関数平均を使用し、partial = trueを使用すると、関数が計算できない場合に初期値が維持されます。
x <- rollapply(input, width = 5, FUN = mean, align = "centre", partial = TRUE")
??rollapply
??rollapplyr # for right aligned moving average
ドキュメントを読むことで本当に恩恵を受けるでしょう。見る ?rollmean
, 、具体的には na.pad
と align
議論。
これまでのところ、この質問は3人の経験Rコーダーによって曖昧であると見なされてきましたが、欠落手段に何らかの外挿する価値が必要なようです。最初と終わりに帰属する値を望んでいたかどうかは不明のままです。このコードは、右に整列したベクトルを返し、最初のNAのNONA値に最初のNAを置き換えます。また、左配分されたロールマーンを使用したい場合は、動物園には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