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.

questionAnswers(3)

yourAnswerToTheQuestion