R: создание вывода tex из модели zelig tobit с помощью texreg

То, что я пытаюсь сделать, должно быть довольно простым: я оцениваю модель тобита с помощью пакета R Zelig. Исходя из этого, я хочу создать текстовый вывод с помощью texreg. Но я получаю сообщение об ошибке:

Ошибка в (function (classes, fdef, mtable): невозможно найти унаследованный метод для функции «extract» для сигнатуры «Zelig-tobit» »

Это довольно странно, поскольку у texreg есть есть метод извлечения для моделей тобита. Я также пытался сам указать функцию, но не смог заставить ее работать. Вот пример кода:

library(Zelig)
library(texreg)

a <- c(2, 2, 2, 4, 3, 5, 9, 9, 9)
b <- c(18, 20, 19, 17, 22, 48, 12, 22, 37)
c <- c(0.1, 0.02, 0.5, 1.2, 0.9, 0.1, 1.1, 0.7, 0.6)

dat <- data.frame(a, b, c)

model <- zelig(a ~ b + c, below = 2, above = 9, model = "tobit", data = dat)

texreg(model)

Я использую R Studio на компьютере под управлением Windows, версия texreg - 1.36.4, а версия Zelig - 5.0-11.

Этот вопрос казался тесно связанным с моей проблемой: вывод Tobit texreg -ing из zelig пакет (R)

Однако, согласно этому, это должно было быть исправлено несколько версий назад, что не относится ко мне.

Заранее спасибо за помощь!

(Кстати, я также пробовал использовать stargazer вместо texreg, что выдало мне еще одно сообщение об ошибке.)


Я попытался написать свою собственную функцию извлечения, но из-за своего дилетантства в написании функций не смог заставить ее работать. Вот что я сделал:

extract.tob <- function(model, include.iterations = TRUE, include.loglik = TRUE,
                        include.wald = TRUE, ...) {

  s <- model
  names <- rownames(s$coef)
  co <- s$coef[, 1]
  se <- s$coef[, 2]
  pval <- s$coef[, 4]

  gof <- numeric()
  gof.names <- character()
  gof.decimal <- logical()

  if (include.iterations == TRUE) {
    it <- s$iterations
    gof <- c(gof, it)
    gof.names <- c(gof.names, "Number of\\iterations")
    gof.decimal <- c(gof.decimal, TRUE)
  }
  if (include.loglik == TRUE) {
    ll <- s$logLik
    gof <- c(gof, ll)
    gof.names <- c(gof.names, "Log-\\likelihood")
    gof.decimal <- c(gof.decimal, TRUE)
  }
  if (include.wald == TRUE) {
    wd <- s$wald
    gof <- c(gof, wd)
    gof.names <- c(gof.names, "Wald-\\statistic")
    gof.decimal <- c(gof.decimal, TRUE)
  }

  tr <- createTexreg(
  coef.names = names,
  coef = co,
  se = se,
  pvalues = pval,
  gof.names = gof.names,
  gof = gof,
  gof.decimal = gof.decimal
  )
  return(tr) 

}  

setMethod("extract", signature = className("Zelig-tobit", "Zelig"),
          definition = extract.tob)

На мой взгляд, модель зелига уже "суммирована", поэтому я установил s ‹- модель вместо резюме (модели), как в примере. Моя основная проблема, похоже, заключается в том, что я не могу получить необходимую статистику (логарифмическая вероятность, Wald ...) из модели, так как я не знаю, как их адресовать. Вывод str () и т. Д. Мне в этом не помогает. Помимо простого незнания "названий" статистических данных, также, похоже, существует проблема с как обращаться к ним.

Когда я пробую что-то вроде "model $ coef", я получаю:

Ошибка в envRefInferField (x, what, getClass (class (x)), selfEnv):
«coef» не является допустимым полем или именем метода для ссылочного класса «Zelig-tobit»

С "model @ coef" я получаю:

Ошибка: нет слота с именем «coef» для этого объекта класса «Зелиг-тобит».

И модель [, 1] дает мне:

Ошибка в modelt6 [, 1]: объект типа 'S4' не является подмножеством

Кто-нибудь знает, как заставить работать функцию извлечения? Или другой, более простой способ перевести модель в латекс?


person meatexample    schedule 30.03.2016    source источник
comment
Раньше модели Tobit были реализованы в Zelig как класс zelig с подклассом tobit. Очевидно, это уже не так, поскольку модель, которую вы создаете, имеет сигнатуру класса Zelig-tobit. Вам нужно написать расширение, то есть extract метод, для texreg. Раздел 6 статьи texreg в Journal of Statistical Software (обновленная версия: cran.r-project.org/web/packages/texreg/vignettes/v55i08.pdf) содержит некоторые рекомендации и пример.   -  person Philip Leifeld    schedule 31.03.2016
comment
Спасибо за помощь! Я уже пробовал написать функцию извлечения, но не могу приступить к работе. См. Мой отредактированный вопрос выше. Есть у кого-нибудь идеи по этому поводу? Я действительно в отчаянии.   -  person meatexample    schedule 31.03.2016
comment
См. Также этот пост, где я предоставляю подробное руководство о том, как написать метод извлечения: stackoverflow.com/questions/38894044/   -  person Philip Leifeld    schedule 25.08.2016


Ответы (1)


Похоже, что объекты Zelig-tobit, определенные в пакете Zelig, являются просто контейнерами, которые, помимо прочего, включают tobit объекты, определенные в пакете AER. Следовательно, вы должны иметь возможность запускать texreg на объекте tobit, который содержится в model:

screenreg(model$zelig.out$z.out[[1]])

дает:

==========================
                Model 1   
--------------------------
(Intercept)     -18.42    
                (16.34)   
b                 0.49    
                 (0.36)   
c                17.51    
                (11.49)   
Log(scale)        1.76 ***
                 (0.49)   
--------------------------
AIC              33.55    
BIC              34.34    
Log Likelihood  -12.78    
Deviance          9.46    
Total             9       
Left-censored     3       
Uncensored        3       
Right-censored    3       
Wald Test         2.35    
==========================
*** p < 0.001, ** p < 0.01, * p < 0.05

Можно написать extract метод, который сделает это автоматически. Вот пример:

# extension for Zelig-tobit objects (Zelig package)
extract.Zeligtobit <- function(model, include.aic = TRUE, include.bic = TRUE, 
    include.loglik = TRUE, include.deviance = TRUE, include.nobs = FALSE, 
    include.censnobs = TRUE, include.wald = TRUE, ...) {
  e <- extract(model$zelig.out$z.out[[1]], include.aic = include.aic, 
      include.bic = include.bic, include.loglik = include.loglik, 
      include.deviance = include.deviance, include.nobs = include.nobs, 
      include.censnobs = include.censnobs, include.wald = include.wald, ...)
  return(e)
}  

setMethod("extract", signature = className("Zelig-tobit", "Zelig"), 
    definition = extract.Zeligtobit)

Теперь вы можете просто написать:

screenreg(model)

что дает тот же результат, что и выше.

Я никогда не понимал, почему люди используют Zelig вместо оригинальных пакетов, таких как AER. Zelig просто предоставляет оболочки для других существующих функций оценки и тем самым ненужным образом усложняет структуры данных. Например, почему вы просто не используете пакет AER?

person Philip Leifeld    schedule 01.04.2016
comment
Большое спасибо! Функция извлечения работает, но вы правы, нужно либо просто использовать пакет AER. Я просто не знал об этом, так как Зелиг использовался в примере для моделей тобита, которые я нашел через Google ... - person meatexample; 02.04.2016
comment
Чтобы частично ответить на вопрос Филиппа, одно из преимуществ использования Zelig заключается в возможности легко моделировать ожидаемые и прогнозируемые значения Y в зависимости от различных значений X. Это может существенно облегчить интерпретацию и визуализацию данных, особенно для нетехнической аудитории. Дополнительную информацию об этом подходе см .: web.stanford.edu/~tomz/pubs /ajps00.pdf или docs.zeligproject.org/articles/quickstart.html #visualizations - person Omar Wasow; 16.08.2018