Nano Hash - криптовалюты, майнинг, программирование

R: скользящее/скользящее среднее по месяцам

Я пытаюсь рассчитать скользящее/скользящее среднее по месяцам. Например, используя экономические данные из пакета ggplot2, я хочу построить сопутствующий временной ряд, представляющий 3-летнее скользящее среднее значение каждого месяца.

library(ggplot2)
df = economics
df$month =  as.POSIXlt(df$date)$mon+1

Я получаю именно то, что хочу, когда вручную разбиваю ежемесячные данные:

library(zoo)
df.test = subset(df, month==1)
df.test$uempmed.ma = rollapply(df.test$unemploy,  width=3, FUN=mean, na.rm=T, 
                               fill=NA, align="right") 


  head(df.test)

         date   pce    pop psavert uempmed unemploy year month uempmed.ma
8  1968-01-31 534.7 199920     9.5     4.5     3001 1968     1         NA
20 1969-01-31 590.2 201881     6.5     4.9     2692 1969     1         NA
32 1970-01-31 635.7 204008     8.1     4.5     3453 1970     1   3048.667
44 1971-01-31 681.3 206668     9.9     6.3     4903 1971     1   3682.667
56 1972-01-31 738.4 209061     9.4     6.6     4928 1972     1   4428.000
68 1973-01-31 828.5 211120     9.5     5.2     4452 1973     1   4761.000

Но, когда я пытаюсь использовать пакет plyr, чтобы сделать все месяцы одновременно ....

library(plyr)
df2 = ddply(df, .(month), mutate,
            uempmed.ma = rollapply(df$uempmed,  3, FUN=mean, na.rm=T, 
                                   fill=NA, align="right") 
)

....возвращается следующая ошибка:

Error: wrong result size (478), expected 40 or 1

Я знаю, что это должно быть довольно легко, но я в тупике.

В конечном счете, я хочу, чтобы ряд скользящих средних (т.е. uempmed.ma) отставал, то есть не включал в расчет текущий год. Например, значение для 31-01-1971 сверху должно быть средним значением uempmed для периодов времени 31-01-1968, 31-01-1969 и 31-01-1970.

Будем очень благодарны любой помощи.


Ответы:


1

dplyr (новое поколение plyr) вроде работает

library(zoo)
library(dplyr)
df %>%
  group_by(month) %>%
  mutate(uempmed.ma = rollapply(unemploy, width = 3, 
         FUN = mean, na.rm = TRUE, fill = NA, align = "right"))

Вы можете сделать это довольно эффективно, используя базу R (конечно, более эффективно, чем используя plyr)

transform(df, uempmed.ma = ave(unemploy, month, 
                               FUN = function(x) rollapply(x, width = 3, 
                                                 FUN = mean, na.rm = TRUE, 
                                                 fill = NA, align = "right")))

Или бонусное решение: использование пакета data.table

library(data.table)
setDT(df)[, uempmed.ma := rollapply(unemploy,  width = 3, 
                          FUN = mean, na.rm = TRUE, fill = NA, 
                          align = "right"), 
          by = month]
29.10.2014
  • Спасибо. Любые хорошие идеи о том, как отстать от ряда на один год (т.е. не включать текущий год в расчет)? 29.10.2014
  • Я не уверен, что вы имеете в виду. Это новый вопрос? Что вы подразумеваете под текущий год? Может быть, добавить желаемый результат? 29.10.2014
  • не забудьте library(zoo) 29.10.2014
  • @RobertKrzyzanowski, вы, наверное, правы, хотя я только что перенял это из ОП. Но все равно добавлю 29.10.2014
  • @David Arenburg: чтобы уточнить, ваши решения отлично работают. Но я также искал способ, чтобы скользящая средняя отставала. То есть он должен представлять среднее значение за предыдущие 3 года и не включать значение текущего года/месяца в скользящее среднее. 29.10.2014
  • Возможно, вы могли бы добавить NA в начале и удалить последнее значение, например: c(NA, head(rollapply(unemploy, width = 3, FUN = mean, na.rm = TRUE, fill = NA, align = "right"), -1)) 29.10.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..