Формируем цикл для (i, j, k), где i, j и k лежат в [0,5] в версии R 3.4.4 - PullRequest
0 голосов
/ 18 мая 2018

Вывод, который я пытаюсь получить, состоит в создании цикла (i, j, k), где i и k принимают значения [0, 5] и j из [0, 3].Цикл будет работать со значениями, такими как:

(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 автоматически.

В результате я хочу наконец связать эти два и создать таблицу, подобную

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

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Код использую,

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

0 голосов
/ 18 мая 2018

Это не дает точного ответа на ваш вопрос, однако я полагаю, что вы можете использовать функцию auto.arima из пакета forecast, которая может оценить только лучшую модель ARIMA.

Вы также можете установить максимальные значения (p,q,d).

Уродливое, но простое решение - я бы использовал тройной цикл:

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
0 голосов
/ 18 мая 2018

Превышение ваших данных

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

Порядок (p, I, q) модели arima

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

который вычисляет RMSE скорректированной модели arima

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
0 голосов
/ 18 мая 2018

Без доступа к вашим данным невозможно проверить, решает ли ваш код следующий код.

Попробуйте использовать функцию apply для циклического перемещения по строкам матрицы, определенной для i, j и k, используя expand.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
      })
)
...