形成(i,j,k)的循环,其中i,j和k位于R 3.4.4版本的[0,5]中

时间:2018-05-18 17:18:23

标签: r loops arima

我想要的输出是做一个(i,j,k)的循环,其中i和k从[0,3]取值[0,5]和j。循环将运行在以下值上:

(0, 0, 0)
(0, 0, 1)
(0, 0, 2)
(0, 0, 3)
(0, 0, 4)
(0, 0, 5)
(0, 1, 0)
(0, 1, 1)
(0, 1, 2)
.
.
.
(5, 3, 5)

基本上我想运行arima(p,d,q)模型制作循环并从那里提取RMSE值。

我试过的arima代码是,

fit <- arima(df.train$Positive, order=c(0, 0, 0),include.mean = FALSE)
S <- as.data.frame(summary(fit))
S$RMSE

“S $ RMSE”给出RMSE值。 但帮助我运行“order = c(i,j,k)”的循环并自动获得此RMSE值。

我想要的结果是最终cbind这两个并创建一个像

的表
Order      RMSE
(0, 0, 0)  xxxx
(0, 0, 1)  xxxx
(0, 0 ,2)  xxxx

4 个答案:

答案 0 :(得分:2)

如果无法访问您的数据,则无法测试以下代码是否可以解决您的问题。

尝试使用apply函数使用i循环遍历为jkexpand.grid定义的矩阵的行:

param_data <- expand.grid(i = 0:5, j = 0:3, k = 0:5)

param_data2 <- cbind(param_data, 
      apply(param_data, 1,
      FUN = function(x){
        fit <- arima(df.train$Positive, 
                     order = x,
                     include.mean = FALSE)
        S <- as.data.frame(summary(fit))
        S$RMSE
      })
)

答案 1 :(得分:0)

这不能回答您的确切问题,但我相信您可能会使用forecast包中的auto.arima函数,该函数可以单独估算最佳ARIMA模型。

您也可以在那里设置最大(p,q,d)值。

丑陋,但很容易解决 - 我会使用triple for循环:

order <- c()
RMSEs <- c()
for (i in 1:5) {
  for (j in 1:5) {
    for (k in 1:5) {
      order_temp <- sprintf('(%s, %s, %s)', i, j, k)
      order <- c(order, order_temp)
      fit <- arima(df.train$Positive, order=c(i, j, k),include.mean = FALSE)
      S <- as.data.frame(summary(fit))
      RMSEs <- c(RMSEs, S$RMSE)
    }
  }
}
result <- as.data.frame(order)
result$RMSE <- RMSEs

答案 2 :(得分:0)

显示您的数据

set.seed(1)
df.train = data.frame("Month/Year" = paste0(month.abb,"/",rep(12:18,each=12)), Positive = rnorm(84,5000,1500))
head(df.train)
  Month.Year Positive
1     Jan/12 4060.319
2     Feb/12 5275.465
3     Mar/12 3746.557
4     Apr/12 7392.921
5     May/12 5494.262
6     Jun/12 3769.297

arima 模型的订单(p,I,q)

library(gtools)
param = permutations(n=6,r=3,v=0:5,repeats.allowed=T)
param = cbind(param[param[,2] <= 3,],0)
colnames(param) <- c("p","I","q","RMSE")
param

计算调整后的arima模型的 RMSE 的函数

library(forecast)
RMSE = function(param){
  for(i in 1:nrow(param)){
  s <-data.frame(summary(Arima(df.train$Positive, order=param[i,1:3],include.mean = FALSE, method = "ML")));
  param[i,4] <- s$RMSE
  }
  return(param)
  }

结果

result = RMSE(param)
head(result)
     p I q     RMSE
[1,] 0 0 0 5308.368
[2,] 0 0 1 3536.816
[3,] 0 0 2 2820.933
[4,] 0 0 3 2555.799
[5,] 0 0 4 2438.050
[6,] 0 0 5 2151.455

注意:对于这种情况,最好的模型是ARIMA(4,1,5),根据RMSE的标准

result[which(result[,4] == min(result[,4])),]
      p       I       q    RMSE 
   4.00    1.00    5.00 1226.28

答案 3 :(得分:0)

代码正在使用,

Demo <- read.csv("C:/UsersMP.csv", header = TRUE)
Dem <- data.frame(Demo)
smp_size <- floor(0.95 * nrow(Dem))
df.train <- Dem[1:smp_size, ]
df.test <- Dem[(smp_size+1):nrow(Dem), ]
fit <- arima(df.train$Positive, order=c(0, 0, 0),include.mean = FALSE)
S1 <- as.data.frame(summary(fit))
S1$RMSE
fit1 <- arima(df.train$Positive, order=c(0, 0, 1),include.mean = FALSE)
S2 <- as.data.frame(summary(fit))
S2$RMSE
fit2 <- arima(df.train$Positive, order=c(0, 0, 2),include.mean = FALSE)
S3 <- as.data.frame(summary(fit))
S3$RMSE

它在这方面正常运作。我只是想避免重复这个并形成(i,j,k)循环的任务。