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.lm
deze 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.lm
klaagt 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