Отримайте коефіцієнти, оцінені за максимальною ймовірністю, у таблиці звізників


83

Stargazer виробляє дуже гарні латексні столи для lm (та інших) об’єктів. Припустимо, я підігнав модель за максимальною ймовірністю. Я хотів би, щоб stargazer створив таблицю, подібну до lm, для моїх оцінок. Як я можу це зробити?

Хоча це трохи хакерсько, але одним із шляхів може бути створення "підробленого" об'єкта lm, що містить мої оцінки - я думаю, це буде працювати, доки працює резюме (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 простий) спосіб отримати таку ж поведінку за допомогою "нестандартної" моделі, що оцінюється за максимальною вірогідністю, як вище?

Ось мої слабкі спроби переодягнути мій оптимальний результат як об'єкт 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.wrap. Це виглядає як контейнер з купою інших функцій на додаток до коду, який форматує таблиці. І, схоже, він оцінює чимало компонентів для lmglm), що ускладнило б оформлення ваших optim()результатів.
andybega

3
Для texregцього було б достатньо створити texregоб’єкт за допомогою createTexregфункції. Ви в основному просто передаєте коефіцієнти, СЕ тощо. Див ?createTexreg. texregОб'єкт може потім бути поданий в texreg, htmlreg, screenreg, і plotregфункції. Крім того, розділ 6 статті JSS описує, як писати та реєструвати методи для нових типів моделей у випадку, якщо ви хочете переробити той самий шаблон пізніше.
Філіп Лейфельд

Відповіді:


2

Я просто мав цю проблему і подолав її завдяки використанню coef seі omitфункцій у 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="")

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, але ви можете спробувати використовувати мітлу та пакети xtable, проблема в тому, що це не дасть вам стандартних помилок для оптимістичної моделі

library(broom)
library(xtable)
xtable(tidy(model1))
xtable(tidy(model2))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.