어림짐작
이 테스트를 비교 한 연구에 대해서는 모르겠습니다. 설명 변수가 종속 변수보다 느린 ARIMA 모델과 같은 시계열 모델의 맥락에서 Ljung-Box 테스트가 더 적합하다는 의혹이있었습니다. Breusch-Godfrey 검정은 일반적인 가정이 충족되는 일반적인 회귀 모델 (특히 외인 회귀 분석)에 더 적합 할 수 있습니다.
내 생각은 Breusch-Godfrey 검정의 분포 (일반 최소 제곱에 의해 회귀 된 잔차에 의존 함)는 설명 변수가 외생 적이 지 않다는 사실에 영향을받을 수 있다는 것입니다.
나는 이것을 확인하기 위해 작은 시뮬레이션 연습을했고 그 결과는 반대를 제안합니다 : Breusch-Godfrey 테스트는 자기 회귀 모델의 잔차에서 자기 상관을 테스트 할 때 Ljung-Box 테스트보다 성능이 우수합니다. 운동을 재현하거나 수정하는 세부 사항 및 R 코드는 다음과 같습니다.
작은 시뮬레이션 연습
Ljung-Box 테스트의 일반적인 적용은 피팅 된 ARIMA 모델의 잔차에서 직렬 상관 관계를 테스트하는 것입니다. 여기에서는 AR (3) 모델에서 데이터를 생성하고 AR (3) 모델에 적합합니다.
잔차는 자기 상관이 없다는 귀무 가설을 충족하므로, 균일하게 분포 된 p- 값을 기대합니다. 귀무 가설은 선택한 유의 수준에 가까운 경우 (예 : 5 %)에서 기각되어야합니다.
융 박스 테스트 :
## 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- 값의 분포는 널을 거부하지 않는쪽으로의 편향을 보여줍니다.
원칙적으로 편집 원칙 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- 값은 균일하게 분포되어 있으며 기각 률은 귀무 가설 하에서 예상 한대로 유의 수준에 더 가깝습니다.