Edit: j'ai mal compris votre question. Il y a deux aspects:
a) na.omitet les na.excludedeux suppriment également les prédicteurs et les critères. Ils diffèrent seulement par le fait que l'extracteur fonctionne comme residuals()ou fitted()remplira leur sortie avec NAs pour les cas omis avec na.exclude, ayant ainsi une sortie de la même longueur que les variables d'entrée.
> 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) Le vrai problème n'est pas avec cette différence entre na.omitet na.exclude, vous ne semblez pas vouloir une suppression également qui prend en compte les variables de critère, ce que les deux font.
> X <- model.matrix(fitE) # design matrix
> dim(X) # casewise deletion -> only 14 complete cases
[1] 14 2
Les résultats de la régression dépendent des matrices (pseudo-inverse de la matrice de conception X , coefficientsX+= ( X′X)- 1X′X) et la matrice de chapeauH=XX+, valeurs ajustées Y =HY). Si vous ne voulez pas la suppression de casas, vous avez besoin d'une matrice de conception différenteXpour chaque colonne deYβ^= X+YH= XX+Y^= HYXY, il n'y a donc aucun moyen d'ajuster des régressions distinctes pour chaque critère. Vous pouvez essayer d'éviter les frais généraux de lm()en faisant quelque chose comme suit:
> 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
Notez qu'il pourrait y avoir de meilleures façons numériquement de calculer et H , vous pouvez plutôt vérifier une décomposition Q R. L'approche SVD est expliquée ici sur SE . Je n'ai pas chronométré l'approche ci-dessus avec de grandes matrices Y par rapport à l'utilisation réelle .X+HQ RYlm()