Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get coefficients estimated by maximum likelihood into a stargazer table

Stargazer produces very nice latex tables for lm (and other) objects. Suppose I've fit a model by maximum likelihood. I'd like stargazer to produce a lm-like table for my estimates. How can I do this?

Although it's a bit hacky, one way might be to create a "fake" lm object containing my estimates -- I think this would work as long as summary(my.fake.lm.object) works. Is that easily doable?

An example:

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? 

To be more precise: with lm objects, stargazer nicely prints the dependent variable at the top of the table, includes SEs in parentheses below the corresponding estimates, and has the R^2 and number of observations at the bottom of the table. Is there a(n easy) way to obtain the same behavior with a "custom" model estimated by maximum likelihood, as above?

Here are my feeble attempts at dressing up my optim output as a lm object:

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 
like image 436
Adrian Avatar asked Jan 24 '14 17:01

Adrian


People also ask

How do you get a stargazer table in R?

This can be done by typing “install. packages(“stargazer”)”, and then “library(stargazer)” in the next line. Installing Stargazer will only need to be done once, but the second command, which loads the package will need to be typed each session you wish to use it.

What is a stargazer table?

stargazer is an R package that creates LATEX code, HTML code and ASCII text for well-formatted regression tables, with multiple models side-by-side, as well as for summary statistics tables, data frames, vectors and matrices.

How does Stargazer work r?

The stargazer command produces LaTeX code, HTML code and ASCII text for well-formatted tables that hold regression analysis results from several models side-by-side. It can also output summary statistics and data frame content. stargazer supports a large number model objects from a variety of packages.

How do you make a stargazer table smaller?

To adjust table size with stargazer, you can change the font size font. size= , make the Stargazer single row single. row = TRUE and change the space between columns column.


2 Answers

I was just having this problem and overcame this through the use of the coef se, and omit functions within stargazer... e.g.

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="") 
like image 119
BenD Avatar answered Nov 02 '22 06:11

BenD


You need to first instantiate a dummy lm object, then dress it up:

#... 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 

(and then of course make sure the remaining summary stats are correct)

like image 38
luffe Avatar answered Nov 02 '22 06:11

luffe