Извлечение объекта ARIMA из списка и сохранение в фрейме данных в R - PullRequest
1 голос
/ 28 января 2020

Моя цель - запустить ARIMA для нескольких временных рядов и сохранить результат в кадре данных. Вот мой пример:

library(forecast)

my_df <- data.frame(gr  = c(rep("a", 10), rep("b", 10)), 
                    val = sample(1:100, 20))

get_arima <- function(sample_name = NA,df = NA){
  fit = auto.arima(df[df$gr == sample_name, ]$val)
  return(fit)
}

result <- sapply(c("a", "b"), get_arima, df = my_df, simplify = F)
result_df <- data.frame(gr = names(result), 
  model_result = unlist(result, use.names =  F))

Выдает следующую ошибку:

Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
  cannot coerce class ‘c("forecast_ARIMA", "ARIMA", "Arima")’ to a data.frame

Цель состоит в том, чтобы во втором столбце была модель ARIMA, чтобы я делал что-то подобное forecast(result_df$model_result, h=3)

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

1 Ответ

1 голос
/ 28 января 2020

Выход модели равен list

str(result[[1]])
#List of 18
# $ coef     : Named num 54.3
#  ..- attr(*, "names")= chr "intercept"
# $ sigma2   : num 1454
# $ var.coef : num [1, 1] 131
# ...

, а 'result' также равен list. Если мы сохраняем модель в виде столбца в «data.frame», то сохраняем ее как list


df1 <- data.frame(gr = names(result), model_result = I(result)) 

С tibble мы можем напрямую создать list столбец без каких-либо I

library(tibble)
df1 <- tibble(gr = names(result), model_result = result)
df1
# A tibble: 2 x 2
#   gr    model_result
#  <chr> <named list>
#1 a     <ARIMA>     
#2 b     <ARIMA>     

Извлеките каждый элемент с помощью [[

df1$model_result[[1]]
#Series: df[df$gr == sample_name, ]$val 
#ARIMA(0,0,0) with non-zero mean 

#Coefficients:
#         mean
#      54.3000
#s.e.  11.4378

#sigma^2 estimated as 1454:  log likelihood=-50.07
#AIC=104.14   AICc=105.86   BIC=104.75

и примените forecast

forecast::forecast( df1$model_result[[1]], h = 3)
#Point Forecast    Lo 80  Hi 80     Lo 95    Hi 95
#11           54.3 5.439989 103.16 -20.42494 129.0249
#12           54.3 5.439989 103.16 -20.42494 129.0249
#13           54.3 5.439989 103.16 -20.42494 129.0249

Если мы хотим получить forecast для всех элементов, используйте map

library(purrr)
map(df1$model_result, ~ forecast::forecast(.x, h = 3))
...