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.

24
lm r
demandé sur Eric Leschinski 2014-10-25 05:56:07

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
39
répondu Karolis Koncevičius 2014-12-23 01:53:26

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
7
répondu Eric Leschinski 2018-04-16 16:51:54

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

1
répondu Manjunath Bhadrannavar 2018-09-21 12:24:20