Двойные кластерные стандартные ошибки для данных панели - PullRequest
7 голосов
/ 05 декабря 2011

У меня есть набор данных панели в R (время и сечение), и я хотел бы вычислить стандартные ошибки, которые сгруппированы по двум измерениям, потому что мои остатки коррелированы в обоих направлениях.Погуглив, я нашел http://thetarzan.wordpress.com/2011/06/11/clustered-standard-errors-in-r/, который предоставляет функцию для этого.Кажется, это немного нерегулярно, поэтому я хотел знать, есть ли пакет, который был протестирован, и делает ли это?

Я знаю, sandwich делает стандартные ошибки HAC, но не выполняет двойную кластеризацию (то есть по двум измерениям).

Ответы [ 3 ]

6 голосов
/ 24 июня 2012

Для панельных регрессий пакет plm может оценивать кластеризованные SE по двум измерениям.

Использование M.Результаты теста Петерсена :

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

##Double-clustering formula (Thompson, 2011)
vcovDC <- function(x, ...){
    vcovHC(x, cluster="group", ...) + vcovHC(x, cluster="time", ...) - 
        vcovHC(x, method="white1", ...)
}

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

Так что теперь вы можете получить кластеризованные SE:

##Clustered by *group*
> coeftest(fpm, vcov=function(x) vcovHC(x, cluster="group", type="HC1"))

t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.029680   0.066952  0.4433   0.6576    
x           1.034833   0.050550 20.4714   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

##Clustered by *time*
> coeftest(fpm, vcov=function(x) vcovHC(x, cluster="time", type="HC1"))

t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.029680   0.022189  1.3376   0.1811    
x           1.034833   0.031679 32.6666   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

##Clustered by *group* and *time*
> coeftest(fpm, vcov=function(x) vcovDC(x, type="HC1"))

t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.029680   0.064580  0.4596   0.6458    
x           1.034833   0.052465 19.7243   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Подробнее см .:


Однако вышеприведенное работает только в том случае, если ваши данные могут быть приведены к pdata.frame.Это не удастся, если у вас есть "duplicate couples (time-id)".В этом случае вы все еще можете кластеризоваться, но только по одному измерению.

Обмани plm, думая, что у вас есть правильный набор данных панели, указав только one index:

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

Так что теперь вы можете получить кластеризованные SE:

##Clustered by *group*
> coeftest(fpm.tr, vcov=function(x) vcovHC(x, cluster="group", type="HC1"))

t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.029680   0.066952  0.4433   0.6576    
x           1.034833   0.050550 20.4714   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Этот обходной путь также можно использовать для кластеризации по более высокому измерению или более высокому уровню (например, industry или country).Однако в этом случае вы не сможете использовать group (или time) effects, который является основным пределом подхода.


Другой подход, который работает для обоихПанель и другие типы данных - это пакет multiwayvcov.Это позволяет двойную кластеризацию, но также кластеризацию в более высоких измерениях.Согласно веб-сайту пакетов , это улучшило код Араи:

  • Прозрачная обработка замечаний, пропущенных из-за отсутствия
  • Полный многоход(или n-сторонняя, или n-мерная, или многомерная) кластеризация

Использование данных Петерсена и cluster.vcov():

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

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

coeftest(m1, vcov=function(x) cluster.vcov(x, petersen[ , c("firmid", "year")]))
## 
## t test of coefficients:
## 
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.029680   0.065066  0.4561   0.6483    
## x           1.034833   0.053561 19.3206   <2e-16 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
5 голосов
/ 05 декабря 2011

Функция Арай может использоваться для кластеризации стандартных ошибок. У него есть другая версия для кластеризации в нескольких измерениях:

mcl <- function(dat,fm, cluster1, cluster2){
          attach(dat, warn.conflicts = F)
          library(sandwich);library(lmtest)
          cluster12 = paste(cluster1,cluster2, sep="")
          M1  <- length(unique(cluster1))
          M2  <- length(unique(cluster2))   
          M12 <- length(unique(cluster12))
          N   <- length(cluster1)          
          K   <- fm$rank             
          dfc1  <- (M1/(M1-1))*((N-1)/(N-K))  
          dfc2  <- (M2/(M2-1))*((N-1)/(N-K))  
          dfc12 <- (M12/(M12-1))*((N-1)/(N-K))  
          u1j   <- apply(estfun(fm), 2, function(x) tapply(x, cluster1,  sum)) 
          u2j   <- apply(estfun(fm), 2, function(x) tapply(x, cluster2,  sum)) 
          u12j  <- apply(estfun(fm), 2, function(x) tapply(x, cluster12, sum)) 
          vc1   <-  dfc1*sandwich(fm, meat=crossprod(u1j)/N )
          vc2   <-  dfc2*sandwich(fm, meat=crossprod(u2j)/N )
          vc12  <- dfc12*sandwich(fm, meat=crossprod(u12j)/N)
          vcovMCL <- vc1 + vc2 - vc12
          coeftest(fm, vcovMCL)}

Ссылки и пример использования см .:

4 голосов
/ 05 декабря 2011

Пакет Фрэнка Харрелла rms (который раньше назывался Design) имеет функцию, которую я часто использую при кластеризации: robcov.

См. Эту часть ?robcov, например.

cluster: a variable indicating groupings. ‘cluster’ may be any type of
      vector (factor, character, integer).  NAs are not allowed.
      Unique values of ‘cluster’ indicate possibly correlated
      groupings of observations. Note the data used in the fit and
      stored in ‘fit$x’ and ‘fit$y’ may have had observations
      containing missing values deleted. It is assumed that if any
      NAs were removed during the original model fitting, an
      ‘naresid’ function exists to restore NAs so that the rows of
      the score matrix coincide with ‘cluster’. If ‘cluster’ is
      omitted, it defaults to the integers 1,2,...,n to obtain the
      "sandwich" robust covariance matrix estimate.
...