2010-02-19 7 views
5

Ich habe eine Reihe von loglinearen Modellen, die für unsere Zwecke nur glm() Objekte mx, my, mz genannt werden. Ich möchte ein schön formatiertes xtable der Devianzanalyse bekommen, also würde ich natürlich xtable(anova(mx, my, mz, test = "Chisq")) durchführen wollen.Einschließlich Modellspezifikationen in xtable (anova (...))

Die Vanilla-Ausgabe von xtable enthält jedoch nicht die Modellspezifikationen. Ich möchte diese für alle ANOVA-Tests einschließen, die ich führe. Wenn es also keinen Param gibt, der mir fehlt, muss ich wahrscheinlich nur meine eigene Lösung hacken. Aber wenn man über die Hilfeseite schaut, scheint es keine einfache Möglichkeit zu geben, die Modellspezifikationen einzubeziehen.

Irgendwelche Gedanken? Alternativen?

Wenn es hilft, wurde dies in 2.9.1 mit xtable 1.5-5 getan.

Antwort

4

Wenn a das Anova-Tabellenobjekt ist, dann enthält attr(a,"heading") die Information, die Sie suchen, aber ich konnte keine gute Methode finden, es zu extrahieren. Also habe ich den Code anova.glm nachgeschlagen, der mich an den Code anova.lmlist geleitet hat, um herauszufinden, wie sie diese Informationen in die Überschrift schreiben. Dies zu folgenden Lösung inspiriert:

# fake data 
x <- 1:10 
y <- x+ rnorm(10) 

# two models 
m1 <- glm(y~x) 
m2 <- glm(y~x+I(x^2)) 
a <- anova(m1, m2) # anova object to be printed 

# get model formulas 
flas <- sapply(list(m1,m2), function(x)paste(deparse(x$formula))) 
rownames(a) <- flas # add formulas as rownames 

# convert to latex 
xtable(a) 

Edit für lange Formeln bieten:
Wenn Sie lange Formeln, zwei Änderungen erforderlich sind: zuerst müssen wir sicherstellen, dass deparse es nicht in Linien bricht, und dann müssen wir Latex machen, um die Formel in die Tabelle zu legen. Der erste kann erreicht werden, indem das Argument cutoff.width von deparse verwendet wird, und der zweite unter Verwendung eines p{width} Spaltentyps in Latex. Zum Beispiel:

# add long formula 
m2$formula <- freq ~ sex + attend + birth + politics + sex:attend + sex:birth + 
       sex:politics + attend:birth + attend:politics + birth:politics + 
       sex:attend:birth + sex:attend:politics + sex:birth:politics + 
       attend:birth:politics 
a <- anova(m1, m2) 

# use a large width 
flas <- sapply(list(m1,m2), 
       function(x)paste(deparse(x$formula, cutoff.width=500))) 
rownames(a) <- flas # add formulas as rownames 

# convert to latex with first column wrapped in a 5cm wide parbox 
xtable(a, align="p{5cm}rrrr") 

Das Ergebnis ist nicht allzu schön, aber Ihre Formel ist auch nicht schön. In diesem speziellen Fall würde ich (sex + attend + birth + politics)^3 verwenden - bekommt den Punkt über und ist viel kürzer.

+0

Dies ist ein guter Start, aber es ist eine Art bricht die Interaktionshierarchie weiter auf. Zum Beispiel, wenn ich '[[3]] [1]" freq ~ sex + teilnehmen + geburt + politik + geschlecht: besuchen + geschlecht: geburt + " [2]" sex: politik + teilnehmen: geburt + besuchen : politik + geburt: politik + " [3]" sex: besuchen: geburt + sex: besuchen: politik + geschlecht: geburt: politik + " [4]" teilnehmen: geburt: politik "' Es tut es nicht Arbeit! Aber so nah - scheint die Lösung darin zu bestehen, die Long-Form-Modelle in der Tabelle aufzustellen und sie zu nummerieren und sich dann nur auf die Nummer in der tatsächlichen Tabelle zu beziehen. – HamiltonUlmer

+0

Ich habe ein Beispiel mit Ihrer langen Formel hinzugefügt. – Aniko

1

Ich schätze, dass Sie LaTeX-Tabelle erhalten möchten, aber Sie können HTML-Tabelle mit Modellformel leicht erhalten.

# if we presuppose that <b>a</b> is object from @Aniko's reply 
> class(a) 
[1] "anova"  "data.frame" 
# after doing a bit of that sapply magic you get 
> a 
Analysis of Deviance Table 

Model 1: y ~ x 
Model 2: y ~ x + I(x^2) 
       Resid. Df Resid. Dev Df Deviance 
y ~ x     8  15.503    
y ~ x + I(x^2)   7  12.060 1 3.4428 

Sie können so etwas tun:

# load xtable library 
library(xtable) 
# sink output to html file 
sink("~/anova_specs.html") # suppose you're running R on Linux "~/" 
print(xtable(a), type = "html") 
sink() 

Es ist nicht so hübsch wie LaTeX Tabelle, aber es hat Modellformel ...