Unconditional Robust covariance matrix estimators a la Beck and Katz for panel models (a.k.a. Panel Corrected Standard Errors (PCSE)).

vcovBK(x, ...)

# S3 method for class 'plm'
vcovBK(
  x,
  type = c("HC0", "sss", "HC1", "HC2", "HC3", "HC4"),
  cluster = c("group", "time"),
  diagonal = FALSE,
  ...
)

Arguments

x

an object of class "plm",

...

further arguments.

type

the weighting scheme used, one of "HC0", "sss", "HC1", "HC2", "HC3", "HC4", see Details,

cluster

one of "group", "time",

diagonal

a logical value specifying whether to force non-diagonal elements to zero,

Value

An object of class "matrix" containing the estimate of the covariance matrix of coefficients.

Details

vcovBK is a function for estimating a robust covariance matrix of parameters for a panel model according to the Beck and Katz (1995) method, a.k.a. Panel Corrected Standard Errors (PCSE), which uses an unconditional estimate of the error covariance across time periods (groups) inside the standard formula for coefficient covariance. Observations may be clustered either by "group" to account for timewise heteroskedasticity and serial correlation or by "time" to account for cross-sectional heteroskedasticity and correlation. It must be borne in mind that the Beck and Katz formula is based on N- (T-) asymptotics and will not be appropriate elsewhere.

The diagonal logical argument can be used, if set to TRUE, to force to zero all non-diagonal elements in the estimated error covariances; this is appropriate if both serial and cross–sectional correlation are assumed out, and yields a timewise- (groupwise-) heteroskedasticity–consistent estimator.

Weighting schemes specified by type are analogous to those in sandwich::vcovHC() in package sandwich and are justified theoretically (although in the context of the standard linear model) by MacKinnon and White (1985) and Cribari–Neto (2004) (see Zeileis 2004) .

The main use of vcovBK (and the other variance-covariance estimators provided in the package vcovHC, vcovNW, vcovDC, vcovSCC) is to pass it to plm's own functions like summary, pwaldtest, and phtest or together with testing functions from the lmtest and car packages. All of these typically allow passing the vcov or vcov. parameter either as a matrix or as a function, e.g., for Wald–type testing: argument vcov. to coeftest(), argument vcov to waldtest() and other methods in the lmtest package; and argument vcov. to linearHypothesis() in the car package (see the examples), see (see also Zeileis 2004) , 4.1-2, and examples below.

References

Beck N, Katz JN (1995). “What to do (and not to do) with time-series cross-section data.” American Political Science Review, 89(03), 634–647.

Cribari–Neto F (2004). “Asymptotic Inference Under Heteroskedasticity of Unknown Form.” Computational Statistics & Data Analysis, 45, 215–233.

Greene WH (2003). Econometric Analysis, 5th edition. Prentice Hall.

MacKinnon JG, White H (1985). “Some Heteroskedasticity–Consistent Covariance Matrix Estimators With Improved Finite Sample Properties.” Journal of Econometrics, 29, 305–325.

Zeileis A (2004). “Econometric Computing With HC and HAC Covariance Matrix Estimators.” Journal of Statistical Software, 11(10), 1–17. https://www.jstatsoft.org/article/view/v011i10.

See also

sandwich::vcovHC() from the sandwich package for weighting schemes (type argument).

Author

Giovanni Millo

Examples


data("Produc", package="plm")
zz <- plm(log(gsp)~log(pcap)+log(pc)+log(emp)+unemp, data=Produc, model="random")
summary(zz, vcov = vcovBK)
#> Oneway (individual) effect Random Effect Model 
#>    (Swamy-Arora's transformation)
#> 
#> Note: Coefficient variance-covariance matrix supplied: vcovBK
#> 
#> Call:
#> plm(formula = log(gsp) ~ log(pcap) + log(pc) + log(emp) + unemp, 
#>     data = Produc, model = "random")
#> 
#> Balanced Panel: n = 48, T = 17, N = 816
#> 
#> Effects:
#>                    var  std.dev share
#> idiosyncratic 0.001454 0.038137 0.175
#> individual    0.006838 0.082691 0.825
#> theta: 0.8888
#> 
#> Residuals:
#>       Min.    1st Qu.     Median    3rd Qu.       Max. 
#> -0.1067230 -0.0245520 -0.0023694  0.0217333  0.1996307 
#> 
#> Coefficients:
#>               Estimate Std. Error z-value  Pr(>|z|)    
#> (Intercept)  2.1354110  0.2562311  8.3339 < 2.2e-16 ***
#> log(pcap)    0.0044386  0.0494249  0.0898 0.9284424    
#> log(pc)      0.3105484  0.0427824  7.2588 3.906e-13 ***
#> log(emp)     0.7296705  0.0497995 14.6522 < 2.2e-16 ***
#> unemp       -0.0061725  0.0017190 -3.5908 0.0003296 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
#> Total Sum of Squares:    29.209
#> Residual Sum of Squares: 1.1879
#> R-Squared:      0.95933
#> Adj. R-Squared: 0.95913
#> Chisq: 4175.52 on 4 DF, p-value: < 2.22e-16
summary(zz, vcov = function(x) vcovBK(x, type="HC1"))
#> Oneway (individual) effect Random Effect Model 
#>    (Swamy-Arora's transformation)
#> 
#> Note: Coefficient variance-covariance matrix supplied: function(x) vcovBK(x, type = "HC1")
#> 
#> Call:
#> plm(formula = log(gsp) ~ log(pcap) + log(pc) + log(emp) + unemp, 
#>     data = Produc, model = "random")
#> 
#> Balanced Panel: n = 48, T = 17, N = 816
#> 
#> Effects:
#>                    var  std.dev share
#> idiosyncratic 0.001454 0.038137 0.175
#> individual    0.006838 0.082691 0.825
#> theta: 0.8888
#> 
#> Residuals:
#>       Min.    1st Qu.     Median    3rd Qu.       Max. 
#> -0.1067230 -0.0245520 -0.0023694  0.0217333  0.1996307 
#> 
#> Coefficients:
#>               Estimate Std. Error z-value  Pr(>|z|)    
#> (Intercept)  2.1354110  0.2570198  8.3084 < 2.2e-16 ***
#> log(pcap)    0.0044386  0.0495770  0.0895 0.9286614    
#> log(pc)      0.3105484  0.0429141  7.2365 4.604e-13 ***
#> log(emp)     0.7296705  0.0499528 14.6072 < 2.2e-16 ***
#> unemp       -0.0061725  0.0017242 -3.5798 0.0003439 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
#> Total Sum of Squares:    29.209
#> Residual Sum of Squares: 1.1879
#> R-Squared:      0.95933
#> Adj. R-Squared: 0.95913
#> Chisq: 4149.93 on 4 DF, p-value: < 2.22e-16

