滚动的中位数

时间:2012-12-12 17:16:09

标签: r smoothing

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

我如何知道何时收敛?有测试吗?

1 个答案:

答案 0 :(得分: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 TRUE

因为两个结果的差异没有变化,所以他们同意。好。 (顺便说一句,这种方差测试在rollmedianR内可以很好地检查identical的收敛性:它对浮点错误更有效。原则上这不是中位数的问题,因为没有发生任何数值变化 - 值只是副本 - 但在具有这种稳健性的其他应用程序中至关重要。)

情节可以显示长期运行中位数的作用:

plot(x, col="Gray", cex=0.8)
lines(rollmedianR(x,37), lwd=2, col="Red")

Plot of data and a running median