Conjetura
No conozco ningún estudio que compare estas pruebas. Tenía la sospecha de que la prueba de Ljung-Box es más apropiada en el contexto de modelos de series temporales como los modelos ARIMA, en los que las variables explicativas son rezagos de las variables dependientes. La prueba de Breusch-Godfrey podría ser más apropiada para un modelo de regresión general en el que se cumplen los supuestos clásicos (en particular, los regresores exógenos).
Mi conjetura es que la distribución de la prueba Breusch-Godfrey (que se basa en los residuos de una regresión ajustada por mínimos cuadrados ordinarios), puede verse afectada por el hecho de que las variables explicativas no son exógenas.
Hice un pequeño ejercicio de simulación para comprobarlo y los resultados sugieren lo contrario: el test de Breusch-Godfrey funciona mejor que el test de Ljung-Box cuando se comprueba la autocorrelación en los residuos de un modelo autorregresivo. A continuación se ofrecen los detalles y el código R para reproducir o modificar el ejercicio.
Pequeño ejercicio de simulación
Una aplicación típica de la prueba de Ljung-Box consiste en comprobar la existencia de correlación serial en los residuos de un modelo ARIMA ajustado. En este caso, genero datos de un modelo AR(3) y ajusto un modelo AR(3).
Los residuos satisfacen la hipótesis nula de ausencia de autocorrelación, por lo que cabría esperar valores p uniformemente distribuidos. La hipótesis nula debería rechazarse en un porcentaje de casos cercano a un nivel de significación elegido, por ejemplo, el 5%.
Prueba de 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])
![Ljung-Box test p-values]()
Los resultados muestran que la hipótesis nula se rechaza en muy pocos casos. Para un nivel del 5%, el índice de rechazos es muy inferior al 5%. La distribución de los valores p muestra un sesgo hacia el no rechazo de la nula.
Editar En principio fitdf=3
debe fijarse en todos los casos. De este modo, se tendrán en cuenta los grados de libertad que se pierden tras ajustar el modelo AR(3) para obtener los residuos. Sin embargo, para los rezagos de orden inferior a 4, esto conducirá a grados de libertad negativos o nulos, haciendo que la prueba no sea aplicable. Según la documentación ?stats::Box.test
: Estas pruebas se aplican a veces a los residuos de un ajuste ARMA(p, q), en cuyo caso las referencias sugieren que se obtiene una mejor aproximación a la distribución de hipótesis nula estableciendo fitdf = p+q
Siempre y cuando, por supuesto, se trate de lag > fitdf
.
Prueba de 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 test p-values]()
Los resultados de la prueba de Breusch-Godfrey parecen más sensatos. Los valores p se distribuyen uniformemente y los índices de rechazo se acercan más al nivel de significación (como se espera bajo la hipótesis nula).
1 votos
Relacionado: "Prueba de Breusch-Godfrey sobre los residuos de un modelo MA(q)" .