在R中将ave用于自定义函数时出错

时间:2019-05-07 01:31:40

标签: r time-series autocorrelation

我正在使用ave()函数查找我数据中每个个体的偏自相关(pacf)。

# return pacf coefficient
pacf1 = function(x) { 
  return(pacf(x, lag.max = 1, na.action=na.pass)$acf[1])
}

ave(df$score, df$id, FUN=pacf1) # get pacf coefficient for each ID

Error in ts(x) : 'ts' object must have one or more observations

我在原始的巨大数据帧上不断出现时间序列错误。但是,当我在样本“虚构”数据帧上执行此操作时,此代码有效。我不知道为什么这是个问题。

是否有另一种无需使用ave函数即可获得所需输出的方法?

谢谢!

1 个答案:

答案 0 :(得分:3)

如评论中所述,问题是因为使用ave时从数据集中过滤了一些因子水平导致错误。我们可以使用默认的mtcars数据集进行验证

df <- mtcars 
df$cyl <- as.factor(df$cyl) #Convert cyl to factor
df <- subset(df, cyl!= 4)   #keep rows where cyl is not equal to 4
ave(df$mpg, df$cyl, FUN=pacf1)
  

ts(x)中的错误:“ ts”对象必须具有一个或多个观察值

我们可以通过删除未使用的级别来解决此问题

df$cyl <- droplevels(df$cyl)
ave(df$mpg, df$cyl, FUN=pacf1)

#[1] 0.234 0.234 0.234 0.209 0.234 0.209 0.234 0.234 0.209 0.209 0.209 0.209
#    0.209 0.209 0.209 0.209 0.209 0.209 0.209 0.234 0.209

#Or as @thelatemail mentions use 
#ave(df$mpg, df$cyl, FUN=pacf1, drop = TRUE)

如果我们使用dplyrdata.table,则会自动处理此问题。

library(dplyr)
df %>%
  group_by(cyl) %>%
  mutate(score = pacf1(mpg))


library(data.table)
setDT(df)[, score := pacf1(mpg), by = cyl]