中央値を使用して平滑化を繰り返すと、 の両端がx
消えるまで次第に侵食されます。両端の移動中央値に値を割り当てるには、いくつかの規則が必要です。1 つの方法は「コピー」です。最初の有効な値を最初に複製し、最後の有効な値を最後に複製します。
収束をチェックする 1 つの方法 (かなり厳しいものですが、このコンテキストではおそらく安全です) は、連続する反復がまったく同じである場合にのみ停止することです。を使用しidentical
ます。
これにより、次の手順が実行されます。
library(zoo)
rollmedianR <- function(x, k=3) {
n <- length(x)
k.low <- floor((k+1)/2)
k.high <- n + 1 - k.low
repeat {
y <- rollmedian(x, k, na.pad=TRUE)
y[1:k.low] <- y[k.low]; y[k.high:n] <- y[k.high]
if (identical(x, y)) break
x <- y
}
return(y)
}
smooth
テストとして、いくつかのランダム データと比較してみましょう。
set.seed(17)
x <- sin(seq(0, 2*pi, 2*pi/1000)) + rnorm(1001, 0.25)
0 >= var((smooth(x,"3R") - rollmedianR(x, 3)), rep(0.0, length(x)))
1真
2 つの結果の違いに変化がないため、両者は一致しています。良い。(ちなみに、この分散テストはrollmedianR
、 の代わりに収束をチェックするために内部でうまく機能しidentical
ます。浮動小数点エラーに対してより堅牢です。数値の変化が発生していないため、原則として、これは中央値には関係ありません。値はちょうどコピーされていますが、他のアプリケーションでは、そのような堅牢性が重要です。)
プロットは、長時間の中央値が何をするかを示すことができます。
plot(x, col="Gray", cex=0.8)
lines(rollmedianR(x,37), lwd=2, col="Red")
