我需要在 3 和 7 的 R 中做滚动中位数..(运行中位数)并绘制它们。我知道使用smooth(x,"3R")
迭代直到它收敛。但我想做 7 的运行中位数进行比较,我输入的变量是:
xR7 <- rollmedian(x,7)
Age # at Age
0 558
1 513
2 582
3 604
4 584
5 566
6 562
7 524
8 529
9 430
10 497
我怎么知道它何时收敛?有测试吗?
用中位数重复平滑将逐渐在两端逐渐消失,x
直到消失。您需要一些约定来为末端的运行中位数分配值。一种方法是“复制”:只需将第一个有效值复制回开头,将最后一个有效值复制到结尾。
检查收敛性的一种方法——一种相当严重的方法,但在这种情况下可能是安全的——只有在连续迭代完全相同时才停止。使用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对
因为两个结果的差异没有变化,所以他们同意。好的。(顺便说一下,这个方差测试可以很好地在内部rollmedianR
检查收敛性identical
:它对浮点错误更稳健。原则上这不是中位数的问题,因为没有发生数值变化——值只是周围的副本——但在其他应用程序中具有这种鲁棒性是至关重要的。)
绘图可以显示长期运行中位数的作用:
plot(x, col="Gray", cex=0.8)
lines(rollmedianR(x,37), lwd=2, col="Red")