1

我需要在 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

我怎么知道它何时收敛?有测试吗?

4

1 回答 1

4

用中位数重复平滑将逐渐在两端逐渐消失,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")

数据图和运行中位数

于 2012-12-12T18:09:16.777 回答