Newey-West standard errors with Mean Groups/Fama-MacBeth estimator

前端 未结 1 1266
忘了有多久
忘了有多久 2020-12-25 13:46

I\'m trying to get Newey-West standard errors to work with the output of pmg() (Mean Groups/Fama-MacBeth estimator) from the plm package.

F

相关标签:
1条回答
  • 2020-12-25 14:19

    Currently this is impossible with plm package.

    However, you could just create them yourself.

    Suppose you have:

    fpmg <- pmg(y~x, test, index = c('year', 'firmid'))
    fpmg.coefficients <- fpmg$coefficients
    # (Intercept)            x 
    #  0.03127797   1.03558610 
    
    coeftest(fpmg)
    #             Estimate Std. Error t value Pr(>|t|)    
    # (Intercept) 0.031278   0.023356  1.3392   0.1806    
    # x           1.035586   0.033342 31.0599   <2e-16 ***
    

    Then you can simply create the estimators yourself like in:

    the.years <- unique(test$year)
    a.formula <- y ~ x
    
    
    first.step <-  lapply(the.years, function(a.year) {
                    temp.data <- test[test$year == a.year, ]
                    an.lm <- lm(a.formula, data = temp.data)
                    the.coefficients <- an.lm$coef
                    the.results <- as.data.frame(cbind(a.year, t(the.coefficients)))
                    the.results
                    }) 
    
    first.step.df <- do.call('rbind', first.step)
    
    second.step.coefficients <- apply(first.step.df[, -1], 2, mean)
    second.step.coefficients
    # (Intercept)           x 
    #  0.03127797  1.03558610 
    
    identical(fpmg.coefficients, second.step.coefficients)
    # [1] TRUE
    

    Check that they are identical both ways just in case. Last, you can obtain the Newey-West (1987) with one lag adjusted t-statistics for the means with:

    library(sandwich)
    second.step.NW.sigma.sq <- apply(first.step.df[, -1], 2, 
                                 function(x) sqrt(NeweyWest(lm(x ~ 1), 
                                   lag = 1, prewhite = FALSE)['(Intercept)',       
                                     '(Intercept)']))
    second.step.NW.sigma.sq
    #  (Intercept)            x 
    #   0.02438398   0.02859447
    t.statistics.NW.lag.1 <- second.step.coefficients / second.step.NW.sigma.sq
    
    t.statistics.NW.lag.1
    # (Intercept)           x 
    #    1.282726   36.216301
    

    Update

    In my answer, I had only included the "manual" calculation of the t-statistic, because it is computationally faster. A more generic solution is to calculcate the Newey-West corrected t-statistics and their p-values with the coeftest() function of the lmtest package.

    coeftest(lm(first.step.df$'(Intercept)' ~ 1), vcov = NeweyWest(lm(first.step.df$'(Intercept)' ~ 1), lag = 1, prewhite = FALSE))
    # t test of coefficients:
    #             Estimate Std. Error t value Pr(>|t|)
    # (Intercept) 0.031278   0.024384  1.2827   0.2316
    coeftest(lm(first.step.df$x ~ 1), vcov = NeweyWest(lm(first.step.df$x ~ 1), lag = 1, prewhite = FALSE))
    # t test of coefficients:
    #             Estimate Std. Error t value  Pr(>|t|)    
    # (Intercept) 1.035586   0.028594  36.216 4.619e-11 ***
    
    0 讨论(0)
提交回复
热议问题