简体   繁体   English

获得通过最大似然估计的系数到星形表中

[英]Get coefficients estimated by maximum likelihood into a stargazer table

Stargazer produces very nice latex tables for lm (and other) objects. Stargazer为lm(和其他)物体生产非常漂亮的乳胶桌。 Suppose I've fit a model by maximum likelihood. 假设我按最大可能性拟合模型。 I'd like stargazer to produce a lm-like table for my estimates. 我希望观星者为我的估计生成一个类似于lm的表格。 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. 虽然它有点hacky,但有一种方法可能是创建一个包含我的估计值的“假”lm对象 - 我认为只要summary(my.fake.lm.object)有效,它就会起作用。 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. 更确切地说:对于lm个对象,stargazer很好地打印表格顶部的因变量,包括相应估计值下面的括号中的SE,并且在表格的底部有R ^ 2和观察数量。 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: 以下是我将我的优化输出装扮为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

I was just having this problem and overcame this through the use of the coef se , and omit functions within stargazer... eg 我只是有这个问题,并通过利用克服了这个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="")

You need to first instantiate a dummy lm object, then dress it up: 你需要首先实例化一个虚拟的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

(and then of course make sure the remaining summary stats are correct) (然后当然要确保剩余的摘要统计数据是正确的)

I don't know how committed you are to using stargazer, but you can try using the broom and the xtable packages, the problem is that it won't give you the standard errors for the optim model 我不知道你是如何使用stargazer,但你可以尝试使用扫帚和xtable包,问题是它不会给你的优化模型的标准错误

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM