Я пытаюсь использовать R для вычисления скользящего среднего по ряду значений в матрице. Обычный поиск по списку рассылки R не очень помог. Кажется, в R нет встроенной функции, которая позволяла бы мне вычислять скользящие средние. Какие-нибудь пакеты предоставляют? Или мне нужно написать свое?
r
moving-average
r-faq
Джаред
источник
источник
forecast::ma
и он содержит все окрестности, не так.Или вы можете просто рассчитать его с помощью фильтра, вот функция, которую я использую:
Если вы используете
dplyr
, будьте осторожны, чтобы указатьstats::filter
в функции выше.источник
stats::filter
sides = 2
эквивалентно align = "center" для zoo :: rollmean или RcppRoll :: roll_mean.sides = 1
эквивалентно «правильному» выравниванию. Я не вижу способа выполнить «левое» выравнивание или вычислить с «частичными» данными (2 или более значений)?Использование
cumsum
должно быть достаточным и эффективным. Предполагая, что у вас есть вектор x, и вы хотите получить текущую сумму из n чиселКак отмечено в комментариях @mzuther, это предполагает, что в данных нет NA. чтобы справиться с этим, потребуется разделить каждое окно на количество значений, не относящихся к NA. Вот один из способов сделать это, включив комментарий @Ricardo Cruz:
Это все еще имеет проблему, что, если все значения в окне являются NA, тогда будет ошибка деления на ноль.
источник
cumsum(c(1:3,NA,1:3))
cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
.В data.table 1.12.0 новая
frollmean
функция была добавлена для вычисления быстрого и точного прокатки среднее тщательно обработкиNA
,NaN
и+Inf
,-Inf
значения.Поскольку в этом вопросе нет воспроизводимого примера, здесь не так много вопросов.
Вы можете найти более подробную информацию
?frollmean
в руководстве, также доступны в Интернете по адресу?frollmean
.Примеры из руководства ниже:
источник
caTools
Пакет очень быстро прокатки среднего / мин / макс / SD и несколько других функций. Я только работал с,runmean
иrunsd
они являются самыми быстрыми из всех других пакетов, упомянутых на сегодняшний день.источник
Вы можете использовать
RcppRoll
для очень быстрых скользящих средних, написанных на C ++. Просто вызовитеroll_mean
функцию. Документы можно найти здесь .В противном случае этот (более медленный) цикл for должен сработать:
источник
res = arr
. Затем есть цикл, который повторяется, начинаяn
с 15-го элемента или до конца массива. это означает, что самое первое подмножество, которое он имеет в виду,arr[1:15]
заполняет местоres[15]
. Теперь я предпочитаю устанавливатьres = rep(NA, length(arr))
вместоres = arr
так, чтобы каждый элементres[1:14]
равнялся NA, а не числу, где мы не могли бы взять полное среднее из 15 элементов.На самом деле
RcppRoll
это очень хорошо.Код, размещенный cantdutch, должен быть исправлен в четвертой строке, чтобы окно было исправлено:
Другой способ, который обрабатывает пропуски, дан здесь .
Третий способ - улучшить этот код для вычисления частичных средних значений или нет - следующим образом:
источник
Для того, чтобы дополнить ответ cantutchthis и Родриго Ремедио ;
источник
Вот пример кода, показывающий, как вычислить центрированную скользящую среднюю и скользящую среднюю с использованием
rollmean
функции из пакета zoo .источник
Хотя и немного медленно, но вы также можете использовать zoo :: rollapply для выполнения вычислений на матрицах.
где x - набор данных, FUN = mean - функция; Вы также можете изменить его на min, max, sd и т. д., а width - это скользящее окно.
источник
set.seed(123); x <- rnorm(1000); system.time(apply(embed(x, 5), 1, mean)); library(zoo); system.time(rollapply(x, 5, mean))
На моей машине это так быстро, что возвращает время 0 секунд.Можно использовать
runner
пакет для перемещения функций. В этом случаеmean_run
функция. Проблема вcummean
том, что он не обрабатываетNA
значения, ноmean_run
делает.runner
Пакет также поддерживает нерегулярные временные ряды и окна могут зависеть от даты:Можно также указать другие параметры, например
lag
, и катить толькоat
определенные индексы. Подробнее в документации по комплектации и функциям .источник
Пакет слайдера может быть использован для этого. Он имеет интерфейс, который был специально разработан, чтобы чувствовать себя похожим на мурлыканье. Он принимает любую произвольную функцию и может возвращать любой тип вывода. Кадры данных даже повторяются по строкам. Сайт pkgdown находится здесь .
Затраты как на слайдер, так и на data.table
frollapply()
должны быть довольно низкими (намного быстрее, чем в зоопарке).frollapply()
выглядит немного быстрее для этого простого примера, но обратите внимание, что он принимает только числовой ввод, и вывод должен быть скалярным числовым значением. Функции слайдера являются полностью общими, и вы можете вернуть любой тип данных.источник
источник