Adaptacyjna średnia ruchoma - najwyższa wydajność w R
Poszukuję przyrostów wydajności w zakresie funkcji okna toczenia / przesuwania w R. Jest to dość powszechne zadanie, które można wykorzystać w dowolnym zestawie danych uporządkowanych obserwacji. Chciałbym podzielić się pewnymi odkryciami, być może ktoś byłby w stanie przekazać informacje zwrotne, aby uczynić go jeszcze szybszym.
Ważna uwaga jest taka, że skupiam się na sprawiealign="right"
i adaptacyjne okno toczenia, więcwidth
jest wektorem (tej samej długości co nasz wektor obserwacji). W razie gdybyśmy mieliwidth
jako skalar istnieją już bardzo dobrze rozwinięte funkcjezoo
iTTR
pakiety, które byłyby bardzo trudne do pobicia (4 lata później: było to łatwiejsze niż się spodziewałem), ponieważ niektóre z nich używają nawet Fortrana (ale wciąż zdefiniowane przez użytkownika FUN mogą być szybsze dzięki wspomnianemu poniżejwapply
).RcppRoll
pakiet warto wspomnieć ze względu na jego doskonałą wydajność, ale jak dotąd nie ma funkcji, która odpowiadałaby na to pytanie. Byłoby wspaniale, gdyby ktoś mógł go rozszerzyć, aby odpowiedzieć na pytanie.
Rozważmy, że mamy następujące dane:
x = c(120,105,118,140,142,141,135,152,154,138,125,132,131,120)
plot(x, type="l")
I chcemy zastosować funkcję toczeniax
wektor ze zmiennym oknem toczeniawidth
.
set.seed(1)
width = sample(2:4,length(x),TRUE)
W tym konkretnym przypadku mielibyśmy funkcję adaptacyjnąsample
zc(2,3,4)
.
Złożymy wniosekmean
funkcja, oczekiwane wyniki:
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")
Do produkcji można wykorzystać dowolny wskaźnikwidth
argument jako różne warianty adaptacyjnych średnich ruchomych lub dowolna inna funkcja.
Szukasz najwyższej wydajności.