回歸 - 在存在異變異數的情況下測試自相關
我已經建構了一個線性時間序列回歸模型,並通過應用 OLS 估計了參數。我現在想測試適當的大樣本推斷的假設(漸近高斯馬爾可夫假設)是否得到滿足。
現在,我不確定如何測試殘差是否自相關。由於我的模型包含滯後因變數,我不能使用 Durbin-Watson 檢驗(因為我的自變數不是嚴格外生的)。在Wooldridge之後,我決定應用 Breusch-Godfrey 測試。但是殘差是異變異數的,我通過應用 Bresuch-Pagan 測試對其進行了測試。
Wooldridge說,在異變異數的情況下,不能應用通常的 Breusch-Godfrey 檢驗。在存在異變異數的情況下如何檢驗自相關?有什麼穩健的方法嗎?如果這有任何興趣 - 我正在使用 R,所以如果在 R 中有一個方法的實現(如果有的話)將會很有幫助。
編輯:我發現了一篇非常有趣的論文,它提出了一種處理該主題的方法:修改後的 Breusch-Godfrey 測試。連結: http: //www.naun.org/main/NAUN/mcs/17-542.pdf。
然而,我沒有找到這個測試的任何實際實現。由於我(只是)一名本科生,我自己實施這些方法的可能性相當有限。所以我仍在尋找一種通用的方法/測試或方法。(而且我認為必須有一種方法,因為我遇到的問題讓我覺得很常見。)謝謝!
**一般說明:**同變異數下的BG檢驗可以使用R包中的
bgtest
命令來完成。lmtest
$ (n-p)R_{aux}^2 $ 連結中提到的版本僅在同變異數下有效。在存在異變異數的情況下,Wooldridge (1991, JoE)進行了討論(如您提到的 Wooldridge 教科書中所述)。**我的想法:**我猜 Wooldridge 所做的是使用異變異數穩健變異數估計器。為此,(i) 獲得 OLS 殘差,(ii) 在 e(t-1)、…、e(tp) 和 X 上回歸 e(t),並測試 e(t-1) 的聯合顯著性, …, e(tp) 使用異變異數穩健共變異數估計。如果要使用 R,請對 AR(2) 執行以下操作:
DF <- data.frame(y=rnorm(100), x1=rnorm(100), x2=rnorm(100)) ols <- lm(y~x1+x2, data=DF) DF$e <- ols$resid DF$e1 <- c(NA,DF$e[-100]) # are there better ways to lag a variable? DF$e2 <- c(NA,DF$e1[-100]) aux <- lm(e~e1+e2+x1+x2, data=DF) library(car) lht(aux, c('e1','e2'), white.adjust='hc3')
**討論:**也就是說,上面的回歸中存在生成回歸量的問題,即使用OLS回歸結果生成
aux
的一些RHS變數(e1
和)。e2
這通常會引起麻煩。但是,即使生成了回歸量,也可以進行一些測試。我想這是一個,但我還沒有正式檢查過。進一步討論: BG測試是LM測試,而
lht
Wald測試。差異應該很小。**模擬結果:**我做了模擬。普通的 BG 測試似乎失敗了。強化版本似乎有效。
library(car) iterate <- 1000 n <- 400 ans <- data.frame(ord=rep(NA,iterate), rob=rep(NA,iterate)) set.seed(1) for (iter in seq_len(iterate)) { x1 <- rnorm(n+1) x2 <- rnorm(n+1) u0 <- rnorm(n+1) u0[1:floor(n/2)] <- 2*u0[1:floor(n/2)] u <- sqrt(1+abs(x1+x2))*u0 ## y(t) = 1+x1(t)+x2(t)+0.5*y(t-1)+u(t) y <- filter(1+x1+x2+u, 0.5, method='recursive') y1 <- y[-(n+1)] # y(1), ..., y(n) y <- y[-1] # y(2), ..., y(n+1) x1 <- x1[-1] # x1(2), ..., x1(n+1) x2 <- x2[-1] # x2(2), ..., x2(n+1) ols <- lm(y~x1+x2+y1) e <- ols$resid e1 <- c(NA,e[-n]) # NA, e(1), ..., e(n-1) e2 <- c(NA,e1[-n]) # NA, NA, e(1), ..., e(n-2) aux <- lm(e~e1+e2+x1+x2+y1) tst0 <- lht(aux, c('e1','e2'), white.adjust=FALSE) ans$ord[iter] <- as.numeric(tst0$`Pr(>F)`[2] < 0.05) tst1 <- lht(aux, c('e1','e2'), white.adjust=TRUE) ans$rob[iter] <- as.numeric(tst1$`Pr(>F)`[2] < 0.05) } print(colMeans(ans)) ## ord rob ## 0.090 0.046
注意:我對模擬進行了很多編輯。我希望這個沒問題。