2012-05-21 66 views
6

我的問題是這樣的:我得到NA我應該在計算可靠的標準錯誤時得到一些值。面板數據迴歸:穩健的標準錯誤

我正在嘗試使用羣集健全標準錯誤進行固定效果面板迴歸。爲此,我按照Arai (2011)誰在頁。 3遵循Stock/ Watson (2006)(稍後發佈在Econometrica,對於那些有訪問權限的人)。我想通過(M/(M-1)*(N-1)/(N-K)來糾正自由度,因爲我的羣集數量是有限的,而且我有不平衡的數據。

類似問題[12]在計算器上和交叉驗證相關問題[3]之前已經公佈。

新井(以及在第一環節的答案)使用的功能,下面的代碼(我在下面提供了一些進一步的評論我的數據):

gcenter <- function(df1,group) { 
    variables <- paste(
     rep("C", ncol(df1)), colnames(df1), sep=".") 
    copydf <- df1 
    for (i in 1:ncol(df1)) { 
     copydf[,i] <- df1[,i] - ave(df1[,i], group,FUN=mean)} 
    colnames(copydf) <- variables 
    return(cbind(df1,copydf))} 

# 1-way adjusting for clusters 
clx <- function(fm, dfcw, cluster){ 
    # R-codes (www.r-project.org) for computing 
    # clustered-standard errors. Mahmood Arai, Jan 26, 2008. 
    # The arguments of the function are: 
    # fitted model, cluster1 and cluster2 
    # You need to install libraries `sandwich' and `lmtest' 
    # reweighting the var-cov matrix for the within model 
    library(sandwich);library(lmtest) 
    M <- length(unique(cluster)) 
    N <- length(cluster)   
    K <- fm$rank       
    dfc <- (M/(M-1))*((N-1)/(N-K)) 
    uj <- apply(estfun(fm),2, function(x) tapply(x, cluster, sum)); 
    vcovCL <- dfc*sandwich(fm, meat=crossprod(uj)/N)*dfcw 
    coeftest(fm, vcovCL) } 

,其中gcenter計算偏離平均值(固定效果)。然後,我繼續並使用DS_CODE作爲我的羣集變量(我已將其數據命名爲「數據」)進行迴歸。

centerdata <- gcenter(data, data$DS_CODE) 
datalm <- lm(C.L1.retE1M ~ C.MCAP_SEC + C.Impact_change + C.Mom + C.BM + C.PD + C.CashGen + C.NITA + C.PE + C.PEdummy + factor(DS_CODE), data=centerdata) 
M <- length(unique(data$DS_CODE)) 
dfcw <- datalm$df/(datalm$df - (M-1)) 

,並要計算

clx(datalm, dfcw, data$DS_CODE) 

然而,當我想計算UJ(見上述公式clx)的變化,我只得到一開始對我的迴歸係數的一些值,然後很多零。如果此輸入uj用於方差,則只有NAs結果。

我的數據

由於我的數據可能是特殊的結構,我無法弄清楚這個問題,我發佈了整個事情從Hotmail一個link。原因是有了其他數據(摘自Arai(2011)),我的問題不會發生。對不起,我很抱歉,如果你可以看看它,但我會很感激。 該文件是一個純粹包含數據的5mb .txt文件。

+0

新居的論文你的鏈接下不復存在。你能提供實際的鏈接嗎? – MERose

回答

2

一段時間玩耍後,它爲我工作,給我:

      Estimate Std. Error t value Pr(>|t|)  
(Intercept)   4.5099e-16 5.2381e-16 0.8610 0.389254  
C.MCAP_SEC   -5.9769e-07 1.2677e-07 -4.7149 2.425e-06 *** 
C.Impact_change  -5.3908e-04 7.5601e-05 -7.1306 1.014e-12 *** 
C.Mom     3.7560e-04 3.3378e-03 0.1125 0.910406  
C.BM     -1.6438e-04 1.7368e-05 -9.4645 < 2.2e-16 *** 
C.PD     6.2153e-02 3.8766e-02 1.6033 0.108885  
C.CashGen    -2.7876e-04 1.4031e-02 -0.0199 0.984149  
C.NITA    -8.1792e-02 3.2153e-02 -2.5438 0.010969 * 
C.PE     -6.6170e-06 4.0138e-06 -1.6485 0.099248 . 
C.PEdummy    1.3143e-02 4.8864e-03 2.6897 0.007154 ** 
factor(DS_CODE)130324 -5.2497e-16 5.2683e-16 -0.9965 0.319028  
factor(DS_CODE)130409 -4.0276e-16 5.2384e-16 -0.7689 0.441986  
factor(DS_CODE)130775 -4.4113e-16 5.2424e-16 -0.8415 0.400089 
... 

這給我們留下了爲什麼它不適合你的問題。我想這與你的數據格式有關。一切都是數字嗎?我轉換的列類,它看起來像我:

str(dat) 
'data.frame': 48251 obs. of 12 variables: 
$ DS_CODE  : chr "902172" "902172" "902172" "902172" ... 
$ DNEW   : num 2e+05 2e+05 2e+05 2e+05 2e+05 ... 
$ MCAP_SEC  : num 78122 71421 81907 80010 82462 ... 
$ NITA   : num 0.135 0.135 0.135 0.135 0.135 ... 
$ CashGen  : num 0.198 0.198 0.198 0.198 0.198 ... 
$ BM   : num 0.1074 0.1108 0.097 0.0968 0.0899 ... 
$ PE   : num 57 55.3 63.1 63.2 68 ... 
$ PEdummy  : num 0 0 0 0 0 0 0 0 0 0 ... 
$ L1.retE1M : num -0.72492 0.13177 0.00122 0.07214 -0.07332 ... 
$ Mom   : num 0 0 0 0 0 ... 
$ PD   : num 5.41e-54 1.51e-66 3.16e-80 2.87e-79 4.39e-89 ... 
$ Impact_change: num 0 -10.59 -10.43 0.7 -6.97 ... 

什麼str(data)回報嗎?

+0

非常感謝您的努力和您的回答!我的'str(data)'返回* DS_CODE的* Factor *和'DNEW'的* int *。所有其他結果是相同的....但:這是最奇怪的事情:現在,如果我使用*減少*數據集(我給你只有小數據集沒有我的其他varials和R行號)現在的作品。有了這個大集合,我在* uj *的計算中得到了1個單獨的'NAs'。如果我沒有行號('row.names = FALSE')導出我的整個數據集,再次導入並進行迴歸,它可以處理大數據集。我不知道爲什麼... – Jan

+0

現在很高興它的作品。 –

0

plm包可以估計面板迴歸的聚集SE。原始數據不再可用,所以這裏是一個使用虛擬數據的例子。

require(foreign) 
require(plm) 
require(lmtest) 
test <- read.dta("http://www.kellogg.northwestern.edu/faculty/petersen/htm/papers/se/test_data.dta") 

fpm <- plm(y ~ x, test, model='pooling', index=c('firmid', 'year')) 

##Arellano clustered by *group* SEs 
> coeftest(fpm, vcov=function(x) vcovHC(x, cluster="group", type="HC0")) 

t test of coefficients: 

      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 0.029680 0.066939 0.4434 0.6575  
x   1.034833 0.050540 20.4755 <2e-16 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

如果您使用lm模型(而不是plm),那麼multiwayvcov包可能會有幫助。

library("lmtest") 
library("multiwayvcov") 

data(petersen) 
m1 <- lm(y ~ x, data = petersen) 

> coeftest(m1, vcov=function(x) cluster.vcov(x, petersen[ , c("firmid")], 
    df_correction=FALSE)) 

t test of coefficients: 

      Estimate Std. Error t value Pr(>|t|)  
(Intercept) 0.029680 0.066939 0.4434 0.6575  
x   1.034833 0.050540 20.4755 <2e-16 *** 
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

有關詳細信息,請參閱:

參見: