voorspelling.lm () in een lus. WAARSCHUWING: Voorspelling van een geschikte pasvorm kan misleidend zijn

Deze R-code gooit een waarschuwing

# 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
}

Ik heb een trainingsgegevenset (C1) en een testdataset (C2). Elk heeft 129 variabelen. Ik heb k gemaakt voor clusteranalyse op de C1 en vervolgens mijn gegevensset opsplitsen op basis van cluster-lidmaatschap en een lijst met verschillende clusters (C1 [[[1]], C1 [[2]], …, C1 [[K] gemaakt ]). Ik heb ook een cluster-lidmaatschap toegewezen aan elk geval in C2 en C2 [[1]], …, C2 [[K]] gemaakt. Dan monteer ik een lineaire regressie aan elk cluster in C1. Mijn afhankelijke variabele is “overlijden”. Mijn voorspellers zijn anders in elk cluster en vars [[I]] (i = 1, …, K) toont een lijst met de naam van voorspellers. Ik wil overlijden voor elk geval voorspellen in testgegevensset (C2 [[1]], …, C2 [[K]). Wanneer ik de volgende code uitvoer, voor enkele van de clusters.

Ik heb deze waarschuwing:

In predict.lm(y[[i]], C2[[i]]) :
prediction from a rank-deficient fit may be misleading

Ik heb veel gelezen over deze waarschuwing, maar ik kon het niet achterhalen wat het probleem is.


Antwoord 1, Autoriteit 100%

U kunt de voorspellingsfunctie inspecteren met body(predict.lm). Daar zie je deze regel:

if (p < ncol(X) && !(missing(newdata) || is.null(newdata))) 
    warning("prediction from a rank-deficient fit may be misleading")

Deze waarschuwing controleert of de rangorde van uw datamatrix ten minste gelijk is aan het aantal parameters dat u wilt aanpassen. Een manier om het aan te roepen is door enkele collineaire covariaten te hebben:

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

Merk op dat x3 en x4 dezelfde richting hebben in data. Het ene is het veelvoud van het andere. Dit kan worden gecontroleerd met length(fit$coefficients) > fit$rank

Een andere manier is om meer parameters te hebben dan beschikbare variabelen:

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

Antwoord 2, autoriteit 28%

Deze waarschuwing:

In predict.lm(model, test) :
  prediction from a rank-deficient fit may be misleading

Wordt gegooid door R’s predict.lm. Zie: http://stat. ethz.ch/R-manual/R-devel/library/stats/html/predict.lm.html

Begrijp rangdeficiëntie: vraag R om u de rangorde van een matrix te vertellen:

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

Een matrix die geen “volledige rang” heeft, wordt “rang deficiënt” genoemd. Er wordt gezegd dat een matrix de volledige rangorde heeft als de rangorde gelijk is aan het aantal kolommen of het aantal rijen (of aan beide).

Het probleem is dat predict.lmdeze waarschuwing zal geven, zelfs als je matrices de volledige rangschikking hebben (niet rang deficiënt) omdat predict.lm een snelle onder de motorkap trekt, door weg te gooien wat het is beschouwt nutteloze functies, het wijzigen van uw volledige rangschikkingsinvoer als rang-deficiënt. Het klaagt er dan over via een waarschuwing.

Ook deze waarschuwing lijkt een allesomvattende oplossing te zijn voor andere situaties, bijvoorbeeld als u te veel invoerfuncties heeft en uw gegevensdichtheid te gering is en het zijn mening geeft dat voorspellingen broos zijn.

Voorbeeld van het passeren van volledige rangmatrices, maar predict.lmklaagt nog steeds over rangdeficiëntie

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

oplossing:

Ervan uitgaande dat voorspellen goede voorspellingen oplevert, kunt u de waarschuwing negeren. predict.lm biedt zijn mening gegeven onvoldoende perspectief en hier ben je.

Dus schakel waarschuwingen op de voorspellingsstap als volgt uit:

options(warn=-1)      #turn off warnings
predict(model, test)
options(warn=1)      #turn warnings back on

Antwoord 3, autoriteit 10%

Het is omdat een van je afhankelijke variabelen NA voor Coëfficiënten heeft, gegeven als uitvoer door de functie lm(..). Een dergelijke variabele maakt geen verschil voor het model, vaak vanwege het multicollineariteitsprobleem, dat wil zeggen dat die voorspellende variabele lineair afhankelijk is van andere voorspellervariabelen OF omdat die voorspellende variabele constant is voor alle records (rijen). Het beste is om die variabele uit de formule in de functie lm(..) te verwijderen en de regressie opnieuw uit te voeren. Dit doet niets af aan de nauwkeurigheid van het model.
In mijn geval,

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

variabel jaar heeft dezelfde waarde voor alle records. Na het verwijderen van jaarvariabele

model <- lm(Happiness.Score ~ Economy..GDP.per.Capita.+Health..Life.Expectancy., data=dfTrain)
preds <- predict.lm(model, dfTest[, c(1:nrow(dfTest)-1]))

Dit geeft geen waarschuwingsbericht

Other episodes