【问题标题】:Get coefficients estimated by maximum likelihood into a stargazer table将最大似然估计的系数放入观星表中
【发布时间】:2014-02-15 19:05:00
【问题描述】:

Stargazer 为 lm (和其他)对象生成了非常好的乳胶表。假设我已经通过最大似然拟合了一个模型。我希望 stargazer 为我的估计生成一个类似 lm 的表。我该怎么做?

虽然它有点老套,但一种方法可能是创建一个包含我的估计的“假”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 可以在表格顶部很好地打印因变量,在相应估计值下方的括号中包括 SE,并在表格底部显示 R^2 和观察次数.如上所述,是否有一种(n 简单)方法可以通过最大似然估计的“自定义”模型获得相同的行为?

以下是我将 optim 输出修饰为 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

【问题讨论】:

  • 我已经尝试过与texreg 包类似的东西。由于懒惰,我最终覆盖了不同模型的系数和标准误差,这给了我想要的输出。在你的情况下,你可以例如覆盖model1 的系数和标准误。虽然这不是一个复杂的解决方案,但它应该可以工作。不用说,我很想知道是否有更好的解决方案出现......
  • 您可以使用stargazer:::.stargazer.wrap 来查看执行繁重工作的观星器功能。它看起来像一个容器,除了格式化表格的代码之外,还有许多其他功能。它似乎为lm(和glm)评估了很多组件,这使得你很难修饰你的optim()结果。
  • 在texreg 中,使用createTexreg 函数创建一个texreg 对象就足够了。您基本上只需交出系数、SE 等。请参阅?createTexreg。然后可以将texreg 对象输入texreg、htmlreg、screenreg 和plotreg 函数。或者,JSS 文章的第 6 节描述了如何为新模型类型编写和注册方法,以防您以后想要回收相同的模板。

标签: r optimization lm stargazer


【解决方案1】:

我不知道您对使用 stargazer 的承诺程度,但您可以尝试使用 broom 和 xtable 包,问题是它不会为您提供优化模型的标准错误

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

【讨论】:

    【解决方案2】:

    我刚刚遇到这个问题,并通过使用 stargazer 中的 coef se 和 omit 函数克服了这个问题......例如

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

    【讨论】:

      【解决方案3】:

      您需要先实例化一个虚拟的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
      

      (然后当然要确保剩余的汇总统计信息正确)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        相关资源
        最近更新 更多