4

ARIMA モデルでテストするために、時系列の巨大なセットで大きな (isplit) ループを使用しています。このために、パッケージのauto.arima関数を使用しています。forecast

このために、進行状況を追跡しながらすべての時系列をトラバースし、適合したモデルと統計 (精度やモデル パラメーターなど) を保存する関数を作成しました。現在、関数によって生成されたエラーを処理していauto.arimaます。より正確には; OCSB の季節的なテストによって引き起こされます。

この関数は、「月単位」の時系列と「週単位」の時系列に使用しています。毎月の時系列の場合、問題はありません (「ゼロ」値の多くを含めて、ほぼ 50000)。毎週の時系列で問題に遭遇しました。しかし、エラーの本当の原因を見つけることができません。

エラーを再現しようとしました。私はそれが52の周波数期間と組み合わせて多くの0(または同じ)値と関係があると思っていました. しかし、私はまだ問題を指摘することはできません。

以下の例を参照してください。いくつかの情報: 時系列のセットは、2010 年の第 1 週から始まる週ごとの値 (freq=52) です。長さは 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 [値が 0 のみ、長さ = 100] > 'ゼロ/等しい値' エラー。

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 [ex.3 とほぼ同じですが、0 以外の値が 1 つあり、長さ = 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の範囲外エラーの原因が何であるかを知っている人はいますか? 認識する方法は?

主な問題は、この投稿の冒頭で説明した関数でこのエラーが発生するたびに、関数が収集しているすべての情報を出力しないことです。そのため、何時間も待つ必要はありません。したがって、根本的な原因が見つからない場合は、エラーを「無視」して (その時系列をスキップして) さらに先に進む方法でエラーを処理するためのコードも非常に役立ちます。または無視しますが、その時点で収集された情報を出力します。

解決方法は?

注: ゼロエラーは問題ではありません。私は自分の機能でこれをカバーしています。

4

1 に答える 1

10

いい質問で、よく説明されています。提出する前に、あなたは明らかにこれを熟考しました。

あなたの例の問題は、ゼロでいっぱいの時系列を扱うことに関する多くの問題(そして私の意見ではバグ)によるものです。

一般に、debugコマンドを使用してコードをステップ実行する必要があります。たとえば、 に対して実行される 5 つの主要な関数をデバッグしてみてください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。すべての係数がゼロの場合、何らかの理由でそれらを に変換しますNAOCSBtest関数が係数を取り出そうとすると、行列が空であることがわかり、適切なインデックスではないことがわかります。

これを R-bugs に報告するように言いたいのですがbase.... 彼らはおそらく、それは「ユーザー エラー」であり、回帰モデルをすべてゼロに合わせるべきではないと言うでしょう (ため息)。

例 3の最初の問題は、機能nsdiffsを説明するページに 記載されていないforecast::OCSBtest機能のようです。時系列は、期間の 2 倍 + 5 よりも大きくなければならないようです。さもないと、季節差分が実行されません。例 2 ではこれは当てはまりましたが、例 3ではそうではありませんでした。実際、関数内のコードの最初のビットは次のとおりです。

if (length(time.series) < (2 * period + 5)) {
    return(0)
}

nsdiffsこのページにリストされている 2 つの 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

例 4s2は、ゼロにならないため成功します。s2簡単な修正は、除算する前にゼロかどうかを確認することです。

例 5は、例 2とほとんど同じ理由で失敗します。nsdiff長さが より大きいため関数に入りますが、係数がすべてゼロの場合は係数を返さない2*period+5ため失敗します。lm.fit

例 6が成功するlm.fitのは、時系列に 1 と 0 が混在しているため、係数がすべてゼロではないため、適切に係数が返されるためです。

例 7nsdiffは (系列が小さすぎるため) 実行されないため成功ndiffし、二乗差の合計がゼロにならないため、ゼロによる除算が発生しなくなります。

結論として、あなたの例は 2 つのバグを示しています。1 つはndiff時系列が常にゼロの場合で、もう 1 つlm.fitは共変量がすべてゼロの場合の関数です。また、ドキュメントを更新して、'ocsb' オプションを使用した場合nsdiffよりも時系列の長さが短い場合は実行されないことを通知する必要があります (ただし、これは参考文献に記載されている可能性があります)。2*period+5

于 2012-06-05T22:14:51.553 に答える