2014-01-24 14 views
82

Stargazer produziert sehr schöne Latex-Tabellen für lm (und andere) Objekte. Angenommen, ich habe ein Modell mit maximaler Wahrscheinlichkeit angepasst. Ich möchte, dass Stargazer einen lm-ähnlichen Tisch für meine Schätzungen produziert. Wie kann ich das machen?Erhalten von Koeffizienten, die durch maximale Wahrscheinlichkeit in eine Stargazer-Tabelle geschätzt werden

Obwohl es ein bisschen hacky ist, könnte ein Weg sein, ein "gefälschtes" LM-Objekt zu erstellen, das meine Schätzungen enthält - ich denke, das würde so lange funktionieren, wie eine Zusammenfassung (mein.Fakes.lm.Objekt) funktioniert. Ist das leicht machbar?

Ein Beispiel:

library(stargazer) 

N <- 200 
df <- data.frame(x=runif(N, 0, 50)) 
df$y <- 10 + 2 * df$x + 4 * rt(N, 4) # True params 
plot(df$x, df$y) 

model1 <- lm(y ~ x, data=df) 
stargazer(model1, title="A Model") # I'd like to produce a similar table for the model below 

ll <- function(params) { 
    ## Log likelihood for y ~ x + student's t errors 
    params <- as.list(params) 
    return(sum(dt((df$y - params$const - params$beta*df$x)/params$scale, df=params$degrees.freedom, log=TRUE) - 
       log(params$scale))) 
} 

model2 <- optim(par=c(const=5, beta=1, scale=3, degrees.freedom=5), lower=c(-Inf, -Inf, 0.1, 0.1), 
       fn=ll, method="L-BFGS-B", control=list(fnscale=-1), hessian=TRUE) 
model2.coefs <- data.frame(coefficient=names(model2$par), value=as.numeric(model2$par), 
          se=as.numeric(sqrt(diag(solve(-model2$hessian))))) 

stargazer(model2.coefs, title="Another Model", summary=FALSE) # Works, but how can I mimic what stargazer does with lm objects? 

genauer zu sein: mit lm Objekten, stargazerlilie die abhängige Variable druckt gut an der Spitze der Tabelle, SEs umfasst unterhalb der entsprechenden Schätzwerte in Klammern, und hat die R^2 und Anzahl der Beobachtungen am unteren Ende der Tabelle. Gibt es einen (einfachen) Weg, um das gleiche Verhalten mit einem "benutzerdefinierten" Modell zu erreichen, das wie oben beschrieben mit maximaler Wahrscheinlichkeit geschätzt wird?

Hier sind meine schwachen Versuche an meinen optim Ausgang als lm Objekt Verkleiden:

model2.lm <- list() # Mimic an lm object 
class(model2.lm) <- c(class(model2.lm), "lm") 
model2.lm$rank <- model1$rank # Problematic? 
model2.lm$coefficients <- model2$par 
names(model2.lm$coefficients)[1:2] <- names(model1$coefficients) 
model2.lm$fitted.values <- model2$par["const"] + model2$par["beta"]*df$x 
model2.lm$residuals <- df$y - model2.lm$fitted.values 
model2.lm$model <- df 
model2.lm$terms <- model1$terms # Problematic? 
summary(model2.lm) # Not working 
+5

Ich habe versucht, ähnlich mit dem 'texreg' Paket. Aufgrund der Faulheit habe ich die Koeffizienten und Standardfehler eines anderen Modells überschrieben, was mir die gewünschte Ausgabe lieferte. In Ihrem Fall könnten Sie z.B. Überschreiben Sie die Koeffizienten und Standardfehler von 'model1'. Dies ist zwar keine ausgeklügelte Lösung, aber es sollte funktionieren. Unnötig zu sagen, dass ich gespannt bin, ob es bessere Lösungen gibt ... – coffeinjunky

+1

Sie können sich die Stargazer-Funktion ansehen, die mit 'stargazer :::. Stargazer.wrap' schwer belastet. Es sieht aus wie ein Container mit einer Reihe anderer Funktionen zusätzlich zu dem Code, der die Tabellen formatiert. Und es sieht so aus, als ob es einige Komponenten für 'lm' (und' glm') auswertet, die es sehr schwer machen würden, Ihre 'optim()' Ergebnisse zu verkleiden. – andybega

+3

In '' texreg'' würde es ausreichen, ein '' texreg''-Objekt mit Hilfe der Funktion 'createTexreg'' zu erstellen. Du gibst im Grunde nur die Koeffizienten, SEs usw. aus. Siehe '' createTexreg''. Das "texreg" -Objekt kann dann in die Funktionen "texreg", "htmlreg", "screenreg" und "plot reg" eingegeben werden. Alternativ beschreibt Abschnitt 6 des JSS-Artikels das Schreiben und Registrieren von Methoden für neue Modelltypen, falls Sie die gleiche Vorlage später wiederverwenden möchten. –

Antwort

0

Ich weiß nicht, wie engagiert Sie mit Stargazer ist, aber Sie können versuchen, die Besen und die XTABLE Pakete, das Problem ist, dass es Ihnen die Standardfehler für die Optim Modell

library(broom) 
library(xtable) 
xtable(tidy(model1)) 
xtable(tidy(model2)) 
1

ich habe nur dieses Problem nicht geben wird, die und überwanden dies durch die Verwendung des coefse und omit Funktionen innerhalb stargazer .. . z.B

stargazer(regressions, ... 
        coef = list(... list of coefs...), 
        se = list(... list of standard errors...), 
        omit = c(sequence), 
        covariate.labels = c("new names"), 
        dep.var.labels.include = FALSE, 
        notes.append=FALSE), file="") 
1

Sie müssen zuerst ein Dummy lm Objekt instanziiert, kleiden sie dann nach oben:

#... 
model2.lm = lm(y ~ ., data.frame(y=runif(5), beta=runif(5), scale=runif(5), degrees.freedom=runif(5))) 
model2.lm$coefficients <- model2$par 
model2.lm$fitted.values <- model2$par["const"] + model2$par["beta"]*df$x 
model2.lm$residuals <- df$y - model2.lm$fitted.values 
stargazer(model2.lm, se = list(model2.coefs$se), summary=FALSE, type='text') 

# =============================================== 
#       Dependent variable:  
#      --------------------------- 
#         y    
# ----------------------------------------------- 
# const      10.127***   
#        (0.680)   
#             
# beta       1.995***   
#        (0.024)   
#             
# scale      3.836***   
#        (0.393)   
#             
# degrees.freedom    3.682***   
#        (1.187)   
#             
# ----------------------------------------------- 
# Observations     200    
# R2        0.965   
# Adjusted R2     0.858   
# Residual Std. Error  75.581 (df = 1)  
# F Statistic    9.076 (df = 3; 1)  
# =============================================== 
# Note:    *p<0.1; **p<0.05; ***p<0.01 

etw (und dann natürlich sicherstellen, dass die verbleibenden Zusammenfassung Statistiken korrekt sind)