2010-12-11 16 views
5

jak uzyskać dwustronną "ruchomą średnią", która jest funkcją, która uśrednia n liczb z prawej i lewej strony wektora i podaje ich wagę w zależności od ich odległości od wartości środkowej?dwustronna średnia ruchoma?

Próbowałem użyć TTR, ale jego średnie ruchome działają tylko od lewej do prawej i ustawiają lewostronne wartości jako NA. Więc nie mogę użyć tego wygładzonego wektora jako wejścia, aby wygładzić.

Odpowiedz

8

W pakiecie zoo rollmean i rollapply mieć argumenty, które umożliwiają liczne odmiany.

library(zoo) 
x <- seq(10)^2 

# no NAs at end 
rollmean(x, 3) 

# NAs at ends 
rollmean(x, 3, na.pad = TRUE) 

# weighted mean 
rollapply(zoo(x), 3, function(x) c(1, 2, 1) %*% x/4) 

# at ends take means of less than 3 points - needs devel version 
# partial= is in development and at this point must use na.rm = TRUE to use partial 
source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/rollapply.R?revision=802&root=zoo") 
rollapply(zoo(x), 3, mean, partial = TRUE, na.rm = TRUE) 

EDIT:

Zauważ, że ponieważ ten został napisany w wersji rozwój zoo został zmieniony tak, że zamiast pisać partial = TRUE jeden pisze regułę = „częściowy” lub rule = 3. Problem polegał na tym, że wraz z dodaniem nowych reguł końcowych do wersji rozwojowej (teraz są dodane 3 i 4) przed ich wydaniem) z osobnym argumentem dla każdego z nich zaśmieca interfejs użytkownika. Również rule jest bardziej zgodne z approx w rdzeniu R. W rzeczywistości, rule=1 i rule=2 będą miały to samo znaczenie w rollapply i approx (z rdzenia R) dla lepszej spójności i łatwości użytkowania. Nawiasy wokół mean W poniższym przykładzie są obecnie wymagane w wersji rozwojowej, aby zapobiec jego wywołanie rollmean, gdzie rule="partial" nie została jeszcze wdrożona, ale potrzeba do zrobienia, że ​​zostaną wyeliminowane przez czas jej oficjalnie wydany.

source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/rollapply.R?revision=815&root=zoo") 
rollapply(zoo(x), 3, (mean), rule = "partial") 
+0

Ale dlaczego wynik rollmean jest zawsze o jeden element krótszy niż itm? – rsk82

2

Możesz spróbować kernel wraz z kernapply (jest kilka przykładów na końcu pierwszej strony).

5

Spójrz na funkcję filter(), a zwłaszcza sides argumentem:

filter     package:stats    R Documentation 

Linear Filtering on a Time Series 

Description: 

    Applies linear filtering to a univariate time series or to each 
    series separately of a multivariate time series. 

Usage: 

    filter(x, filter, method = c("convolution", "recursive"), 
      sides = 2, circular = FALSE, init) 

Arguments: 
[...] 
    sides: for convolution filters only. If ‘sides=1’ the filter 
      coefficients are for past values only; if ‘sides=2’ they are 
      centred around lag 0. In this case the length of the filter 
      should be odd, but if it is even, more of the filter is 
      forward in time than backward.