gpt4 book ai didi

r - 使用 auto.arima : Error in OCSBtest(x, m) :下标越界

转载 作者:行者123 更新时间:2023-12-04 12:28:16 25 4
gpt4 key购买 nike

我在大量时间序列上使用一个大(isplit)循环来测试 ARIMA 模型。为此,我正在使用 auto.arima来自 forecast 的函数包裹。

为此,我创建了一个函数,用于遍历所有时间序列,同时跟踪进度并存储拟合模型和统计数据(例如准确性和模型参数)。现在我正在处理由 auto.arima 产生的错误功能。更准确地说;由 OCSB 季节性测试引起。

我将此函数用于“每月”时间序列以及“每周”时间序列。对于每月时间序列 a 没有问题(几乎 50000,包括很多具有“零”值的)。对于每周时间序列,我遇到了问题。但我无法找到错误的真正原因。

我试图重现错误。我认为它与许多 0(或相同)值与 52 个频率周期相结合有关。但我仍然无法将矛头指向问题。

请参阅下面的示例。一些信息:时间序列集是每周值(频率 = 52),从 2010 年第 1 周开始。长度为 122 个样本(直到 2012 年,第 18 周)。因此,我测试了 122 的长度,为此我可以生成错误。我仍然认为它与频率和“运行相同的值”有关......

有些错误会产生,有些则不会。

例1【随机数,长度=122】>没问题:

ts_element <- ts(sample(0:30, 122, replace=TRUE), frequency = 52, start = c(2010, 1))
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)

示例 2 [只有 0 个值,长度 = 122] > OCSB 测试错误(通常我会假设一个不同的错误......参见示例 3):
ts_element <- ts(sample(0:0, 122, replace=TRUE), frequency = 52, start = c(2010, 1))
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)
Error in OCSBtest(x, m) : subscript out of bounds

示例 3 [only 0 values, length=100] > 'zero/equal values' 错误,我假设了这个,这个示例不是问题,但要指出长度是相关的(与示例 2 比较):
ts_element <- ts(sample(0:0, 100, replace=TRUE), frequency = 52, start = c(2010, 1))
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)
Error in if (PVAL == min(tablep)) warning("p-value smaller than printed p-value") else warning("p-value greater than printed p-value") :
missing value where TRUE/FALSE needed

示例 4 [与示例 3 几乎相同,但有一个非 0 值,长度=100] > 没问题了:
ts_element[30] <- 1
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)

例 5 [与例 4 几乎相同,但长度=122] > OCSB 测试错误:
ts_element <- ts(sample(0:0, 122, replace=TRUE), frequency = 52, start = c(2010, 1))
ts_element[30] <- 1
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)
Error in OCSBtest(x, m) : subscript out of bounds

示例 6 [随机 1 和 0,长度=122] > 没问题:
ts_element <- ts(sample(0:1, 122, replace=TRUE), frequency = 52, start = c(2010, 1))
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)

例7【随机数,更小的长度为50】>没问题:
ts_element <- ts(sample(1:34, 50, replace=TRUE), frequency = 52, start = c(2010, 1))
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)

有没有人知道 OCSB 越界错误的原因是什么?
如何识别?

主要问题是,每当我在本文开头所描述的函数中发生此错误时,该函数都不会输出我收集的所有信息。所以等待的时间是白费。
因此,如果找不到根本原因,我也会在一些代码方面得到很大帮助,以“忽略”它们(跳过该时间序列)并进一步处理错误。或者忽略,但仍然输出当时收集到的信息。

解决方案如何?

注意:零错误不是问题。我在我的函数中介绍了这一点。

最佳答案

很好的问题,解释得很好。您在提交之前清楚地考虑了这一点。

你的例子中的问题是由于处理充满零的时间序列的许多问题(在我看来,是错误)造成的。

通常,您应该使用 debug命令单步执行您的代码。例如,尝试调试为 auto.arima 运行的五个主要函数。 :

debug(auto.arima)
debug(nsdiffs)
debug(forecast:::OCSBtest)
debug(lm)
debug(lm.fit)

(使用 Q 退出并使用 undebug 停止调试函数)然后尝试在 中运行您的代码示例 2
ts_element <- ts(sample(0:0, 122, replace=TRUE), frequency = 52, start = c(2010, 1))
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)

经过很多压力 Enter你最终会到达 R 失败的地步。在这种情况下,这是 lm.fit 中的一个相当深沉和讨厌的错误。 .如果所有系数都为零,则出于某种原因将它们转换为 NA .当 OCSBtest函数尝试提取系数,它发现矩阵为空,并告诉您它不是一个合适的索引。

我会告诉你把这个报告给 R-bugs ......但是当涉及到 base 中的错误时,他们可能非常狡猾。 .他们可能会告诉您这是“用户错误”,并且您不应该将回归模型拟合到全零(叹气)。

的第一个问题示例 3 似乎是 nsdiffs 中未记录的功能页面,其中描述了 forecast::OCSBtest功能。看起来您的时间序列必须大于周期的 2 倍 + 5,否则将无法运行季节性差异。在 示例 2 这是真的,但不是在 示例 3 .实际上,函数中代码的第一部分是:
if (length(time.series) < (2 * period + 5)) {
return(0)
}

阅读 nsdiffs 中列出的两个 Osborn 引用文献页面,也许它在某处提到了它。最好让 forecast 的作者知道这样他们就可以将其包含在文档中的某个地方。甚至可能会发出警告,并可以选择将其关闭。

示例 3 有与 不同的错误示例 2 是因为 示例 3 立即退出 nsdiffs函数,然后在 ndiff 中继续失败函数,它做差分。 ndiff似乎有一个错误,如果平方差之和为零(因为系列为零),则会导致除以零错误。这是 ndiff中的相关代码功能:
s2 <- .C("R_pp_sum", as.vector(e, mode = "double"), as.integer(n), as.integer(l), s2 = as.double(s2), PACKAGE = "tseries")$s2
STAT <- eta/s2 # Becomes NaN
PVAL <- approx(table, tablep, STAT, rule = 2)$y # Also NaN
if (is.na(approx(table, tablep, STAT, rule = 1)$y)) if (PVAL ==
min(tablep)) warning("p-value smaller than printed p-value") else warning("p-value greater than printed p-value") # Bombs

示例 4 成功是因为 s2永远不会为零。一个简单的解决方法是检查是否 s2除法前为零。

示例 5 失败的原因与 大致相同示例 2 .它进入 nsdiff函数,因为它的长度超过 2*period+5 ,然后失败,因为 lm.fit当它们都为零时不返回系数。

示例 6 成功是因为 lm.fit现在将正确返回系数,因为它们并非全为零,因为您的时间序列与 1 和 0 混合。

示例 7 成功是因为 nsdiff未运行(因为系列太小)和 ndiff将不再导致除以零,因为平方差的总和不会为零。

总之,您的示例显示了两个错误。一中 ndiff当时间序列始终为零时,另一个在 lm.fit当协变量都为零时的函数。此外, nsdiff 中的文档应该更新以告诉您如果时间序列的长度小于 2*period+5 它将不会运行。如果您使用 'ocsb' 选项(但可能这在引用资料中有所记载)。

关于r - 使用 auto.arima : Error in OCSBtest(x, m) :下标越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10898770/

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