Incluindo especificações do modelo em xtable (ANOVA (…))
Pergunta
Eu tenho um monte de modelos loglineares, que, para nossos propósitos, serão apenas glm()
objetos chamados mx, my, mz
. Eu quero ficar bem formatado xtable
da análise do desvio, então naturalmente eu gostaria de realizar xtable(anova(mx, my, mz, test = "Chisq"))
.
A saída de baunilha de xtable
, no entanto, não inclui as especificações do modelo. Eu gostaria de incluir aqueles para todos os testes ANOVA que estou executando; portanto, se não houver um parâmetro que eu esteja perdendo, isso provavelmente terei que hackear minha própria solução. Mas, olhando a página de ajuda, não parece haver uma maneira fácil de incluir as especificações do modelo.
Alguma ideia? Alternativas?
Se ajudar, isso foi feito em 2.9.1 com Xtable 1.5-5.
Solução
E se a
é o objeto da tabela ANOVA, então attr(a,"heading")
contém as informações que você está procurando, mas não consegui descobrir uma boa maneira de extraí -las. Então eu procurei o código de anova.glm
, que me direcionou para o código de anova.lmlist
Para descobrir como eles colocam essas informações no título. Isso inspirou a seguir a solução:
# 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)
Edite para atender a longas fórmulas:
Se você tem fórmulas longas, são necessárias duas alterações: primeiro temos que ter certeza de que deparse
Não o divide em linhas e, em seguida, precisamos fazer o látex embrulhar a fórmula na tabela. O primeiro pode ser alcançado usando o cutoff.width
argumento de deparse, e o segundo usando um p{width}
Tipo de coluna no látex. Por exemplo:
# 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")
O resultado não é excessivamente bonito, mas sua fórmula também não é bonita. Neste caso em particular, eu usaria (sex + attend + birth + politics)^3
- Alega o ponto e é muito mais curto.
Outras dicas
Eu acho que você deseja obter a tabela de látex, mas pode facilmente obter a tabela HTML com a fórmula do modelo.
# 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
Você pode fazer algo assim:
# 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()
Não é tão bonito quanto a tabela de látex, mas tem uma fórmula de modelo ...