중위수를 반복적으로 사용하면 부드럽게 사라질 때까지 x
양 끝을 점차 먹어 버립니다. 끝에서 실행중인 중앙값에 값을 할당하는 데 필요한 규칙이 필요합니다. 한 가지 방법은 "복사"입니다. 첫 번째 유효 값을 처음으로 다시 복제하고 마지막 유효한 값을 마지막으로 복제하십시오.
대류를 확인하는 한 가지 방법은 상당히 엄격한 것으로서이 컨텍스트에서는 안전하지만 연속 반복이 정확히 동일 할 때만 중지하는 것입니다. identical
을 사용하십시오.
이 다음 절차에 이르게 :
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 TRUE
때문에 :
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
와 비교하자 차이의 차이는 없습니다. wo 결과, 그들은 동의한다. 좋은. (단,이 분산 테스트는 rollmedianR
내부에서 identical
대신 수렴을 확인하는 데 효과적입니다. 부동 소수점 오류에보다 견고합니다. 원칙적으로 수치 변경이 발생하지 않기 때문에 중앙값에서 고려해야 할 사항은 아닙니다. 단지있는 사본은 주위에 -하지만 다른 응용 프로그램에서 이러한 견고성을 갖는 것은 매우 중요하다)
플롯이 오래 실행 평균이 무엇을 보여줄 수 :
plot(x, col="Gray", cex=0.8)
lines(rollmedianR(x,37), lwd=2, col="Red")
.