Próbuję użyć R do obliczenia średniej ruchomej dla szeregu wartości w macierzy. Jednak normalne wyszukiwanie listy mailingowej R nie było zbyt pomocne. Wydaje się, że nie ma wbudowanej funkcji w R, która pozwoli mi obliczyć średnie ruchome. Czy jakieś pakiety to zapewniają? Czy też muszę pisać własne?
r
moving-average
r-faq
Jared
źródło
źródło
forecast::ma
i zawiera całą okolicę, nie w porządku.Lub możesz po prostu obliczyć to za pomocą filtra, oto funkcja, której używam:
Jeśli używasz
dplyr
, pamiętaj, aby określićstats::filter
w powyższej funkcji.źródło
stats::filter
sides = 2
jest równoważne align = "center" dla zoo :: rollmean lub RcppRoll :: roll_mean.sides = 1
jest równoważne wyrównaniu z „prawym”. Nie widzę sposobu, aby wykonać wyrównanie do lewej strony lub obliczyć za pomocą danych „częściowych” (2 lub więcej wartości)?Używanie
cumsum
powinno być wystarczające i wydajne. Zakładając, że masz wektor x i chcesz bieżącą sumę n liczbJak wskazano w komentarzach @mzuther, zakłada się, że w danych nie ma NA. radzenie sobie z nimi wymagałoby podzielenia każdego okna przez liczbę wartości innych niż NA. Oto jeden ze sposobów, aby to zrobić, uwzględniając komentarz @ Ricardo Cruz:
Nadal występuje problem polegający na tym, że jeśli wszystkie wartości w oknie są NA, wówczas wystąpi błąd dzielenia przez zero.
źródło
cumsum(c(1:3,NA,1:3))
cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
.W data.table 1.12.0 nowa
frollmean
funkcja została dodana do obliczenia szybki i dokładny toczenia średnią starannie obsługiNA
,NaN
a+Inf
,-Inf
wartości.Ponieważ w pytaniu nie ma powtarzalnego przykładu, nie ma tu wiele do rozwiązania.
Więcej informacji na temat
?frollmean
instrukcji można znaleźć również w Internecie pod adresem?frollmean
.Przykłady z instrukcji poniżej:
źródło
caTools
Pakiet bardzo szybko toczenia średni / min / max / SD oraz kilka innych funkcji. Pracowałem tylko z nimirunmean
irunsd
są one najszybsze z innych wymienionych do tej pory pakietów.źródło
Możesz użyć
RcppRoll
do bardzo szybkich średnich ruchomych napisanych w C ++. Wystarczy wywołaćroll_mean
funkcję. Dokumenty można znaleźć tutaj .W przeciwnym razie ta (wolniejsza) pętla powinna załatwić sprawę:
źródło
res = arr
. Następnie jest pętla, która iteruje od początkun
lub do 15-tego elementu do końca tablicy. oznacza to, że pierwszym podzbiorem, który bierze pod uwagę, jest to,arr[1:15]
które zajmuje miejsceres[15]
. Teraz wolę ustawiaćres = rep(NA, length(arr))
zamiast,res = arr
więc każdy elementres[1:14]
równa się NA niż liczba, w której nie moglibyśmy wziąć pełnej średniej 15 elementów.W rzeczywistości
RcppRoll
jest bardzo dobry.Kod wysłany przez cantdutchthis musi zostać poprawiony w czwartej linii do okna, aby naprawić:
Podano tutaj inny sposób radzenia sobie z brakami .
Trzeci sposób udoskonalenia tego kodu do obliczania średnich cząstkowych lub nie:
źródło
W celu uzupełnienia odpowiedzi cantdutchthis i Rodrigo Remedio ;
źródło
Oto przykładowy kod pokazujący, jak obliczyć środkową średnią ruchomą i końcową średnią ruchomą za pomocą
rollmean
funkcji z pakietu zoo .źródło
Jest to trochę powolne, ale można również użyć zoo :: rollapply do wykonywania obliczeń na macierzach.
gdzie x to zbiór danych, FUN = średnia jest funkcją; możesz także zmienić to na min, max, sd itp., a szerokość to przesuwane okno.
źródło
set.seed(123); x <- rnorm(1000); system.time(apply(embed(x, 5), 1, mean)); library(zoo); system.time(rollapply(x, 5, mean))
Na mojej maszynie jest tak szybki, że zwraca czas 0 sekund.Można użyć
runner
pakietu do przenoszenia funkcji. W tym przypadkumean_run
funkcja. Problemcummean
polega na tym, że nie obsługujeNA
wartości, ale jemean_run
obsługuje.runner
pakiet obsługuje również nieregularne szeregi czasowe, a okna mogą zależeć od daty:Można również określić inne opcje, takie jak
lag
, i rzucić tylkoat
określone indeksy. Więcej w dokumentacji pakietu i funkcji .źródło
Można do tego użyć pakietu suwaka. Ma interfejs, który został specjalnie zaprojektowany, aby przypominał mruczenie. Przyjmuje dowolną funkcję i może zwrócić dowolny typ wyniku. Ramki danych są nawet iterowane względem wiersza. Strona pkgdown jest tutaj .
Obciążenie zarówno suwaka, jak i tabeli danych
frollapply()
powinno być dość niskie (znacznie szybsze niż zoo).frollapply()
wygląda na to, że jest nieco szybszy w tym prostym przykładzie tutaj, ale należy pamiętać, że wymaga on tylko wprowadzania liczbowego, a wynik musi być skalarną wartością liczbową. funkcje suwaka są całkowicie ogólne i można zwrócić dowolny typ danych.źródło