varsayım
Bu testleri karşılaştıran hiçbir çalışma bilmiyorum. Açıklayıcı değişkenlerin bağımlı değişkenlerin gecikmesi olduğu ARIMA modelleri gibi zaman serisi modelleri bağlamında Ljung-Box testinin daha uygun olduğu konusunda şüphelerim vardı. Breusch-Godfrey testi, klasik varsayımların karşılandığı genel bir regresyon modeli için daha uygun olabilir (özellikle eksojen regresörler).
Benim düşünceme göre, Breusch-Godfrey testinin dağılımının (Artıkların En Küçük Kareler tarafından belirlenen bir regresyondan kalanlara dayanması), açıklayıcı değişkenlerin dışsal olmamasından etkilenebileceğidir.
Bunu kontrol etmek için küçük bir simülasyon alıştırması yaptım ve sonuçlar bunun tam tersini gösteriyor: Breusch-Godfrey testi, otoregressif bir modelin kalıntılarında otokorelasyon testi yapılırken Ljung-Box testinden daha iyi performans gösteriyor. Egzersizi çoğaltmak veya değiştirmek için detaylar ve R kodu aşağıda verilmiştir.
Küçük simülasyon alıştırması
Ljung-Box testinin tipik bir uygulaması, yerleşik bir ARIMA modelinden kalanlarda seri korelasyonu test etmektir. Burada bir AR (3) modelinden veri üretiyorum ve bir AR (3) modeline uyuyorum.
Artıklar otokorelasyonun boş hipotezini yerine getirirler, bu nedenle düzgün dağılmış p değerleri bekleriz. Boş hipotez, seçilen bir önem düzeyine yakın vakaların yüzdesi olarak, örneğin% 5 olarak reddedilmelidir.
Ljung-Box testi:
## 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])
Sonuçlar, sıfır hipotezin çok nadir durumlarda reddedildiğini göstermektedir. % 5 düzeyinde, reddetme oranı% 5'ten çok daha düşüktür. P değerlerinin dağılımı, boş değerin reddedilmemesine karşı bir önyargı gösterir.
Düzenleme
Prensip fitdf=3
olarak her durumda ayarlanmalıdır. Bu, artıkları elde etmek için AR (3) modelini taktıktan sonra kaybolan serbestlik derecelerini hesaba katacaktır. Bununla birlikte, 4'ten düşük siparişte gecikmeler, bu negatif veya sıfır serbestlik derecelerine yol açar ve bu da testi uygulanabilir değildir. Belgelere göre ?stats::Box.test
: Bu testler bazen ARMA (p, q) uyumundan kalanlara uygulanır, bu durumda referanslar boş hipotez dağılımına daha iyi bir yaklaşım fitdf = p+q
getirildiğini gösterir lag > fitdf
.
Breusch-Godfrey testi:
## 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 testinin sonuçları daha mantıklı görünüyor. P-değerleri eşit olarak dağılmıştır ve reddetme oranları anlamlılık seviyesine daha yakındır (sıfır hipotezi altında beklendiği gibi).