Chỉnh sửa: Tôi hiểu nhầm câu hỏi của bạn. Có hai khía cạnh:
a) na.omit
và na.exclude
cả hai đều xóa casewise đối với cả hai yếu tố dự đoán và tiêu chí. Chúng chỉ khác nhau ở chỗ các hàm trích xuất như residuals()
hoặc fitted()
sẽ đệm đầu ra của chúng với NA
s cho các trường hợp bị bỏ qua với na.exclude
, do đó có đầu ra có cùng độ dài với các biến đầu vào.
> N <- 20 # generate some data
> y1 <- rnorm(N, 175, 7) # criterion 1
> y2 <- rnorm(N, 30, 8) # criterion 2
> x <- 0.5*y1 - 0.3*y2 + rnorm(N, 0, 3) # predictor
> y1[c(1, 3, 5)] <- NA # some NA values
> y2[c(7, 9, 11)] <- NA # some other NA values
> Y <- cbind(y1, y2) # matrix for multivariate regression
> fitO <- lm(Y ~ x, na.action=na.omit) # fit with na.omit
> dim(residuals(fitO)) # use extractor function
[1] 14 2
> fitE <- lm(Y ~ x, na.action=na.exclude) # fit with na.exclude
> dim(residuals(fitE)) # use extractor function -> = N
[1] 20 2
> dim(fitE$residuals) # access residuals directly
[1] 14 2
b) Vấn đề thực sự không nằm ở sự khác biệt này giữa na.omit
và na.exclude
, dường như bạn không muốn xóa casewise mà đưa các biến tiêu chí vào tài khoản, cả hai đều làm.
> X <- model.matrix(fitE) # design matrix
> dim(X) # casewise deletion -> only 14 complete cases
[1] 14 2
Kết quả hồi quy phụ thuộc vào ma trận (giả của ma trận thiết kế , hệ số ) và chiếc mũ ma trận , giá trị được trang bị ). Nếu bạn không muốn xóa casewise, bạn cần một ma trận thiết kế khác nhau cho mỗi cột của , vì vậy không có cách nào phù hợp với hồi quy riêng cho từng tiêu chí. Bạn có thể cố gắng tránh chi phí bằng cách thực hiện một số thao tác sau: X β = X + Y H = X X + Y = H Y X YX+= ( X'X)- 1X'Xβ^= X+YH= XX+Y^= HYXYlm()
> Xf <- model.matrix(~ x) # full design matrix (all cases)
# function: manually calculate coefficients and fitted values for single criterion y
> getFit <- function(y) {
+ idx <- !is.na(y) # throw away NAs
+ Xsvd <- svd(Xf[idx , ]) # SVD decomposition of X
+ # get X+ but note: there might be better ways
+ Xplus <- tcrossprod(Xsvd$v %*% diag(Xsvd$d^(-2)) %*% t(Xsvd$v), Xf[idx, ])
+ list(coefs=(Xplus %*% y[idx]), yhat=(Xf[idx, ] %*% Xplus %*% y[idx]))
+ }
> res <- apply(Y, 2, getFit) # get fits for each column of Y
> res$y1$coefs
[,1]
(Intercept) 113.9398761
x 0.7601234
> res$y2$coefs
[,1]
(Intercept) 91.580505
x -0.805897
> coefficients(lm(y1 ~ x)) # compare with separate results from lm()
(Intercept) x
113.9398761 0.7601234
> coefficients(lm(y2 ~ x))
(Intercept) x
91.580505 -0.805897
Lưu ý rằng có thể có nhiều cách tốt hơn để tính toán và , thay vào đó , bạn có thể kiểm tra phân tích . Cách tiếp cận SVD được giải thích ở đây trên SE . Tôi đã không tính thời gian cho cách tiếp cận trên với ma trận lớn chống lại việc sử dụng thực sự . H Q R YX+HQ RYlm()