R:使用 texreg 从 zelig tobit 模型创建 tex 输出
R: creating tex output from zelig tobit model with texreg
我想做的应该相当简单:我使用 R 包 Zelig 估计了一个 tobit 模型。由此我想使用 texreg 创建一个 tex 输出。但我得到的是错误信息:
Error in (function (classes, fdef, mtable) : unable to find an
inherited method for function ‘extract’ for signature ‘"Zelig-tobit"’
这很奇怪,因为 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 Studio,texreg 版本是 1.36.4 和 Zelig 版本5.0-11.
这个问题似乎与我的问题密切相关:
然而,根据这个,它应该在几个版本之前就已经修复了,但对我来说并不是这样。
在此先感谢您的帮助!
(顺便说一句,我还尝试使用 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 模型已经是 "summarized",这就是我设置 s <- model 而不是示例中的 summary(model) 的原因。我的主要问题似乎是我无法从模型中获得所需的统计数据(对数似然、wald ...),因为我不知道如何处理它们。 str() 等的输出对我没有帮助。除了根本不知道统计数据的 "names" 之外,如何 似乎也存在问题。
当我尝试类似 "model$coef" 的操作时,我得到:
Error in envRefInferField(x, what, getClass(class(x)), selfEnv) :
‘coef’ is not a valid field or method name for reference class
“Zelig-tobit”
使用 "model@coef" 我得到:
Error: no slot of name "coef" for this object of class "Zelig-tobit"
而模型[1] 产生了我:
Error in modelt6[, 1] : object of type 'S4' is not subsettable
有谁知道如何使提取功能起作用?
或者将模型输出到 Latex 中的另一种更简单的方法?
看起来 Zelig
包中定义的 Zelig-tobit
对象仅仅是包含 AER
包中定义的 tobit
对象的容器,等等。因此,您应该能够在 model
:
中包含的 tobit
对象上 运行 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
包?
我想做的应该相当简单:我使用 R 包 Zelig 估计了一个 tobit 模型。由此我想使用 texreg 创建一个 tex 输出。但我得到的是错误信息:
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘extract’ for signature ‘"Zelig-tobit"’
这很奇怪,因为 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 Studio,texreg 版本是 1.36.4 和 Zelig 版本5.0-11.
这个问题似乎与我的问题密切相关:
然而,根据这个,它应该在几个版本之前就已经修复了,但对我来说并不是这样。
在此先感谢您的帮助!
(顺便说一句,我还尝试使用 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 模型已经是 "summarized",这就是我设置 s <- model 而不是示例中的 summary(model) 的原因。我的主要问题似乎是我无法从模型中获得所需的统计数据(对数似然、wald ...),因为我不知道如何处理它们。 str() 等的输出对我没有帮助。除了根本不知道统计数据的 "names" 之外,如何 似乎也存在问题。
当我尝试类似 "model$coef" 的操作时,我得到:
Error in envRefInferField(x, what, getClass(class(x)), selfEnv) :
‘coef’ is not a valid field or method name for reference class “Zelig-tobit”
使用 "model@coef" 我得到:
Error: no slot of name "coef" for this object of class "Zelig-tobit"
而模型[1] 产生了我:
Error in modelt6[, 1] : object of type 'S4' is not subsettable
有谁知道如何使提取功能起作用? 或者将模型输出到 Latex 中的另一种更简单的方法?
看起来 Zelig
包中定义的 Zelig-tobit
对象仅仅是包含 AER
包中定义的 tobit
对象的容器,等等。因此,您应该能够在 model
:
tobit
对象上 运行 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
包?