Для цикла для матричных операций - PullRequest
0 голосов
/ 22 сентября 2019

Пытаюсь использовать «для цикла» в R. У меня есть вектор длиной 44 с 4401 наблюдением, считанным из файла данных «data.csv».

Я преобразую его в матрицу для работы с каждымстолбец как данные временного ряда.

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

Какой самый простой способ сделать это?

library(forecast)
data<-read.table(file="data.csv",sep=",",row.names=NULL,header=FALSE)
x <- matrix(1:47, ncol = 1, byrow = FALSE)
for (i in 1:4401)
{
y <- data[i]
y_ts <- ts(y, start=c(2016,1), end=c(2019,8), frequency=12)
AutoArimaModel=auto.arima(y_ts)
forecast=predict(AutoArimaModel, 3)
output <- matrix(forecast$pred, ncol = 1, byrow = FALSE)
ym = data.matrix(y)
z = rbind(ym,output)
x = cbind(x,z)}

Он просто работает для i = 1 и выдает ошибку, как показано ниже:

Ошибка в массиве (x, c (длина (x), 1L), если (! Is.null)(names (x))) list (names (x),: 'data' должен быть векторного типа, был 'NULL'

Ответы [ 3 ]

0 голосов
/ 22 сентября 2019

Кажется, проблема в вашем источнике данных.Это работает:

n_col <- 5
n_rows <- 44

#generate data
data <- data.frame(replicate(n_col, rnorm(n_rows)))

x <- matrix(1:47, ncol = 1, byrow = FALSE)

for (i in seq_len(n_col)) {
  y <- data[i]
  y_ts <- ts(y, start=c(2016,1), end=c(2019,8), frequency=12)
  AutoArimaModel=auto.arima(y_ts)
  forecast=predict(AutoArimaModel, 3)
  output <- matrix(forecast$pred, ncol = 1, byrow = FALSE)
  ym = data.matrix(y)
  z = rbind(ym,output)
  x = cbind(x,z)}
x

В качестве отступления, я думаю, я бы подошел к этому так, особенно если у вас есть 4 401 поле для выполнения auto.arima на:

y_ts <- ts(data, start = c(2016, 1), end = c(2019, 8), frequency = 12)

library(future.apply)
plan(multiprocess)

do.call(
  cbind,
  future_lapply(y_ts,
       function(y_t) {
         AutoArimaModel = auto.arima(y_t)
         forecast = predict(AutoArimaModel, 3)
         output = matrix(forecast$pred, ncol = 1, byrow = F)
         ym = data.matrix(y_t)
         z = rbind(ym, output)
       }
  )
)
0 голосов
/ 22 сентября 2019

Итак, ваш код нуждается в частичной перезаписи!

Если я понимаю, вы хотите получить 3 прогноза для каждых 44 данных временного ряда.Я использовал предоставленные вами данные .xlsx.

library(forecast)
library(readxl)

data<-read_excel("data.xlsx",col_names = F)

z <- NULL
data <- t(data)
forecast_horizon <- 3

for (i in 1:ncol(data)){
  y <- data[,i]

  y_ts <- ts(y, start=c(2016,1), end=c(2019,8), frequency=12)
  AutoArimaModel <- auto.arima(y_ts)
  forecast <- tryCatch(predict(AutoArimaModel, forecast_horizon),
                       error = function(e) data.frame(pred = rep(NA,forecast_horizon))) 

  output <- matrix(forecast$pred, ncol = 1, byrow = FALSE)

  z = cbind(z,output)

}

Обратите внимание на использование tryCatch, которое используется, потому что существует один временной ряд, который приводит к ошибкам при доступе к прогнозам (вы можете выяснить, почему это так.)

0 голосов
/ 22 сентября 2019

Используйте пакет tibbletime: https://www.business -science.io / code-tools / 2017/09/07 / tibbletime-0-0-1.html

Чтение данныхс readr::read_csv таким, что это тибль.Превратите это в tibbletime с вашим вектором даты.Используйте функции tmap_*, как описано в статье, для инкапсуляции вашего кода прогноза и сопоставления их со столбцами времени tibbletime.Статья должна содержать всю информацию, необходимую для ее реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...