2011-07-30 38 views
8

Vì vậy, tôi đang gặp một số vấn đề với một số NA giá trị trong dư của một hồi quy cắt ngang lm trong R.Làm cách nào để đối phó với NA trong số dư trong hồi quy trong R?

Vấn đề không phải là NA giá trị bản thân, đó là cách R trình bày chúng.

Ví dụ:

test$residuals 
#   1   2   4   5 
# 0.2757677 -0.5772193 -5.3061303 4.5102816 
test$residuals[3] 
#  4 
# -5.30613 

Trong ví dụ đơn giản này một giá trị NA sẽ làm cho một trong những dư đi mất tích. Khi tôi trích xuất số dư, tôi có thể thấy rõ chỉ số thứ ba bị thiếu. Cho đến nay rất tốt, không có khiếu nại ở đây. Vấn đề là các vector số tương ứng bây giờ là một mục ngắn hơn để chỉ số thứ ba thực sự là thứ tư. Làm cách nào để tôi có thể tạo R trả lại các số dư này thay vào đó, tức là, hiển thị rõ ràng NA thay vì bỏ qua chỉ mục?

test$residuals 
#   1   2   3   4   5 
# 0.2757677 -0.5772193   NA -5.3061303 4.5102816 

Tôi cần phải theo dõi tất cả số dư riêng lẻ để làm cho cuộc sống của tôi dễ dàng hơn nhiều nếu tôi có thể trích xuất theo cách này.

Trả lời

11

Tôi vừa tìm thấy this googling xung quanh sâu hơn một chút. Chức năng resid trên lm với na.action=na.exclude là cách để thực hiện.

1

Đây là chiến lược được minh họa sử dụng ví dụ được sửa đổi đôi chút trên trang trợ giúp lm. Đây là một ứng dụng trực tiếp của định nghĩa về số dư:

## Annette Dobson (1990) "An Introduction to Generalized Linear Models". 
## Page 9: Plant Weight Data. 
# Two NA's introduced 
weight <- c(4.17,5.58,NA,6.11,4.50,4.61,5.17,4.53,5.33,5.14, 
4.81,4.17,4.41,3.59,5.87,3.83,6.03,NA,4.32,4.69) 
group <- gl(2,10,20, labels=c("Ctl","Trt")) 
lm.D9 <- lm(weight ~ group) 
rr2 <- weight- predict(lm.D9, na.action=na.pass) 
Warning message: 
In weight - predict(lm.D9, na.action = na.pass) : 
    longer object length is not a multiple of shorter object length 
> rr2 
[1] -0.8455556 0.5644444   NA 1.0944444 -0.5155556 -0.4055556 0.1544444 
[8] -0.4855556 0.3144444 0.5044444 0.1744444 -0.4655556 -0.2255556 -1.0455556 
[15] 1.2344444 -0.8055556 1.3944444   NA -0.6955556 -0.3255556 

Tôi nghĩ rằng sẽ nguy hiểm khi trực tiếp sửa đổi đối tượng lm sao cho lm.D9 $ còn lại sẽ trả về kết quả đó.

3

Một ý tưởng khác là tận dụng các tên hàng được liên kết với khung dữ liệu được cung cấp làm đầu vào cho lm. Trong trường hợp đó, số dư phải giữ lại tên từ dữ liệu nguồn. Truy cập số dư từ ví dụ của bạn sẽ cung cấp giá trị là -5.3061303 cho test$residuals["4"] và NA cho test$residuals["3"].

Tuy nhiên, điều này không trả lời chính xác câu hỏi của bạn. Một cách tiếp cận để làm chính xác những gì bạn yêu cầu về mặt nhận các giá trị NA trở lại dư được minh họa dưới đây:

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA) 
> Z<-lm(y~x,data=D) 
> D[names(Z$residuals),"residual"]<-Z$residuals 
> D 
    x y residual 
1 NA 2.1  NA 
2 2 3.2 -0.28 
3 3 4.9  0.55 
4 4 5.0 -0.22 
5 5 6.0 -0.09 
6 6 7.0  0.04 

Nếu bạn đang làm dự đoán dựa trên các kết quả hồi quy, bạn có thể muốn xác định na.action=na.exclude trong lm . Xem kết quả trợ giúp cho na.omit để thảo luận. Lưu ý rằng chỉ cần chỉ định na.exclude không thực sự đặt các giá trị NA trở lại vào chính vectơ còn lại.

Như đã đề cập trong một câu trả lời trước đó, resid (đồng nghĩa với residuals) cung cấp một chức năng truy cập chung chung, trong đó dư sẽ chứa NA mong muốn đánh giá cao nếu na.exclude được quy định tại lm. Sử dụng resid có lẽ là tổng quát hơn và cách tiếp cận rõ ràng hơn. Trong trường hợp đó, mã cho ví dụ trên sẽ được đổi thành:

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA) 
> Z<-lm(y~x,data=D,na.action=na.exclude) 
> D$residuals<-residuals(Z) 
Các vấn đề liên quan