尝试在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”
答案 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
的用法,因为在访问预测时会有一个时间序列产生错误(您可以进一步调查为什么会发生这种情况。)