prédire.lm() dans une boucle. avertissement: prédiction d'un rang déficientes peuvent être trompeuses
ce code R lance un avertissement
# Fit regression model to each cluster
y <- list()
length(y) <- k
vars <- list()
length(vars) <- k
f <- list()
length(f) <- k
for (i in 1:k) {
vars[[i]] <- names(corc[[i]][corc[[i]]!= "1"])
f[[i]] <- as.formula(paste("Death ~", paste(vars[[i]], collapse= "+")))
y[[i]] <- lm(f[[i]], data=C1[[i]]) #training set
C1[[i]] <- cbind(C1[[i]], fitted(y[[i]]))
C2[[i]] <- cbind(C2[[i]], predict(y[[i]], C2[[i]])) #test set
}
j'ai un jeu de données D'entraînement (C1) et un jeu de données d'essai (C2). Chacune comporte 129 variables. J'ai fait k signifie analyse de cluster sur le C1 et puis divisé mon ensemble de données basé sur la composition de cluster et a créé une liste de différents clusters (C1 [1], C1[2],..., C1 [[k]]). J'ai aussi assigné un groupe de membres à chaque cas dans C2 et créé C2[[1]],..., C2 [[k]]]. Ensuite, j'ajuste une régression linéaire à chaque groupe de C1. Ma variable dépendante est "Mort." Mes prédicteurs sont différents dans chaque groupe et vars[[i]] (i=1,...,k) affiche une liste des noms des prédicteurs. Je veux prédire la mort pour chaque cas dans le jeu de données d'essai (C2[[1]],..., C2 [[k]). Lorsque j'exécute le code suivant, pour certains des groupes.
j'ai eu cet avertissement:
In predict.lm(y[[i]], C2[[i]]) :
prediction from a rank-deficient fit may be misleading
j'ai beaucoup lu à propos de cet avertissement mais je n'ai pas réussi à comprendre quel était le problème.
3 réponses
Vous pouvez inspecter la fonction predict body(predict.lm)
. Vous y verrez cette ligne:
if (p < ncol(X) && !(missing(newdata) || is.null(newdata)))
warning("prediction from a rank-deficient fit may be misleading")
Cet avertissement vérifie si le rang de votre matrice de données est au moins égal au nombre de paramètres que vous souhaitez équiper. Une façon de l'invoquer est d'avoir des covariables collinéaires:
data <- data.frame(y=c(1,2,3,4), x1=c(1,1,2,3), x2=c(3,4,5,2), x3=c(4,2,6,0), x4=c(2,1,3,0))
data2 <- data.frame(x1=c(3,2,1,3), x2=c(3,2,1,4), x3=c(3,4,5,1), x4=c(0,0,2,3))
fit <- lm(y ~ ., data=data)
predict(fit, data2)
1 2 3 4
4.076087 2.826087 1.576087 4.065217
Warning message:
In predict.lm(fit, data2) :
prediction from a rank-deficient fit may be misleading
notez que x3 et x4 ont la même direction dans data
. L'un est le multiple de l'autre. Cela peut être vérifié avec length(fit$coefficients) > fit$rank
une autre façon est d'avoir plus paramètres que les variables disponibles:
fit2 <- lm(y ~ x1*x2*x3*x4, data=data)
predict(fit2, data2)
Warning message:
In predict.lm(fit2, data2) :
prediction from a rank-deficient fit may be misleading
avertissement:
In predict.lm(model, test) :
prediction from a rank-deficient fit may be misleading
lance de R predict.lm
. Voir:http://stat.ethz.ch/R-manual/R-devel/library/stats/html/predict.lm.html
comprendre le manque de grade: demandez à R de vous indiquer le rang d'une matrice:
train <- data.frame(y=c(1234, 325, 152, 403),
x1=c(3538, 324, 382, 335),
x2=c(2985, 323, 223, 288),
x3=c(8750, 322, 123, 935))
test <- data.frame(x1=c(3538, 324, 382, 335),
x2=c(2985, 323, 223, 288),
x3=c(8750, 322, 123, 935))
library(Matrix)
cat(rankMatrix(train), "\n") #prints 4
cat(rankMatrix(test), "\n") #prints 3
Une matrice qui n'a pas de "classement complet" est dit "rang déficientes". Une matrice est dit avoir plein rang si son rang est égale à son nombre de colonnes ou à son nombre de lignes (ou aux deux).
Le problème est que predict.lm
lancera cet avertissement même si vos matrices sont de rang complet (Pas de rang insuffisant) parce que prédire.lm tire un rapide sous le capot, en jetant ce qu'il considère comme des fonctionnalités inutiles, en modifiant votre entrée de rang complet pour qu'elle soit déficiente. Il s'en plaint ensuite par un avertissement.
aussi cet avertissement semble être un piège pour d'autres situations comme par exemple vous en avez trop les caractéristiques d'entrée et votre densité de données est trop clairsemée et il offre l'opinion qu'il est fragile prédictions.
Exemple de passage d'classement complet des matrices, mais predict.lm
se plaint encore de rang carence
train <- data.frame(y=c(1,2,3,4),
x1=c(1,1,2,3),
x2=c(3,4,5,2),
x3=c(4,2,6,0),
x4=c(2,1,3,0))
test <- data.frame(x1=c(1, 2, 3, 9),
x2=c(3, 5, 1, 15),
x3=c(5, 9, 5, 22),
x4=c(9, 13, 2, 99))
library(Matrix)
cat(rankMatrix(train), "\n") #prints 4, is full rank, good to go
cat(rankMatrix(test), "\n") #prints 4, is full rank, good to go
myformula = as.formula("y ~ x1+x2+x3+x4")
model <- lm(myformula, train)
predict(model, test)
#Warning: prediction from a rank-deficient fit may be misleading
prévoir.lm voit que les données de formation ont un gain d'information zéro, et jette des fonctionnalités inutiles (essentiellement tous), puis dit que ce que vous lui avez donné n'est pas fiable parce que le modèle a de graves problèmes.
solution:
en supposant que predict renvoie de bonnes prédictions, vous pouvez ignorer l'avertissement. prédire.lm propose jusqu'à son avis étant donné la perspective insuffisante et vous êtes ici.
donc désactiver les avertissements sur l'étape de prédiction comme ceci:
options(warn=-1) #turn off warnings
predict(model, test)
options(warn=1) #turn warnings back on
c'est parce que, une de vos variables dépendantes A NA pour les Coefficients donnés en sortie par le lm(..) fonction. Une telle variable ne fait aucune différence dans le modèle, souvent en raison d'un problème de multicollinéarité, c'est-à-dire que la variable prédictive dépend de façon linéaire d'autres variables prédictives ou parce que cette variable prédictive est constante pour tous les enregistrements(rangées). La meilleure chose à faire est de supprimer cette variable de la formule de lm(..) de la fonction et de faire la régression de nouveau. Ce n'est pas de réduire la précision du modèle. Dans mon cas,
model <- lm(Happiness.Score ~ Economy..GDP.per.Capita.+year+Health..Life.Expectancy., data=dfTrain)
> model
Call:
lm(formula = Happiness.Score ~ Economy..GDP.per.Capita. + year +
Health..Life.Expectancy., data = dfTrain)
Coefficients:
(Intercept) Economy..GDP.per.Capita. year
3.036 1.569 NA
Health..Life.Expectancy.
1.559
variable d'année a la même valeur pour tous les enregistrements. Après suppression de la variable d'année
model <- lm(Happiness.Score ~ Economy..GDP.per.Capita.+Health..Life.Expectancy., data=dfTrain)
preds <- predict.lm(model, dfTest[, c(1:nrow(dfTest)-1]))
ceci ne donne pas de message d'avertissement