Modifica: ho frainteso la tua domanda. Ci sono due aspetti:
a) na.omited na.excludeentrambi effettuano la cancellazione caso per caso sia rispetto ai predittori che ai criteri. Differiscono solo per il fatto che funzioni dell'estrattore come residuals()o fitted()riempiranno il loro output con NAs per i casi omessi na.exclude, con un output della stessa lunghezza delle variabili di input.
> 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) Il vero problema non è con questa differenza tra na.omite na.exclude, non sembri voler cancellare caso per caso che tenga conto delle variabili di criterio, cosa che entrambi fanno.
> X <- model.matrix(fitE) # design matrix
> dim(X) # casewise deletion -> only 14 complete cases
[1] 14 2
I risultati della regressione dipendono dalle matrici (pseudoinverso della matrice di progettazione , coefficienti ) e il cappello matrice , valori adattati ). Se non si desidera la cancellazione caso per caso, è necessaria una matrice progettazione diversa per ogni colonna di , quindi non è possibile aggirare regressioni separate per ciascun criterio. Puoi provare a evitare il sovraccarico di fare qualcosa in linea con quanto segue: 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
Nota che potrebbero esserci modi numericamente migliori per caculare e , puoi invece controllare una decomposizione . L'approccio SVD è spiegato qui su SE . Non ho cronometrato l'approccio sopra con grandi matrici contro l'utilizzo effettivo . H Q R YX+HQRYlm()