推測
これらのテストを比較する研究については知りません。説明変数が従属変数の遅れであるARIMAモデルのような時系列モデルのコンテキストでは、Ljung-Boxテストがより適切であるとの疑いがありました。Breusch-Godfrey検定は、古典的な仮定が満たされる一般的な回帰モデル(特に外因性の回帰変数)により適しています。
私の推測では、Breusch-Godfreyテスト(通常の最小二乗法で近似された回帰の残差に依存します)の分布は、説明変数が外因性ではないという事実の影響を受ける可能性があります。
これを確認するために小さなシミュレーション演習を行いましたが、結果は逆を示しています。自己回帰モデルの残差の自己相関をテストする場合、Breusch-GodfreyテストはLjung-Boxテストよりも優れています。演習を再現または変更するための詳細とRコードを以下に示します。
小さなシミュレーション演習
Ljung-Box検定の典型的な用途は、近似されたARIMAモデルからの残差のシリアル相関を検定することです。ここでは、AR(3)モデルからデータを生成し、AR(3)モデルに適合させます。
残差は自己相関がないという帰無仮説を満たしているため、均一に分布したp値が期待されます。帰無仮説は、選択した有意水準(5%など)に近いケースの割合で拒否する必要があります。
Ljung-Boxテスト:
## Ljung-Box test
n <- 200 # number of observations
niter <- 5000 # number of iterations
LB.pvals <- matrix(nrow=niter, ncol=4)
set.seed(123)
for (i in seq_len(niter))
{
# Generate data from an AR(3) model and store the residuals
x <- arima.sim(n, model=list(ar=c(0.6, -0.5, 0.4)))
resid <- residuals(arima(x, order=c(3,0,0)))
# Store p-value of the Ljung-Box for different lag orders
LB.pvals[i,1] <- Box.test(resid, lag=1, type="Ljung-Box")$p.value
LB.pvals[i,2] <- Box.test(resid, lag=2, type="Ljung-Box")$p.value
LB.pvals[i,3] <- Box.test(resid, lag=3, type="Ljung-Box")$p.value
LB.pvals[i,4] <- Box.test(resid, lag=4, type="Ljung-Box", fitdf=3)$p.value
}
sum(LB.pvals[,1] < 0.05)/niter
# [1] 0
sum(LB.pvals[,2] < 0.05)/niter
# [1] 0
sum(LB.pvals[,3] < 0.05)/niter
# [1] 0
sum(LB.pvals[,4] < 0.05)/niter
# [1] 0.0644
par(mfrow=c(2,2))
hist(LB.pvals[,1]); hist(LB.pvals[,2]); hist(LB.pvals[,3]); hist(LB.pvals[,4])
結果は、非常にまれなケースで帰無仮説が棄却されることを示しています。5%レベルの場合、拒否率は5%よりはるかに低くなります。p値の分布は、nullの非拒否へのバイアスを示しています。
原則fitdf=3
として、すべての場合に編集を設定する必要があります。これにより、AR(3)モデルを近似して残差を取得した後に失われる自由度が考慮されます。ただし、次数が4未満のラグの場合、これは負または0の自由度につながり、テストを適用できなくなります。資料によると?stats::Box.test
:これらの試験は、時々参照は設定することによって得られるヌル仮説分布に対する良好な近似を示唆し、その場合、ARMA(p、q)はフィットからの残差に適用されるfitdf = p+q
そのコースを設け、lag > fitdf
。
Breusch-Godfreyテスト:
## Breusch-Godfrey test
require("lmtest")
n <- 200 # number of observations
niter <- 5000 # number of iterations
BG.pvals <- matrix(nrow=niter, ncol=4)
set.seed(123)
for (i in seq_len(niter))
{
# Generate data from an AR(3) model and store the residuals
x <- arima.sim(n, model=list(ar=c(0.6, -0.5, 0.4)))
# create explanatory variables, lags of the dependent variable
Mlags <- cbind(
filter(x, c(0,1), method= "conv", sides=1),
filter(x, c(0,0,1), method= "conv", sides=1),
filter(x, c(0,0,0,1), method= "conv", sides=1))
colnames(Mlags) <- paste("lag", seq_len(ncol(Mlags)))
# store p-value of the Breusch-Godfrey test
BG.pvals[i,1] <- bgtest(x ~ 1+Mlags, order=1, type="F", fill=NA)$p.value
BG.pvals[i,2] <- bgtest(x ~ 1+Mlags, order=2, type="F", fill=NA)$p.value
BG.pvals[i,3] <- bgtest(x ~ 1+Mlags, order=3, type="F", fill=NA)$p.value
BG.pvals[i,4] <- bgtest(x ~ 1+Mlags, order=4, type="F", fill=NA)$p.value
}
sum(BG.pvals[,1] < 0.05)/niter
# [1] 0.0476
sum(BG.pvals[,2] < 0.05)/niter
# [1] 0.0438
sum(BG.pvals[,3] < 0.05)/niter
# [1] 0.047
sum(BG.pvals[,4] < 0.05)/niter
# [1] 0.0468
par(mfrow=c(2,2))
hist(BG.pvals[,1]); hist(BG.pvals[,2]); hist(BG.pvals[,3]); hist(BG.pvals[,4])
Breusch-Godfreyテストの結果はより賢明に見えます。p値は均一に分布し、棄却率は有意水準に近づきます(帰無仮説で予想されるとおり)。