двусторонняя скользящая средняя? - PullRequest
6 голосов
/ 11 декабря 2010

как получить двустороннее «скользящее среднее», которое представляет собой функцию, которая усредняет n чисел справа и слева от вектора и дает им веса в соответствии с их расстоянием от значения центра?

Я пытался использовать TTR, но его скользящие средние работают только слева направо и установили крайние левые значения как NA. Поэтому я не могу использовать этот сглаженный вектор в качестве входных данных для smooth.spline

Ответы [ 3 ]

9 голосов
/ 12 декабря 2010

В пакете зоопарка rollmean и rollapply есть аргументы, которые допускают многочисленные варианты.

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:

Обратите внимание, что с тех пор, как это было написано, версия разработки для зоопарка была изменена так, что вместо записи partial = TRUE пишется правило = "частичное" или rule = 3. Проблема заключалась в том, что по мере добавления новых конечных правил в версию для разработки (теперь их 3 и 4 будут добавлены до ее выпуска) с отдельным аргументом для каждого из них загромождается пользовательский интерфейс. Кроме того, rule более соответствует approx в ядре R. На самом деле, rule=1 и rule=2 будут иметь то же значение в rollapply и в approx (из ядра R) для лучшего последовательность и простота использования. Скобки вокруг mean в приведенном ниже примере в настоящее время требуются в версии для разработки, чтобы предотвратить вызов rollmean, где rule="partial" еще не реализовано, но необходимость сделать это будет устранена к тому времени, когда он официально освобожден.

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")
6 голосов
/ 11 декабря 2010

Посмотрите на функцию filter() и, в частности, аргумент sides:

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.
2 голосов
/ 11 декабря 2010

Вы можете попробовать kernel вместе с kernapply (есть примеры к концу первой страницы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...