gpt4 book ai didi

r - 批量预测;使用 apply() 函数而不是 for 循环。 apply() 函数给出不同点的预测

转载 作者:行者123 更新时间:2023-12-02 00:58:13 34 4
gpt4 key购买 nike

到目前为止,我使用的是 this当我有多个时间序列要预测时,我使用了 Hyndman 教授的方法。但是当我有大量的 ts 时它相当慢。

现在我正在尝试使用 apply() 函数,如下所示

library(forecast)

fc_func <- function(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)

frc<- apply(retail,2 ,fc_func)

它似乎运行良好,但是当我按如下方式使用 for 循环时:

ns <- ncol(retail)
h <- 12
fcast <- matrix(NA,nrow=h,ncol=ns)
for(i in 1:ns){
fcast[,i] <- forecast(auto.arima(retail[,i]),h=h)$mean
}

我得到不同的点预测。这是什么原因?

编辑: 我通过更改“fc_func”函数修复了它。现在它返回与 for 循环相同的结果,但现在它也和 for 循环一样慢

fc_func <- function(x){

ts(x,f=12,s=1982+3/12)->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)

frc<- apply(retail,2 ,fc_func)

最佳答案

问题是 apply() 操作 time series 对象的类,retail。作为 apply 系列的基本版本,apply() 最适用于简单的矩阵对象。它会在调用时将其输入转换为带有 as.matrix() 的矩阵对象,因此经常警告 apply() 不要用于数据帧。

根据 ?apply 文档:

If X is not an array but an object of a class with a non-null dim value (such as a data frame), apply attempts to coerce it to an array via as.matrix if it is two-dimensional (e.g., a data frame) or via as.array

所以apply在处理成fc_func之前不保留其输入的类对象:

class(retail)
# [1] "mts" "ts" "matrix"

当使用 sapply 时可以看到这一点,它的运行速度与 for 一样慢,并且在删除 dimnames 时返回与 for 循环:

# LOOP VERSION
ns <- ncol(retail)
h <- 12
fcast1 <- matrix(NA,nrow=h,ncol=ns)

for(i in 1:ns) {
fcast1[,i] <- forecast(auto.arima(retail[,i]), h=h)$mean
}

# SAPPLY VERSION
frc_test <- sapply(retail, fc_func, USE.NAMES = FALSE)
dimnames(frc_test) <- NULL

identical(frc_test, fcast1)
# [1] TRUE

关于r - 批量预测;使用 apply() 函数而不是 for 循环。 apply() 函数给出不同点的预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52611255/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com