Ошибка при использовании ave для пользовательской функции в r - PullRequest
1 голос
/ 07 мая 2019

Я использую функцию 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 Ответ

3 голосов
/ 07 мая 2019

Как объяснено в комментариях, проблема заключается в том, что некоторые уровни факторов были отфильтрованы из набора данных, что привело к ошибке при использовании ave. Мы можем проверить это, используя стандартный набор данных mtcars 1003 *

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]
...