Kết quả tổng hợp từ mô hình tuyến tính chạy R


16

Vì mô hình hồi quy thường là "nghệ thuật" hơn khoa học, tôi thường thấy mình đang thử nghiệm nhiều lần lặp lại của cấu trúc hồi quy. Một số cách hiệu quả để tóm tắt thông tin từ nhiều mô hình này chạy trong nỗ lực tìm kiếm mô hình "tốt nhất" là gì? Một cách tiếp cận tôi đã sử dụng là đưa tất cả các mô hình vào một danh sách và chạy summary()qua danh sách đó, nhưng tôi tưởng tượng có cách nào hiệu quả hơn để so sánh?

Mã mẫu & mô hình:

ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)

lm1 <- lm(weight ~ group)
lm2 <- lm(weight ~ group - 1)
lm3 <- lm(log(weight) ~ group - 1)

#Draw comparisions between models 1 - 3?

models <- list(lm1, lm2, lm3)

lapply(models, summary)

5
Âm thanh hơi giống như dữ liệu nạo vét với tôi. Không nên tập trung vào những gì bạn nghĩ hợp lý là một mô hình phù hợp, những gì đồng biến, biến đổi, vv trước khi bạn bắt đầu mô hình hóa. R không biết bạn đã làm tất cả mô hình phù hợp để tìm một mô hình tốt.
Phục hồi Monica - G. Simpson

3
@Gavin - Tôi có thể thấy điều này nhanh chóng lạc đề một cách khủng khiếp, nhưng câu trả lời ngắn gọn là không, tôi không ủng hộ việc nạo vét dữ liệu hoặc tìm mối quan hệ giả giữa các biến ngẫu nhiên trong bộ dữ liệu. Hãy xem xét một mô hình hồi quy bao gồm thu nhập. Có phải là không hợp lý để kiểm tra các biến đổi về thu nhập để xem tác động của chúng đối với mô hình? Nhật ký thu nhập, nhật ký thu nhập bằng 10 đô la, nhật ký thu nhập trong 100 giây ...? Ngay cả khi đây là nạo vét dữ liệu - một công cụ tóm tắt / chức năng có thể tổng hợp đầu ra từ nhiều lần chạy mô hình vẫn rất hữu ích, phải không?
Đuổi theo

Câu trả lời:


17

Âm mưu chúng!

http://svn.clulessresearch.com/tables2graphs/longley.png

Hoặc, nếu bạn phải, sử dụng bảng: Gói apsrtable hoặc mtablehàm trong gói memisc .

Sử dụng mtable

 mtable123 <- mtable("Model 1"=lm1,"Model 2"=lm2,"Model 3"=lm3,
     summary.stats=c("sigma","R-squared","F","p","N"))

> mtable123

Calls:
Model 1: lm(formula = weight ~ group)
Model 2: lm(formula = weight ~ group - 1)
Model 3: lm(formula = log(weight) ~ group - 1)

=============================================
                 Model 1   Model 2   Model 3 
---------------------------------------------
(Intercept)      5.032***                    
                (0.220)                      
group: Trt/Ctl  -0.371                       
                (0.311)                      
group: Ctl                 5.032***  1.610***
                          (0.220)   (0.045)  
group: Trt                 4.661***  1.527***
                          (0.220)   (0.045)  
---------------------------------------------
sigma             0.696      0.696     0.143 
R-squared         0.073      0.982     0.993 
F                 1.419    485.051  1200.388 
p                 0.249      0.000     0.000 
N                20         20        20     
=============================================


1
@Eduardo, +1, đồ thị đẹp. Nó nên được sử dụng cẩn thận mặc dù khi biến đổi khác nhau của biến phụ thuộc được sử dụng trong các hồi quy khác nhau.
mpiktas

mpiktas, điều đó cũng đúng trong một bảng. Đồ thị chỉ làm cho nó nhỏ gọn hơn, với chi phí chính xác.
Eduardo Leoni

@Eduardo bạn có thể vui lòng chia sẻ mã cho biểu đồ không?
suncoolsu

2
Mã @suncoolsu R có sẵn trên liên kết đầu tiên được đưa ra trong phản hồi của @ Eduardo. He he, it grid, not lattice:)
chl

