我需要在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
我如何知道何时收敛?有测试吗?
答案 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")