【问题标题】:R: creating tex output from zelig tobit model with texregR:使用 texreg 从 zelig tobit 模型创建 tex 输出
【发布时间】:2016-03-30 13:47:19
【问题描述】:

我想要做的应该相当简单:我使用 R 包 Zelig 估计一个 tobit 模型。由此我想使用 texreg 创建一个 tex 输出。但我得到的是错误信息:

(function (classes, fdef, mtable) 中的错误:无法找到 签名“Zelig-tobit”的函数“extract”的继承方法

这很奇怪,因为 texreg 确实 有用于 tobit 模型的提取方法。我也尝试自己指定一个函数,但无法让它工作。这是一个示例代码:

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)

我在 Windows 电脑上使用 R Studiotexreg 版本是 1.36.4,Zelig 版本是 5.0-11。

这个问题似乎与我的问题密切相关: texreg-ing Tobit output from zelig package (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)

在我看来,zelig 模型已经“汇总”,这就是为什么我设置 s 如何处理它们似乎也存在问题。

当我尝试“model$coef”之类的东西时,我得到:

envRefInferField(x, what, getClass(class(x)), selfEnv) 中的错误:
“coef”不是引用类的有效字段或方法名称 “Zelig-tobit”

使用“model@coef”我得到:

错误:“Zelig-tobit”类的这个对象没有名称为“coef”的槽

而模型[,1] 产生了我:

modelt6[, 1] 中的错误:“S4”类型的对象不是子集

有人知道如何使提取功能起作用吗? 或者另一种更简单的方法将模型输出到 Latex 中?

【问题讨论】:

  • Tobit 模型过去在 Zelig 中实现为类 zelig 和子类 tobit。这显然不再是这种情况,因为您正在创建的模型具有类签名Zelig-tobit。您需要为 texreg 编写一个扩展,即 extract 方法。 Journal of Statistical Software(更新版:cran.r-project.org/web/packages/texreg/vignettes/v55i08.pdf)中 texreg 文章的第 6 节提供了一些指导和示例。
  • 感谢您的帮助!我已经尝试编写一个提取函数,但无法开始工作。请参阅上面我编辑的问题。有人对此有任何想法吗?我真的越来越绝望了。
  • 另见这篇文章,我提供了关于如何编写提取方法的详细教程:stackoverflow.com/questions/38894044/…

标签: r stargazer texreg r-zelig


【解决方案1】:

看起来Zelig 包中定义的Zelig-tobit 对象只是包含tobit 对象的容器,如AER 包中定义的对象等等。因此,您应该能够在 tobit 包含在 model 中的对象上运行 texreg

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 包?

【讨论】:

  • 非常感谢!提取功能有效,但您是对的,要么只使用 AER 包。我根本不知道,因为 Zelig 被用于我通过 Google 找到的 tobit 模型的示例中......
  • 为了部分回答 Philip 的问题,使用 Zelig 的一个优点是能够轻松模拟 Y 的预期值和预测值,条件是 X 的各种值。这可以大大简化解释和数据可视化,尤其是对于非技术观众。有关该方法的更多背景信息,请参阅:web.stanford.edu/~tomz/pubs/ajps00.pdfdocs.zeligproject.org/articles/quickstart.html#visualizations
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
相关资源
最近更新 更多