แก้ไข: ฉันเข้าใจผิดคำถามของคุณ มีสองด้าน:
ก) na.omit
และna.exclude
ทั้งสองทำการลบอย่างน่าพิศวงด้วยความเคารพต่อทั้งตัวทำนายและเกณฑ์ พวกเขาแตกต่างกันในฟังก์ชั่นการแยกเช่นresiduals()
หรือfitted()
จะ pad เอาท์พุทของพวกเขากับNA
s สำหรับกรณีที่ถูกละเว้นด้วยna.exclude
จึงมีเอาท์พุทของความยาวเดียวกันกับตัวแปรอินพุต
> 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) ปัญหาที่แท้จริงไม่ได้อยู่ที่ความแตกต่างระหว่างนี้na.omit
และna.exclude
คุณไม่ต้องการให้มีการลบแบบ casewise ที่คำนึงถึงตัวแปรเงื่อนไขซึ่งทั้งสองทำ
> X <- model.matrix(fitE) # design matrix
> dim(X) # casewise deletion -> only 14 complete cases
[1] 14 2
ผลลัพธ์การถดถอยจะขึ้นอยู่กับเมทริกซ์ (pseudoinverse ของเมทริกซ์การออกแบบ , สัมประสิทธิ์ ) และหมวก เมทริกซ์ , ค่าติดตั้ง ) หากคุณไม่ต้องการการลบแบบ Casewise คุณต้องมีเมทริกซ์การออกแบบแตกต่างกันสำหรับแต่ละคอลัมน์ของดังนั้นจึงไม่มีวิธีแก้ไขการถดถอยแบบแยกต่างหากสำหรับแต่ละเกณฑ์ คุณสามารถพยายามหลีกเลี่ยงค่าใช้จ่ายโดยทำบางสิ่งตามบรรทัดต่อไปนี้: 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
โปรดทราบว่าอาจมีวิธีที่ดีกว่าตัวเลขในการคำนวณและคุณสามารถตรวจสอบ -decomposition แทน SVD-วิธีการจะมีการอธิบายที่นี่ใน SE ฉันไม่ได้หมดเวลาวิธีการข้างต้นด้วยการฝึกอบรมใหญ่กับการใช้จริง H Q R YX+HQRYlm()