## standard coefficient significance test
library(lmtest)
#> Loading required package: zoo
#> 
#> Attaching package: ‘zoo’
#> The following objects are masked from ‘package:base’:
#> 
#>     as.Date, as.Date.numeric
coeftest(zz)
#> 
#> t test of coefficients:
#> 
#>                Estimate  Std. Error t value  Pr(>|t|)    
#> (Intercept)  2.13541100  0.13346149 16.0002 < 2.2e-16 ***
#> log(pcap)    0.00443859  0.02341732  0.1895    0.8497    
#> log(pc)      0.31054843  0.01980475 15.6805 < 2.2e-16 ***
#> log(emp)     0.72967053  0.02492022 29.2803 < 2.2e-16 ***
#> unemp       -0.00617247  0.00090728 -6.8033 1.986e-11 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
## robust significance test, cluster by group
## (robust vs. serial correlation), default arguments
coeftest(zz, vcov.=vcovBK)
#> 
#> t test of coefficients:
#> 
#>               Estimate Std. Error t value  Pr(>|t|)    
#> (Intercept)  2.1354110  0.2562311  8.3339 3.327e-16 ***
#> log(pcap)    0.0044386  0.0494249  0.0898 0.9284646    
#> log(pc)      0.3105484  0.0427824  7.2588 9.153e-13 ***
#> log(emp)     0.7296705  0.0497995 14.6522 < 2.2e-16 ***
#> unemp       -0.0061725  0.0017190 -3.5908 0.0003495 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
## idem with parameters, pass vcov as a function argument
coeftest(zz, vcov.=function(x) vcovBK(x, type="HC1"))
#> 
#> t test of coefficients:
#> 
#>               Estimate Std. Error t value  Pr(>|t|)    
#> (Intercept)  2.1354110  0.2570198  8.3084 4.059e-16 ***
#> log(pcap)    0.0044386  0.0495770  0.0895 0.9286835    
#> log(pc)      0.3105484  0.0429141  7.2365 1.068e-12 ***
#> log(emp)     0.7296705  0.0499528 14.6072 < 2.2e-16 ***
#> unemp       -0.0061725  0.0017242 -3.5798 0.0003643 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
## idem, cluster by time period
## (robust vs. cross-sectional correlation)
coeftest(zz, vcov.=function(x) vcovBK(x, type="HC1", cluster="time"))
#> 
#> t test of coefficients:
#> 
#>               Estimate Std. Error t value  Pr(>|t|)    
#> (Intercept)  2.1354110  0.2776015  7.6924 4.188e-14 ***
#> log(pcap)    0.0044386  0.0395528  0.1122 0.9106772    
#> log(pc)      0.3105484  0.0458243  6.7769 2.360e-11 ***
#> log(emp)     0.7296705  0.0562371 12.9749 < 2.2e-16 ***
#> unemp       -0.0061725  0.0018531 -3.3309 0.0009049 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
## idem with parameters, pass vcov as a matrix argument
coeftest(zz, vcov.=vcovBK(zz, type="HC1"))
#> 
#> t test of coefficients:
#> 
#>               Estimate Std. Error t value  Pr(>|t|)    
#> (Intercept)  2.1354110  0.2570198  8.3084 4.059e-16 ***
#> log(pcap)    0.0044386  0.0495770  0.0895 0.9286835    
#> log(pc)      0.3105484  0.0429141  7.2365 1.068e-12 ***
#> log(emp)     0.7296705  0.0499528 14.6072 < 2.2e-16 ***
#> unemp       -0.0061725  0.0017242 -3.5798 0.0003643 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
## joint restriction test
waldtest(zz, update(zz, .~.-log(emp)-unemp), vcov=vcovBK)
#> Wald test
#> 
#> Model 1: log(gsp) ~ log(pcap) + log(pc) + log(emp) + unemp
#> Model 2: log(gsp) ~ log(pcap) + log(pc)
#>   Res.Df Df  Chisq Pr(>Chisq)    
#> 1    811                         
#> 2    813 -2 411.05  < 2.2e-16 ***
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
if (FALSE) { # \dontrun{
## test of hyp.: 2*log(pc)=log(emp)
library(car)
linearHypothesis(zz, "2*log(pc)=log(emp)", vcov.=vcovBK)
} # }