2015-10-09 5 views
6

Ich versuche einige 2SLS Regressionsausgaben, die über ivreg erzeugt wurden, aus dem VRE-Paket in ein Latex-Dokument unter Verwendung des Stargazer-Pakets zu setzen. Ich habe jedoch ein paar Probleme, die ich nicht lösen kann.
1. Ich kann nicht herausfinden, wie die Modelldiagnose eingefügt wird, wie in der Zusammenfassung von ivreg beschrieben. Nämlich schwache Instrumententests, Wu-Hausmann und Sargan Test. Ich möchte sie mit den Statistiken haben, die normalerweise unter der Tabelle berichtet werden, wie Anzahl der Beobachtungen, R im Quadrat und Resid. SE. Die Stargazer-Funktion scheint kein Argument zu haben, wo Sie eine Liste mit zusätzlichen Diagnosen bereitstellen können. Ich habe das nicht in mein Beispiel gebracht, weil ich ehrlich keine Ahnung habe, wo ich anfangen soll.
2. Ich möchte die normalen Standardfehler durch robuste Standardfehler ersetzen, und die einzige Möglichkeit, dies zu tun, besteht darin, Objekte mit robusten Standardfehlern zu erzeugen und sie in der Stargazer-Funktion mit se = list() hinzuzufügen. Ich habe dies in das unten stehende Beispiel für die Mindestarbeitszeit aufgenommen. Gibt es vielleicht eine elegantere Möglichkeit, dies zu programmieren oder das Modell zu reversieren und es mit robusten Standardfehlern zu speichern? Hilfe geschätzt.R: Robuste SEs und Modelldiagnose in Stargazer Tabelle

library(AER) 
library(stargazer) 

y <- rnorm(100, 5, 10) 
x <- rnorm(100, 3, 15) 
z <- rnorm(100, 3, 7) 
a <- rnorm(100, 1, 7) 
b <- rnorm(100, 3, 5) 

# Fitting IV models 
fit1 <- ivreg(y ~ x + a | 
      a + z, 
      model = TRUE) 
fit2 <- ivreg(y ~ x + a | 
      a + b + z, 
      model = TRUE) 

# Here are the se's and the diagnostics i want 
summary(fit1, vcov = sandwich, diagnostics=T) 
summary(fit2, vcov = sandwich, diagnostics=T) 

# Getting robust se's, i think HC0 is the standard 
# used with "vcov=sandwich" from the above summary 
cov1  <- vcovHC(fit1, type = "HC0") 
robust1  <- sqrt(diag(cov1)) 
cov2  <- vcovHC(fit2, type = "HC0") 
robust2  <- sqrt(diag(cov1)) 

# Create latex table 
stargazer(fit1, fit2, type = "latex", se=list(robust1, robust2)) 
+0

Verwandte: https://stackoverflow.com/questions/44318860/r-stargazer-manually-specify-r2-and -Write-to-Tex –

Antwort

4

Hier ist eine Art und Weise zu tun, was Sie wollen:

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)))) 

Welche ergeben wird:

========================================================== 
            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 

Wie Sie sehen können, ist dies die Diagnose auch in den jeweiligen Modellen manuell ermöglicht.


Man könnte diesen Ansatz automatisieren, indem eine Funktion zu schaffen, die durch se oder add.lines Argumente in einer Liste der Modelle (z.B. list(summ.fit1, summ.fit2)) und gibt die erforderlichen Objekte erfolgt.

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) 

Dauert beide in einem list von coeftest Objekte und ergeben den SEs Vektor, wie von se erwartet:

[[1]] 
(Intercept)   x   a 
    6.9124587 1.6716076 0.3011226 

[[2]] 
(Intercept)   x   a 
    4.2221491 1.0016012 0.2434801 

Das Gleiche gilt für die Diagnose durchgeführt werden kann:

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 Anrufe führen zu:

$`Weak instruments` 
[1] "Weak instruments" "0.45"    "0.56"    

$`Wu-Hausman` 
[1] "Wu-Hausman" "0.11"  "0.18"  

Nun ist der stargazer() Anruf wird so einfach wie diese, wie oben identischen Ausgang wodurch man

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)) 
Verwandte Themen