Я ищу некоторый прирост производительности с точки зрения функций скользящего/скользящего окна в R. Это довольно распространенная задача, которую можно использовать в любом упорядоченном наборе данных наблюдений. Я хотел бы поделиться некоторыми из моих выводов, может быть, кто-то сможет предоставить обратную связь, чтобы сделать это еще быстрее.
Важным примечанием является то, что я фокусируюсь на case align="right"
и адаптивном скользящем окне, поэтому width
- это вектор (такой же длины, как и наш вектор наблюдения). В случае, если у нас есть скалярная width
, уже есть очень хорошо разработанные функции в пакетах zoo
и TTR
которые было бы очень трудно превзойти (4 года спустя: это было проще, чем я ожидал), так как некоторые из них даже используют Fortran (но все еще определяемые пользователем FUN могут быть быстрее с использованием упомянутых ниже wapply
).
Стоит упомянуть пакет RcppRoll
из-за его высокой производительности, но пока нет функции, которая отвечает на этот вопрос. Было бы здорово, если бы кто-то смог расширить его, чтобы ответить на вопрос.
Считайте, что у нас есть следующие данные:
x = c(120,105,118,140,142,141,135,152,154,138,125,132,131,120)
plot(x, type="l")
И мы хотим применить функцию x
вектору x
с переменной width
окна width
.
set.seed(1)
width = sample(2:4,length(x),TRUE)
В этом конкретном случае мы бы имели функцию прокатки, адаптированную к sample
c(2,3,4)
.
Мы будем применять mean
функцию, ожидаемые результаты:
r = f(x, width, FUN = mean)
print(r)
## [1] NA NA 114.3333 120.7500 141.0000 135.2500 139.5000
## [8] 142.6667 147.0000 146.0000 131.5000 128.5000 131.5000 127.6667
plot(x, type="l")
lines(r, col="red")
Любой индикатор может использоваться для получения аргумента width
качестве различных вариантов адаптивных скользящих средних или любой другой функции.
В поисках максимальной производительности.