2016-03-30 23 views
0

Was ich versuche zu tun, sollte ziemlich einfach sein: Ich schätze ein Tobit-Modell mit dem R-Paket Zelig. Daraus möchte ich eine Tex-Ausgabe unter Verwendung Texreg erstellen. Aber was bekomme ich wieder die Fehlermeldung:R: Erstellen Tex-Ausgabe von Zelig Tobit-Modell mit Texreg

Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘extract’ for signature ‘"Zelig-tobit"’

Das ist ziemlich seltsam texreg tut ein Extraktionsverfahren für Tobit-Modelle haben. Ich habe auch versucht, eine Funktion selbst zu spezifizieren, aber ich konnte es nicht zum Laufen bringen. Hier ist ein Beispiel-Code:

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) 

Ich verwende R Studio auf einem Windows-Computer, die texreg Version 1.36.4 und die Zelig Version 5,0-11.

Diese Frage schien eng mit meinem Problem zu tun: texreg-ing Tobit output from zelig package (R)

Dies ist jedoch nach noch vor einigen Versionen behoben worden sein, was für mich nicht der Fall ist.

Vielen Dank im Voraus für Ihre Hilfe!

(Btw, ich habe auch versucht, Stargazer statt texreg verwendet, die mir nur eine andere Fehlermeldung ergab.)


Ich habe versucht, meine eigene Extrakt Funktion zu schreiben, aber aufgrund meiner Dilettantismus in Funktion Schreiben kann es nicht zum Funktionieren bringen. Hier ist, was ich getan habe:

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) 

Wie ich es sehe, ist das zelig Modell bereits „zusammengefasst“, deshalb habe ich s eingestellt < - Modell statt Zusammenfassung (Modell), wie im Beispiel. Mein Hauptproblem scheint zu sein, dass ich die benötigten Statistiken (Log-Likelihood, Wald ...) nicht aus dem Modell herausholen kann, da ich nicht weiß, wie ich sie ansprechen soll. Die Ausgabe von str() und so weiter hilft mir dabei nicht weiter. Abgesehen davon, dass man die "Namen" der Statistiken einfach nicht kennt, scheint es auch ein Problem mit wie zu geben, sie zu adressieren.

Wenn ich so etwas wie "-Modell $ Koef" versuchen, erhalte ich:

Error in envRefInferField(x, what, getClass(class(x)), selfEnv) :
‘coef’ is not a valid field or method name for reference class “Zelig-tobit”

Mit "Modell @ Koef" Ich bekomme:

Error: no slot of name "coef" for this object of class "Zelig-tobit"

Und Modell [1] liefert mir:

Error in modelt6[, 1] : object of type 'S4' is not subsettable

Hat jemand eine Idee, wie man die Extraktfunktion arbeiten lässt? Oder ein anderer, einfacherer Weg, die Modellausgabe in Latex zu bekommen?

+0

Tobit-Modelle wurden in Zelig als Klasse '' zelig'' mit Unterklasse '' tobit'' implementiert. Dies ist offensichtlich nicht mehr der Fall, da das Modell, das Sie erstellen, die Klassensignatur "Zelig-Tobit" hat. Sie müssen eine Erweiterung schreiben, d. H. Eine '' extract''-Methode für texreg. Abschnitt 6 des Texreg-Artikels im Journal of Statistical Software (aktualisierte Version: https://cran.r-project.org/web/packages/texreg/vignettes/v55i08.pdf) bietet einige Anleitungen und ein Beispiel. –

+0

Danke für die Hilfe! Ich habe bereits versucht, eine Extraktfunktion zu schreiben, kann aber nicht zur Arbeit kommen. Siehe meine bearbeitete Frage oben. Hat jemand irgendwelche Ideen dazu? Ich werde wirklich verzweifelt. – meatexample

+0

Siehe auch diesen Post, wo ich eine detaillierte Anleitung zum Schreiben einer Methode zum Extrahieren bieten: http://stackoverflow.com/questions/38894044/print-beautiful-tables-for-h2o-models-in-r –

Antwort

0

Es sieht aus wie Zelig-tobit Objekte wie in dem Zelig Paket definiert sind lediglich Container, die tobit Objekte umfassen, wie in dem AER Paket definiert ist, unter anderem.Daher sollten Sie in der Lage sein texreg auf dem tobit Objekt auszuführen, die in model enthalten ist:

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

ergibt:

========================== 
       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 

Es ist möglich, eine extract Methode zu schreiben, die automatisch zu tun. Hier ein Beispiel:

# 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) 

Jetzt können Sie einfach schreiben:

screenreg(model) 

, die die gleiche Leistung wie oben ergibt.

Ich habe nie verstanden, warum Menschen Zelig verwenden. Zelig liefert lediglich Wrapper für andere existierende Schätzfunktionen und verkompliziert dadurch die Datenstrukturen auf unnötige Weise. Zum Beispiel, wen benutzen Sie nicht einfach das AER Paket?

+0

Vielen Dank ! Die Extrakt-Funktion funktioniert, aber Sie haben Recht, es ist entweder nur das VRE-Paket zu verwenden. Ich wusste einfach nicht, wie Zelig in einem Beispiel für Tobit-Modelle verwendet wurde, die ich über Google gefunden habe ... – meatexample