2012-05-21 4 views
6

내 문제는 다음과 같습니다. NA 어디에서 견고한 표준 오류 계산을해야합니까?패널 데이터 회귀 : 강력한 표준 오류

저는 클러스터 강력한 표준 오류로 고정 효과 패널 회귀를 시도하고 있습니다. 이를 위해 나는 Arai (2011)을 따라갔습니다. 3은 Stock/ Watson (2006) (나중에 액세스 권한이있는 사용자는 Econometrica으로 게시 됨)을 따릅니다. 내 클러스터 수가 유한하고 불균형 한 데이터가 있으므로 자유도를 (M/(M-1)*(N-1)/(N-K)으로 수정하고 싶습니다.

StackOverflow에서 [1, 2]의 유사한 문제와 CrossValidated의 관련 문제 [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이라는 회귀 변수를 클러스터 변수로 사용합니다 (내 데이터의 데이터 이름을 지정했습니다). 내가 분산을 위해 (위의 공식 clx 참조) UJ 을 계산하고자 할 때

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이 분산에 사용 된 경우 NAs 결과 만 나타납니다. 내 데이터는 특별한 구조 일 수 있고, 내가 문제를 알아낼 수 없기 때문에

내 데이터

, 나는 핫메일에서 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(data) 수익을 무엇
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 ... 

?

+0

귀하의 노력과 답변에 많은 감사를드립니다! 내'str (data)'는'DS_CODE'의 경우 * Factor *를, DNEW의 경우 * int *를 반환합니다. 다른 모든 결과는 동일합니다. 그러나 이것은 가장 이상한 것입니다. * 축소 된 데이터 세트를 사용하면 작동합니다 (다른 작은 varialbes 및 R 행 번호가없는 작은 데이터 세트 만 제공). 큰 세트를 가지고, 나는 * uj * 계산에서'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 

은 다음을 참조하십시오

은 참조 :