संपादित करें: मैंने आपके प्रश्न को गलत समझा। इसके दो पहलू हैं:
a) na.omit
और na.exclude
दोनों ही भविष्यवाणियों और कसौटियों के संबंध में कैविज़ विलोपन करते हैं। वे केवल कि निकालने कार्यों की तरह में मतभेद है residuals()
या fitted()
के साथ अपने उत्पादन इच्छा पैड NA
के साथ छोड़े गए मामलों के लिए रों 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
ख) असली मुद्दा इस अंतर के बीच का नहीं है na.omit
और na.exclude
, आप ऐसा नहीं चाहते हैं कि कैसवाइज़ विलोपन हो जो मानदंड चर को ध्यान में रखता है, जो दोनों करते हैं।
> X <- model.matrix(fitE) # design matrix
> dim(X) # casewise deletion -> only 14 complete cases
[1] 14 2
प्रतिगमन परिणाम मैट्रिक्स पर निर्भर (डिजाइन मैट्रिक्स के Pseudoinverse एक्स , गुणांक β = एक्स + Y ) और टोपी मैट्रिक्स एच = एक्स एक्स + , फिट मान Y = एच य )। यदि आप कैसवाइज़ विलोपन नहीं चाहते हैं, तो आपको Y के प्रत्येक कॉलम के लिए एक अलग डिज़ाइन मैट्रिक्स X की आवश्यकता होगीएक्स+= ( एक्स)'एक्स)- 1एक्स'एक्सβ^= एक्स+Yएच= एक्सएक्स+Y^= एचYएक्सY, इसलिए प्रत्येक कसौटी के लिए अलग-अलग रजिस्टरों को फिट करने का कोई तरीका नहीं है। आप lm()
निम्नलिखित की तर्ज पर कुछ करने से बचने की कोशिश कर सकते हैं :
> 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
ध्यान दें कि और H को Caculate करने के लिए संख्यात्मक रूप से बेहतर तरीके हो सकते हैं, आप इसके बजाय Q R -decomposition की जाँच कर सकते हैं । एसवीडी-दृष्टिकोण को एसई पर यहां समझाया गया है । मैंने वास्तव में उपयोग करने के खिलाफ बड़े मैट्रिस वाई के साथ उपरोक्त दृष्टिकोण को समयबद्ध नहीं किया है ।एक्स+एचक्यू आरYlm()