我正在使用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函数即可获得所需输出的方法?
谢谢!
答案 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)
如果我们使用dplyr
或data.table
,则会自动处理此问题。
library(dplyr)
df %>%
group_by(cyl) %>%
mutate(score = pacf1(mpg))
library(data.table)
setDT(df)[, score := pacf1(mpg), by = cyl]