【问题标题】:R - Calculating 12 month moving average on panel dataR - 计算面板数据的 12 个月移动平均线
【发布时间】:2013-10-19 16:07:15
【问题描述】:

首先,全面披露。我尝试在 MS Access 中使用相关子查询严格执行此操作,并在此帖子 12 month moving average by person, date 上获得了一些帮助。我最初认为我的数据足够小,可以通过,但它太糟糕了。作为替代方案,我将尝试在 R 中运行它,然后将结果写入 MS Access 中的新表。我有数据,因此我有以下字段:

rep, cyc_date, amt

按照 Andrie 的链接示例,滚动 5 年期间(而不是 5 年平均值)R: Calculating 5 year averages in panel data,我试图通过 rep 获得 amt 字段的滚动 12 个月平均值。这是我的代码:

library(zoo)
library(plyr)
library(RODBC)

# Pull data from local MS Access database.  The referenced sqlFetch is a query
# that pulls the data, ordered by `rep`, then `cyc_date`

channel <- odbcConnectAccess2007("C://MyDB.accdb")
data <- data.frame(sqlFetch(channel, "MyView"))

# Ensure coercion of `cyc_date` to date type
data$cyc_date <- as.Date(data$cyc_date)

# Function (take from post above)
rollmean12 <- function(x) {
                 rollmean(x, 12)
              }
# Calculate rolling average by person
rollvec <- ddply(data, .(data$rep), rollmean12(data$amt))

很遗憾,这不起作用。我收到以下错误:

Error in llply(.data = .data, .fun = .fun, ..., .progress = .progress,  : 
.fun is not a function.

我不确定为什么会这样。我是否需要将data 显式转换为zoo 对象?如果是这样,不确定如何处理由person_id 字段产生的额外维度。任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试了链接中您正在使用的答案中的确切 ddply 代码?那没有用吗?它对我有用(但我没有你的数据集)。将ddply 用于单个列的另一种方法是ddply(dat1, .(rep), summarize, rollamt = rollmean12(amt) )
  • 关闭。不幸的是,我需要将数据重新添加到我的原始数据集中,因此summarize 调用会删除循环日期。我意识到我的原始帖子中没有指定这个要求。我找到了一种消除ddply 调用的好方法。请参阅下面的答案。

标签: r plyr moving-average panel-data


【解决方案1】:

我在以下帖子中找到了此代码:applying rolling mean by group in R

data$movavg <- ave(data$amt, data$rep, FUN = function(x) rollmean(x, k=12, align="right", na.pad=T)).

ave 拯救世界!

【讨论】:

    【解决方案2】:

    只是一些提示,因为我根本不使用时间序列:ddply 需要数据框输入,所以不要将其转换为 zoo 对象。 .(data$rep) 我认为应该只是.(rep),而rollmean12 不应该用参数调用。相反,您应该重新编写函数以提取所需的列。所以,大概是这样的:

    rollmean12 <- function(x) rollmean(x$amt, 12)
    

    如果您选择?ddply,则有一个指向 JSS 中非常有用的出版物的链接。

    【讨论】:

      【解决方案3】:

      试试tidyquant

      x %>% tq_mutate(
          # tq_mutate args
          select     = amt,
          mutate_fun = rollapply, 
          col_rename = "rollmean12", #### 
          # rollapply args
          width      = 12,
          align      = "right",
          FUN        = mean,
          # mean args
          na.rm      = TRUE
        ) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        • 2021-04-30
        • 1970-01-01
        • 2021-06-24
        • 2014-11-18
        相关资源
        最近更新 更多