Nhận các hệ số ước tính theo khả năng tối đa vào bảng stargazer


83

Stargazer sản xuất các bảng cao su rất đẹp cho các đối tượng lm (và các loại khác). Giả sử tôi phù hợp với một mô hình theo khả năng tối đa. Tôi muốn stargazer sản xuất một chiếc bàn giống như lm để tôi ước tính. Tôi có thể làm cái này như thế nào?

Mặc dù hơi khó, một cách có thể là tạo một đối tượng lm "giả" có chứa các ước tính của tôi - tôi nghĩ điều này sẽ hiệu quả miễn là tóm tắt (my.fake.lm.object) hoạt động. Điều đó có dễ dàng thực hiện được không?

Một ví dụ:

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?

Nói chính xác hơn: với các đối tượng lm, stargazer in một cách độc đáo biến phụ thuộc ở đầu bảng, bao gồm các SE trong dấu ngoặc đơn bên dưới các ước tính tương ứng và có R ^ 2 và số lượng quan sát ở cuối bảng. Có cách nào (n dễ dàng) để có được hành vi tương tự với mô hình "tùy chỉnh" được ước tính theo khả năng xảy ra tối đa như trên không?

Dưới đây là những nỗ lực yếu ớt của tôi trong việc thay đổi đầu ra tối ưu của tôi thành một đối tượng 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
Tôi đã cố gắng tương tự với texreggói. Do sự lười biếng, cuối cùng tôi đã ghi đè các hệ số và lỗi tiêu chuẩn của một mô hình khác, điều này đã cho tôi kết quả mong muốn. Trong trường hợp của bạn, bạn có thể ghi đè lên các hệ số và lỗi tiêu chuẩn của model1. Mặc dù đây không phải là một giải pháp phức tạp, nhưng nó sẽ hoạt động. Không cần phải nói, tôi tò mò để xem nếu có giải pháp tốt hơn sẽ xuất hiện ...
coffeinjunky

1
Bạn có thể xem qua chức năng stargazer để nâng vật nặng stargazer:::.stargazer.wrap. Nó trông giống như một vùng chứa với một loạt các chức năng khác ngoài mã định dạng bảng. Và có vẻ như nó đánh giá khá nhiều thành phần cho lm(và glm) điều đó sẽ khiến bạn rất khó xác định optim()kết quả của mình .
andybega

3
Trong texreg, nó sẽ là đủ để tạo một texregđối tượng bằng cách sử dụng createTexreghàm. Về cơ bản, bạn chỉ cần bàn giao các hệ số, SE, v.v. Xem ?createTexreg. Các texregđối tượng sau đó có thể được đưa vào texreg, htmlreg, screenreg, và plotregcác chức năng. Ngoài ra, phần 6 của bài viết JSS mô tả cách viết và đăng ký các phương thức cho các loại mô hình mới trong trường hợp bạn muốn tái chế cùng một mẫu sau này.
Philip Leifeld

Câu trả lời:


2

Tôi chỉ gặp sự cố này và đã khắc phục điều này thông qua việc sử dụng coef sevà các omitchức năng trong stargazer ... vd:

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

Trước tiên, bạn cần khởi tạo một lmđối tượng giả , sau đó chỉnh trang cho nó:

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

(và tất nhiên sau đó đảm bảo rằng các thống kê tóm tắt còn lại là chính xác)


0

Tôi không biết bạn cam kết sử dụng stargazer như thế nào, nhưng bạn có thể thử sử dụng chổi và các gói xtable, vấn đề là nó sẽ không cung cấp cho bạn các lỗi tiêu chuẩn cho mô hình tối ưu

library(broom)
library(xtable)
xtable(tidy(model1))
xtable(tidy(model2))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.