Включая спецификации модели в xtable(anova(...))

StackOverflow https://stackoverflow.com/questions/2294163

  •  21-09-2019
  •  | 
  •  

Вопрос

У меня есть куча логлинейных моделей, которые для наших целей будут просто 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, но в ней есть формула модели...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top