Stargazer produce tablas de látex muy agradables para objetos lm (y otros). Supongamos que encajo en un modelo por máxima probabilidad. Me gustaría que Stargazer produjera una tabla parecida a una película para mis estimaciones. ¿Cómo puedo hacer esto?
Aunque es un poco hacky, una forma podría ser crear un objeto lm "falso" que contenga mis estimaciones; creo que esto funcionaría siempre que el resumen (my.fake.lm.object) funcione. ¿Es eso fácilmente factible?
Un ejemplo:
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?
Para ser más precisos: con objetos lm, Stargazer imprime muy bien la variable dependiente en la parte superior de la tabla, incluye SE entre paréntesis debajo de las estimaciones correspondientes y tiene el R ^ 2 y el número de observaciones en la parte inferior de la tabla. ¿Existe una manera (n fácil) de obtener el mismo comportamiento con un modelo "personalizado" estimado por máxima verosimilitud, como el anterior?
Aquí están mis débiles intentos de disfrazar mi salida óptima como un objeto lm:
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
fuente
texreg
paquete. Debido a la pereza, terminé sobrescribiendo los coeficientes y errores estándar de un modelo diferente, lo que me dio el resultado deseado. En su caso, podría, por ejemplo, sobrescribir los coeficientes y errores estándar demodel1
. Si bien esta no es una solución sofisticada, debería funcionar. Ni que decir tiene, tengo curiosidad para ver si algunas soluciones mejores vienen ...stargazer:::.stargazer.wrap
. Parece un contenedor con muchas otras funciones además del código que formatea las tablas. Y parece que evalúa bastantes componentes paralm
(yglm
) que harían muy difícil disfrazar susoptim()
resultados.texreg
, sería suficiente crear untexreg
objeto utilizando lacreateTexreg
función. Básicamente, solo entrega los coeficientes, SE, etc. Vea?createTexreg
. Eltexreg
objeto puede ser alimentado en eltexreg
,htmlreg
,screenreg
, yplotreg
funciones. Alternativamente, la sección 6 del artículo de JSS describe cómo escribir y registrar métodos para nuevos tipos de modelos en caso de que desee reciclar la misma plantilla más adelante.Respuestas:
Estaba teniendo este problema y lo superé mediante el uso de las funciones
coef
se
, yomit
dentro de Stargazer ...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="")
fuente
Primero debe crear una instancia de un
lm
objeto ficticio y luego disfrazarlo:#... 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
(y luego, por supuesto, asegúrese de que las estadísticas de resumen restantes sean correctas)
fuente
No sé qué tan comprometido está con el uso de stargazer, pero puede intentar usar los paquetes broom y xtable, el problema es que no le dará los errores estándar para el modelo optim
library(broom) library(xtable) xtable(tidy(model1)) xtable(tidy(model2))
fuente