2010-02-19 14 views
5

Tôi có một loạt các mô hình loglinear, cho mục đích của chúng tôi sẽ là glm() đối tượng có tên là mx, my, mz. Tôi muốn có được xtable được định dạng độc đáo về phân tích độ lệch, vì vậy tự nhiên tôi muốn thực hiện xtable(anova(mx, my, mz, test = "Chisq")).Bao gồm thông số kỹ thuật mô hình trong xtable (anova (...))

Đầu ra vani của xtable, tuy nhiên, không bao gồm thông số kỹ thuật của mô hình. Tôi muốn bao gồm những người cho tất cả các xét nghiệm ANOVA tôi đang chạy, vì vậy nếu không có một param tôi đang thiếu mà hiện này tôi có lẽ sẽ chỉ cần phải hack lên giải pháp của riêng tôi. Nhưng nhìn qua trang trợ giúp, dường như không có cách nào dễ dàng để bao gồm các thông số kỹ thuật của mô hình.

Mọi suy nghĩ? Lựa chọn thay thế?

Nếu nó giúp việc này được thực hiện trong 2.9.1 với xtable 1.5-5.

Trả lời

4

nếu a là đối tượng bảng anova, sau đó attr(a,"heading") không chứa thông tin bạn đang tìm kiếm, nhưng tôi không thể tìm ra cách tốt nhất để giải nén nó. Vì vậy, tôi tra mã số anova.glm, hướng tôi đến mã số anova.lmlist để tìm hiểu cách họ đặt thông tin đó vào nhóm. Đây cảm hứng để giải pháp sau đây:

# 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) 

Chỉnh sửa để phục vụ cho công thức dài:
Nếu bạn đã công thức dài, hai sự thay đổi là cần thiết: thứ nhất chúng ta phải đảm bảo rằng deparse không phá vỡ nó thành dòng, và sau đó chúng ta cần làm mủ để bọc công thức trong bảng. Đầu tiên có thể đạt được bằng cách sử dụng đối số cutoff.width bị thiếu và thứ hai bằng cách sử dụng loại cột p{width} bằng latex. Ví dụ:

# 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") 

Kết quả không quá đẹp, nhưng công thức của bạn cũng không đẹp. Trong trường hợp cụ thể này tôi sẽ sử dụng (sex + attend + birth + politics)^3 - được điểm trên và ngắn hơn nhiều.

+0

Đây là một khởi đầu tuyệt vời, nhưng nó loại chia nhỏ hơn nữa phân cấp tương tác. Ví dụ: nếu tôi có '[[3]] [1]" freq ~ sex + tham dự + sinh + chính trị + giới tính: tham dự + giới tính: sinh + " [2]" sex: chính trị + tham dự: sinh + tham dự : chính trị + sinh: chính trị + " [3]" giới tính: tham dự: sinh + giới tính: tham dự: chính trị + giới tính: sinh: chính trị + " [4]" tham dự: sinh: chính trị "' Nó không công việc! Vì vậy, gần như mặc dù - có vẻ như giải pháp sẽ bao gồm việc đưa lên các mô hình dài hình thành agove bảng, và đánh số chúng, và sau đó chỉ đề cập đến số trong bảng thực tế. – HamiltonUlmer

+0

Tôi đã thêm một ví dụ với công thức dài của bạn. – Aniko

1

Tôi cho rằng bạn muốn có bảng LaTeX, nhưng bạn có thể dễ dàng lấy bảng HTML với công thức mô hình.

# 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 

Bạn có thể làm một cái gì đó như thế này:

# 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ó không xinh đẹp như bảng LaTeX, nhưng nó có mô hình công thức ...