@Eduardo - Cảm ơn câu trả lời chi tiết, memisctrước đây tôi không biết , có vẻ như là một gói rất tiện dụng để có trong máy rung!
Đuổi theo

12

Sau đây không trả lời chính xác câu hỏi. Nó có thể cung cấp cho bạn một số ý tưởng, mặc dù. Đó là điều mà gần đây tôi đã làm để đánh giá sự phù hợp của một số mô hình hồi quy bằng cách sử dụng một đến bốn biến độc lập (biến phụ thuộc nằm trong cột đầu tiên của khung dữ liệu df1).

# create the combinations of the 4 independent variables
library(foreach)
xcomb <- foreach(i=1:4, .combine=c) %do% {combn(names(df1)[-1], i, simplify=FALSE) }

# create formulas
formlist <- lapply(xcomb, function(l) formula(paste(names(df1)[1], paste(l, collapse="+"), sep="~")))

Nội dung của as.character (danh sách mẫu) là

 [1] "price ~ sqft"                     "price ~ age"                     
 [3] "price ~ feats"                    "price ~ tax"                     
 [5] "price ~ sqft + age"               "price ~ sqft + feats"            
 [7] "price ~ sqft + tax"               "price ~ age + feats"             
 [9] "price ~ age + tax"                "price ~ feats + tax"             
[11] "price ~ sqft + age + feats"       "price ~ sqft + age + tax"        
[13] "price ~ sqft + feats + tax"       "price ~ age + feats + tax"       
[15] "price ~ sqft + age + feats + tax"

Sau đó, tôi đã thu thập một số chỉ số hữu ích

# R squared
models.r.sq <- sapply(formlist, function(i) summary(lm(i))$r.squared)
# adjusted R squared
models.adj.r.sq <- sapply(formlist, function(i) summary(lm(i))$adj.r.squared)
# MSEp
models.MSEp <- sapply(formlist, function(i) anova(lm(i))['Mean Sq']['Residuals',])

# Full model MSE
MSE <- anova(lm(formlist[[length(formlist)]]))['Mean Sq']['Residuals',]

# Mallow's Cp
models.Cp <- sapply(formlist, function(i) {
SSEp <- anova(lm(i))['Sum Sq']['Residuals',]
mod.mat <- model.matrix(lm(i))
n <- dim(mod.mat)[1]
p <- dim(mod.mat)[2]
c(p,SSEp / MSE - (n - 2*p))
})

df.model.eval <- data.frame(model=as.character(formlist), p=models.Cp[1,],
r.sq=models.r.sq, adj.r.sq=models.adj.r.sq, MSEp=models.MSEp, Cp=models.Cp[2,])

Khung dữ liệu cuối cùng là

                      model p       r.sq   adj.r.sq      MSEp         Cp
1                price~sqft 2 0.71390776 0.71139818  42044.46  49.260620
2                 price~age 2 0.02847477 0.01352823 162541.84 292.462049
3               price~feats 2 0.17858447 0.17137907 120716.21 351.004441
4                 price~tax 2 0.76641940 0.76417343  35035.94  20.591913
5            price~sqft+age 3 0.80348960 0.79734865  33391.05  10.899307
6          price~sqft+feats 3 0.72245824 0.71754599  41148.82  46.441002
7            price~sqft+tax 3 0.79837622 0.79446120  30536.19   5.819766
8           price~age+feats 3 0.16146638 0.13526220 142483.62 245.803026
9             price~age+tax 3 0.77886989 0.77173666  37884.71  20.026075
10          price~feats+tax 3 0.76941242 0.76493500  34922.80  21.021060
11     price~sqft+age+feats 4 0.80454221 0.79523470  33739.36  12.514175
12       price~sqft+age+tax 4 0.82977846 0.82140691  29640.97   3.832692
13     price~sqft+feats+tax 4 0.80068220 0.79481991  30482.90   6.609502
14      price~age+feats+tax 4 0.79186713 0.78163109  36242.54  17.381201
15 price~sqft+age+feats+tax 5 0.83210849 0.82091573  29722.50   5.000000

Cuối cùng, một âm mưu Cp (sử dụng thư viện wle)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.