패널 데이터 회귀:강력한 표준 오류
-
12-12-2019 - |
문제
내 문제는 이것입니다 :나는 얻다 NA
견고한 표준 오류 계산에서 일부 값을 얻어야 합니다.
클러스터에 강력한 표준 오류를 사용하여 고정 효과 패널 회귀를 수행하려고 합니다.이를 위해 나는 다음을 따른다. 아라이 (2011) 누가 p.팔로우 3명 스톡/왓슨 (2006) (나중에 출판됨 계량경제학, 액세스 권한이 있는 사용자의 경우).자유도를 수정하고 싶습니다. (M/(M-1)*(N-1)/(N-K)
클러스터 수가 유한하고 데이터가 불균형하므로 하향 편향에 대비합니다.
유사한 문제가 이전에 게시되었습니다.1, 2] StackOverflow 및 관련 문제 [3] CrossValidated에 있습니다.
Arai(그리고 첫 번째 링크의 답변)는 함수에 다음 코드를 사용합니다(아래에 추가 의견과 함께 내 데이터를 제공합니다.):
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
내 클러스터 변수입니다(내 데이터 이름을 'data'로 지정했습니다).
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
위) 분산의 경우 처음에만 회귀 변수에 대한 일부 값을 얻은 다음 많은 0을 얻습니다.만약 이 입력이 uj 분산에만 사용됩니다. NAs
결과.
내 데이터
내 데이터가 특별한 구조로 되어 있을 수 있고 문제를 파악할 수 없기 때문에 전체 내용을 다음과 같이 게시합니다. 링크 핫메일에서.그 이유는 다른 데이터(Arai(2011)에서 가져온)에서는 내 문제가 발생하지 않기 때문입니다.지저분한 점 미리 죄송합니다만, 그럼에도 불구하고 봐주시면 정말 감사하겠습니다.파일은 순수 데이터만 포함하는 5mb .txt 파일입니다.
해결책
잠시 놀다가 나에게 효과가 있고 다음을 제공합니다.
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)
당신을 위해 반환?
다른 팁
그만큼 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
자세한 내용은 다음을 참조하세요.
또한보십시오: