Je voudrais régresser un vecteur B par rapport à chacune des colonnes d'une matrice A. C'est trivial s'il n'y a pas de données manquantes, mais si la matrice A contient des valeurs manquantes, ma régression par rapport à A est contrainte d'inclure uniquement les lignes où tout des valeurs sont présentes (le comportement na.omit par défaut ). Cela produit des résultats incorrects pour les colonnes sans données manquantes. Je peux régresser la matrice de colonnes B contre des colonnes individuelles de la matrice A, mais j'ai des milliers de régressions à faire, ce qui est excessivement lent et inélégant. La fonction na.exclude semble être conçue pour ce cas, mais je ne peux pas la faire fonctionner. Qu'est-ce que je fais mal ici? Utiliser R 2.13 sur OSX, si cela est important.
A = matrix(1:20, nrow=10, ncol=2)
B = matrix(1:10, nrow=10, ncol=1)
dim(lm(A~B)$residuals)
# [1] 10 2 (the expected 10 residual values)
# Missing value in first column; now we have 9 residuals
A[1,1] = NA
dim(lm(A~B)$residuals)
#[1] 9 2 (the expected 9 residuals, given na.omit() is the default)
# Call lm with na.exclude; still have 9 residuals
dim(lm(A~B, na.action=na.exclude)$residuals)
#[1] 9 2 (was hoping to get a 10x2 matrix with a missing value here)
A.ex = na.exclude(A)
dim(lm(A.ex~B)$residuals)
# Throws an error because dim(A.ex)==9,2
#Error in model.frame.default(formula = A.ex ~ B, drop.unused.levels = TRUE) :
# variable lengths differ (found for 'B')
la source
Réponses:
Edit: j'ai mal compris votre question. Il y a deux aspects:
a)
na.omit
et lesna.exclude
deux suppriment également les prédicteurs et les critères. Ils diffèrent seulement par le fait que l'extracteur fonctionne commeresiduals()
oufitted()
remplira leur sortie avecNA
s pour les cas omis avecna.exclude
, ayant ainsi une sortie de la même longueur que les variables d'entrée.b) Le vrai problème n'est pas avec cette différence entre
na.omit
etna.exclude
, vous ne semblez pas vouloir une suppression également qui prend en compte les variables de critère, ce que les deux font.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+Y H= XX+ Y^= HY X Y , 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: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+ H Q R Y
lm()
la source
Je peux penser à deux façons. La première consiste à combiner les données à l'aide de la
na.exclude
, puis à nouveau séparer les données:Une autre façon consiste à utiliser l'
data
argument et à créer une formule.Si vous effectuez beaucoup de régression, la première méthode devrait être plus rapide, car moins de magie d'arrière-plan est effectuée. Bien que si vous n'avez besoin que de coefficients et de résidus, je suggère d'utiliser
lsfit
, ce qui est beaucoup plus rapide quelm
. La deuxième façon est un peu plus agréable, mais sur mon ordinateur portable, essayer de faire un résumé sur la régression résultante génère une erreur. Je vais essayer de voir s'il s'agit d'un bug.la source
L'exemple suivant montre comment faire des prédictions et des résidus qui sont conformes à la trame de données d'origine (en utilisant l'option "na.action = na.exclude" dans lm () pour spécifier que les NA doivent être placés dans les vecteurs résiduels et de prédiction où la trame de données d'origine Il indique également comment spécifier si les prévisions ne doivent inclure que des observations où les variables explicatives et dépendantes sont complètes (c'est-à-dire des prédictions strictement dans l'échantillon) ou des observations où les variables explicatives sont complètes et, par conséquent, la prédiction Xb est possible ( c'est-à-dire, y compris la prédiction hors échantillon pour les observations qui avaient des variables explicatives complètes mais manquaient la variable dépendante).
J'utilise cbind pour ajouter les variables prédites et résiduelles à l'ensemble de données d'origine.
la source