Включая спецификации модели в xtable(anova(...))
Вопрос
У меня есть куча логлинейных моделей, которые для наших целей будут просто glm()
объекты , называемые mx, my, mz
.Я хочу получить красиво отформатированный xtable
анализа отклонений, поэтому, естественно, я хотел бы выполнить xtable(anova(mx, my, mz, test = "Chisq"))
.
Ванильный выход из xtable
, однако, не включает спецификации модели.Я бы хотел включить их во все тесты ANOVA, которые я запускаю, поэтому, если мне не хватает параметра, который делает это, мне, вероятно, просто придется взломать свое собственное решение.Но, просматривая страницу справки, кажется, что нет простого способа включить спецификации модели.
Есть какие-нибудь мысли?Альтернативы?
Если это поможет, это было сделано в 2.9.1 с xtable 1.5-5.
Решение
если 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, чтобы обернуть формулу в таблицу.Первое может быть достигнуто с помощью cutoff.width
аргумент deparse, а второй с помощью p{width}
введите столбец в latex.Например:
# 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
- передает суть дела и намного короче.
Другие советы
Я полагаю, что вы хотите получить таблицу 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, но в ней есть формула модели...