我有一堆对数线性模型,为了我们的目的,它只是glm()
个名为mx, my, mz
的对象。我希望得到一个格式良好的xtable
偏差分析,所以我自然希望执行xtable(anova(mx, my, mz, test = "Chisq"))
。
然而,xtable
的vanilla输出不包括模型规范。我想把我正在运行的所有ANOVA测试都包括在内,所以如果没有一个参数,我就错过了这样做,我可能只需要破解我自己的解决方案。但是查看帮助页面,似乎没有简单的方法来包含模型规范。
有什么想法?替代?
如果有帮助,可以使用xtable 1.5-5在2.9.1中完成。
答案 0 :(得分:4)
如果a
是anova表对象,那么attr(a,"heading")
确实包含您要查找的信息,但我无法找到一种很好的提取方法。所以我查了anova.glm
的代码,它引导我使用anova.lmlist
的代码来弄清楚他们如何将这些信息放入标题中。这启发了以下解决方案:
# 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)
编辑以迎合长公式:
如果您有长公式,则需要进行两项更改:首先我们必须确保deparse
不会将其分成行,然后我们需要使用latex来将公式包装在表中。第一个可以通过使用deparse的cutoff.width
参数来实现,第二个可以通过在latex中使用p{width}
列类型来实现。例如:
# 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")
结果不是太漂亮,但你的公式也不漂亮。在这种特殊情况下,我会使用(sex + attend + birth + politics)^3
- 得到点并且更短。
答案 1 :(得分:1)
我估计你想要获得LaTeX表,但你可以轻松地获得带有模型公式的HTML表。
# 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
您可以这样做:
# 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()
它不像LaTeX表那么漂亮,但它有模型公式......