将最大似然估计得到的系数放入stargazer表格中

86

Stargazer可以为lm(和其他)对象生成非常漂亮的latex表格。假设我已经通过最大似然拟合了一个模型。我想让stargazer为我的估计值生成类似于lm的表格。我该怎么做?

虽然有点hacky,但一种方法可能是创建一个“假”的lm对象,其中包含我的估计值--只要summary(my.fake.lm.object)起作用,我认为这将起作用。这容易做到吗?

例如:

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?

更确切地说:使用lm对象,stargazer可以在表格顶部漂亮地打印出因变量,在相应的估计值下方用括号包含SEs,并在表格底部显示R^2和观测数量。是否有一种(简单)方法可以获得与上述相同的行为,即使用最大似然估计的“自定义”模型?
以下是我试图将我的优化输出装扮成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

6
我曾尝试使用“texreg”软件包进行类似的操作。 由于懒惰,我最终覆盖了另一个模型的系数和标准误差,从而得到了期望的输出结果。 在您的情况下,您可以覆盖“model1”的系数和标准误差。 虽然这不是一个复杂的解决方案,但应该有效。 不用说,我很好奇是否会有更好的解决方案出现... - coffeinjunky
1
你可以查看一下 stargazer 函数,它使用 stargazer:::.stargazer.wrap 来完成繁重的工作。它看起来像一个容器,除了格式化表格的代码之外,还有许多其他函数。而且它似乎评估了许多 lm(和 glm)的组件,这会使得你很难美化你的 optim() 结果。 - andybega
3
texreg中,只需要使用createTexreg函数创建一个texreg对象即可。你只需简单地输入系数、标准误等信息。请参见?createTexreg。然后,可以将texreg对象传递给texreghtmlregscreenregplotreg函数。或者,JSS文章的第6节描述了如何编写和注册新模型类型的方法,以便在以后重新使用相同的模板。 - Philip Leifeld
3个回答

2

我之前遇到了这个问题,通过在stargazer中使用coefseomit函数,我成功解决了这个问题...例如:

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

您需要先实例化一个虚拟的lm对象,然后对其进行设置:

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

(然后当然要确保剩余的汇总统计数据是正确的)

0

我不知道您有多么致力于使用stargazer,但您可以尝试使用broom和xtable软件包,问题是它不会为优化模型提供标准错误。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接