我想要的输出是做一个(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
答案 0 :(得分:2)
如果无法访问您的数据,则无法测试以下代码是否可以解决您的问题。
尝试使用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
})
)
答案 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)循环的任务。