0

私がやろうとしていることはかなり簡単なはずです: R パッケージZeligを使用して tobit モデルを推定します。これから、 texregを使用して tex 出力を作成したいと思います。しかし、私が返すのはエラーメッセージです:

(function (classes, fdef, mtable) のエラー: シグネチャ '"Zelig-tobit"' の関数 'extract' の継承されたメソッドが見つかりません</p>

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 です。

この質問は、私の問題と密接に関連しているようでした: texreg-ing Tobit output from zelig package (R)

ただし、これによれば、数バージョン前に修正されているはずですが、私には当てはまりません。

よろしくお願いします。

(ちなみに、 texregの代わりにstargazerを使用してみましたが、別のエラー メッセージが表示されました。)


私は独自の抽出関数を作成しようとしましたが、関数の作成が素人であるために機能しません。これが私がしたことです:

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 モデルは既に「要約」されています。そのため、例のように summary(model) の代わりに s <- model を設定しています。私の主な問題は、それらに対処する方法がわからないため、必要な統計 (対数尤度、wald ...) をモデルから取得できないことです。str() などの出力は、これには役立ちません。単に統計の「名前」がわからないだけでなく、それらに対処する方法にも問題があるようです。

「model $ coef」のようなものを試すと、次のようになります。

envRefInferField(x, what, getClass(class(x)), selfEnv) のエラー:
「coef」は参照クラス「Zelig-tobit」の有効なフィールドまたはメソッド名ではありません</p>

「model@coef」を使用すると、次のようになります。

エラー: クラス「Zelig-tobit」のこのオブジェクトの名前「coef」のスロットがありません

そして model[,1] は私をもたらします:

modelt6[, 1] のエラー: タイプ 'S4' のオブジェクトはサブセット化できません

抽出機能を機能させる方法を知っている人はいますか? または、モデル出力をラテックスに取得する別の簡単な方法はありますか?

4

1 に答える 1

0

Zelig-tobitパッケージで定義されているオブジェクトは、パッケージで定義されているオブジェクトZeligを含む単なるコンテナーのようです。したがって、に含まれるオブジェクトで実行できるはずです。tobitAERtexregtobitmodel

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のような元のパッケージの代わりになぜ人々が使用するのか、私にはよくわかりませんでしたAERZelig他の既存の推定関数のラッパーを提供するだけで、データ構造が不必要に複雑になります。たとえば、なぜAERパッケージを使用しないのですか?

于 2016-04-01T12:06:14.880 に答える