我知道R中的filter()
函数计算移动平均值。我想知道是否存在一个函数返回给我移动方差或标准差,以便在绘图中与filter()
函数的输出并排显示。
发布于 2012-11-02 22:20:40
TTR包中包含runSD
:
> library(TTR)
> ls("package:TTR", pattern="run*")
[1] "runCor" "runCov" "runMAD" "runMax" "runMean"
[6] "runMedian" "runMin" "runSD" "runSum" "runVar"
runSD
将比rollapply
快得多,因为它避免了进行许多R函数调用。例如:
rzoo <- function(x,n) rollapplyr(x, n, sd, fill=NA)
rttr <- function(x,n) runSD(x, n)
library(rbenchmark)
set.seed(21)
x <- rnorm(1e4)
all.equal(rzoo(x,250), rttr(x,250))
# [1] TRUE
benchmark(rzoo(x,250), rttr(x,250))[,1:6]
# test replications elapsed relative user.self sys.self
# 2 rttr(x, 250) 100 0.58 1.000 0.58 0.00
# 1 rzoo(x, 250) 100 54.53 94.017 53.85 0.06
发布于 2012-11-02 20:47:40
zoo
包中的rollapply
接受任意函数。它与filter
的不同之处在于,它在默认情况下排除了NA
。
话虽如此,但为一个如此简单的函数加载一个包并没有多大意义(双关语)。
这里有一个右对齐的:
my.rollapply <- function(vec, width, FUN)
sapply(seq_along(vec),
function(i) if (i < width) NA else FUN(vec[i:(i-width+1)]))
set.seed(1)
vec <- sample(1:50, 50)
my.rollapply(vec, 3, sd)
[1] NA NA 7.094599 12.124356 16.522712 18.502252 18.193405 7.234178 8.144528
[10] 14.468356 12.489996 3.055050 20.808652 19.467922 18.009257 18.248288 15.695010 7.505553
[19] 10.066446 11.846237 17.156146 6.557439 5.291503 23.629078 22.590558 21.197484 22.810816
[28] 24.433583 19.502137 16.165808 11.503623 12.288206 9.539392 13.051181 13.527749 19.974984
[37] 19.756855 17.616280 19.347696 18.248288 15.176737 6.082763 10.000000 10.016653 4.509250
[46] 2.645751 1.527525 5.291503 10.598742 6.557439
# rollapply output for comparison
rollapply(vec, width=3, sd, fill=NA, align='right')
[1] NA NA 7.094599 12.124356 16.522712 18.502252 18.193405 7.234178 8.144528
[10] 14.468356 12.489996 3.055050 20.808652 19.467922 18.009257 18.248288 15.695010 7.505553
[19] 10.066446 11.846237 17.156146 6.557439 5.291503 23.629078 22.590558 21.197484 22.810816
[28] 24.433583 19.502137 16.165808 11.503623 12.288206 9.539392 13.051181 13.527749 19.974984
[37] 19.756855 17.616280 19.347696 18.248288 15.176737 6.082763 10.000000 10.016653 4.509250
[46] 2.645751 1.527525 5.291503 10.598742 6.557439
https://stackoverflow.com/questions/13195442
复制相似问题