用于矩阵运算的循环

时间:2019-09-22 10:55:34

标签: r

尝试在R中使用“ for循环”。我有一个长度为44的向量,具有从数据文件“ data.csv”中读取的4401个观察值。

我将其转换为矩阵,以作为时间序列数据在每一列上工作。

我想提取每一列,进行预测,然后为此做一个矩阵。

最简单的方法是什么?

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(length(x),1L),如果(!is.null(names(x)))list(names(x),:     “数据”必须是向量类型,为“ NULL”

3 个答案:

答案 0 :(得分:0)

使用tibbletime软件包:https://www.business-science.io/code-tools/2017/09/07/tibbletime-0-0-1.html

使用readr::read_csv读取数据,以使它成为小标题。使用您的日期向量将它变成一个小点心时间。如本文所述,使用tmap_*函数封装您的预测代码并将其映射到tibbletime的列。 本文应该包含实现此目的所需的所有信息。

答案 1 :(得分:0)

问题似乎出在您的数据源上。这有效:

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)
       }
  )
)

答案 2 :(得分:0)

因此,您的代码需要部分重写!

据我了解,您希望每44个时间序列数据获得3个预测。我使用了您提供的.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的用法,因为在访问预测时会有一个时间序列产生错误(您可以进一步调查为什么会发生这种情况。)