Для отладки я добавил несколько отпечатков в заявке.Интересным является класс (y)
library(forecast)
fc_func <- function(y){
print(length(y))
print(class(y))
#print(y)
forecast(auto.arima(y),h=12)$mean
}
retail <- read.csv("https://robjhyndman.com/data/ausretail.csv",header=FALSE)
retail <- ts(retail[,-1],f=12,s=1982+3/12)
retail2 = retail
#retail = retail2[1:333,1:42]
frc<- apply(retail,2 ,fc_func)
Все y отображаются в числовом виде.
> frc<- apply(retail,2 ,fc_func)
[1] 333
[1] "numeric"
[1] 333
[1] "numeric"
[1] 333
[1] "numeric"
[1] 333
[1] "numeric"
[1] 333
Это отличается в цикле for:
ns <- ncol(retail)
h <- 12
fcast1 <- matrix(NA,nrow=h,ncol=ns)
for(i in 1:ns){
print(length(retail[,i]))
print(class(retail[,i]))
#print(retail[,i])
fcast1[,i] <- forecast(auto.arima(retail[,i]),h=h)$mean
}
здесь переменные передаются как ts в auto.arima.
> for(i in 1:ns){
+ print(length(retail[,i]))
+ print(class(retail[,i]))
+ #print(retail[,i])
+ fcast1[,i] <- forecast(auto.arima(retail[,i]),h=h)$mean
+ }
[1] 333
[1] "ts"
[1] 333
[1] "ts"
[1] 333
[1] "ts"
[1] 333
Я полагаю, что это вызывает различия, потому что когда я сокращаю розничную торговлю до простой матрицы на
retail = retail[1:NROW(retail), 1:NCOL(retail)]
и снова запускаю цикл for, я получаю совершенно те же результаты, что и вверсия apply.
all.equal(frc, fcast1)
Так что, я думаю, вам нужно снова преобразовать переменные в ts внутри fc_func перед отправкой их в функцию прогноза.
В качестве обходного пути (и потому что японятия не имел, как преобразовать y в нужный объект ts), вы могли бы использовать более удобную версию:
fc_func2 <- function(y){
forecast(auto.arima(retail[,y]),h=12)$mean
}
frc2 <- sapply(1:NCOL(retail), fc_func2)
Она должна давать желаемые значения, но я не уверен, что она быстрее, чем версия цикла.