R: Robust SE's and model diagnostics in stargazer table

前端 未结 1 931
闹比i
闹比i 2020-12-09 00:01

I try to put some 2SLS regression outputs generated via ivreg() from the AER package into a Latex document using the stargazer package. I have a couple of prob

相关标签:
1条回答
  • 2020-12-09 00:57

    Here's one way to do what you want:

    require(lmtest)
    
    rob.fit1        <- coeftest(fit1, function(x) vcovHC(x, type="HC0"))
    rob.fit2        <- coeftest(fit2, function(x) vcovHC(x, type="HC0"))
    summ.fit1 <- summary(fit1, vcov. = function(x) vcovHC(x, type="HC0"), diagnostics=T)
    summ.fit2 <- summary(fit2, vcov. = function(x) vcovHC(x, type="HC0"), diagnostics=T)
    
    stargazer(fit1, fit2, type = "text", 
              se = list(rob.fit1[,"Std. Error"], rob.fit2[,"Std. Error"]), 
              add.lines = list(c(rownames(summ.fit1$diagnostics)[1], 
                                 round(summ.fit1$diagnostics[1, "p-value"], 2), 
                                 round(summ.fit2$diagnostics[1, "p-value"], 2)), 
                               c(rownames(summ.fit1$diagnostics)[2], 
                                 round(summ.fit1$diagnostics[2, "p-value"], 2), 
                                 round(summ.fit2$diagnostics[2, "p-value"], 2)) ))
    

    Which will yield:

    ==========================================================
                                      Dependent variable:     
                                  ----------------------------
                                               y              
                                       (1)            (2)     
    ----------------------------------------------------------
    x                                 -1.222        -0.912    
                                     (1.672)        (1.002)   
    
    a                                 -0.240        -0.208    
                                     (0.301)        (0.243)   
    
    Constant                          9.662         8.450**   
                                     (6.912)        (4.222)   
    
    ----------------------------------------------------------
    Weak instruments                   0.45          0.56     
    Wu-Hausman                         0.11          0.18     
    Observations                       100            100     
    R2                                -4.414        -2.458    
    Adjusted R2                       -4.526        -2.529    
    Residual Std. Error (df = 97)     22.075        17.641    
    ==========================================================
    Note:                          *p<0.1; **p<0.05; ***p<0.01
    

    As you can see, this allows manually including the diagnostics in the respective models.


    You could automate this approach by creating a function that takes in a list of models (e.g. list(summ.fit1, summ.fit2)) and outputs the objects required by se or add.lines arguments.

    gaze.coeft <- function(x, col="Std. Error"){
        stopifnot(is.list(x))
        out <- lapply(x, function(y){
            y[ , col]
        })
        return(out)
    }
    gaze.coeft(list(rob.fit1, rob.fit2))
    gaze.coeft(list(rob.fit1, rob.fit2), col=2)
    

    Will both take in a list of coeftest objects, and yield the SEs vector as expected by se:

    [[1]]
    (Intercept)           x           a 
      6.9124587   1.6716076   0.3011226 
    
    [[2]]
    (Intercept)           x           a 
      4.2221491   1.0016012   0.2434801
    

    Same can be done for the diagnostics:

    gaze.lines.ivreg.diagn <- function(x, col="p-value", row=1:3, digits=2){
        stopifnot(is.list(x))
        out <- lapply(x, function(y){
            stopifnot(class(y)=="summary.ivreg")
            y$diagnostics[row, col, drop=FALSE]
        })
        out <- as.list(data.frame(t(as.data.frame(out)), check.names = FALSE))
        for(i in 1:length(out)){
            out[[i]] <- c(names(out)[i], round(out[[i]], digits=digits))
        }
        return(out)
    }
    gaze.lines.ivreg.diagn(list(summ.fit1, summ.fit2), row=1:2)
    gaze.lines.ivreg.diagn(list(summ.fit1, summ.fit2), col=4, row=1:2, digits=2)
    

    Both calls will yield:

    $`Weak instruments`
    [1] "Weak instruments" "0.45"             "0.56"            
    
    $`Wu-Hausman`
    [1] "Wu-Hausman" "0.11"       "0.18"      
    

    Now the stargazer() call becomes as simple as this, yielding identical output as above:

    stargazer(fit1, fit2, type = "text", 
          se = gaze.coeft(list(rob.fit1, rob.fit2)), 
          add.lines = gaze.lines.ivreg.diagn(list(summ.fit1, summ.fit2), row=1:2))
    
    0 讨论(0)
提交回复
热议问题