stepaic - predict.lm() en un bucle. advertencia: la predicción de un ajuste de rango deficiente puede ser engañosa
stepaic r (3)
Este código R lanza una advertencia.
# 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
}
Tengo un conjunto de datos de entrenamiento (C1) y un conjunto de datos de prueba (C2). Cada una tiene 129 variables. Hice k significa análisis de conglomerados en el C1 y luego dividí mi conjunto de datos según la membresía del conglomerado y creé una lista de diferentes conglomerados (C1 [[1]], C1 [[2]], ..., C1 [[k] ]). También asigné una membresía a cada caso en C2 y creé C2 [[1]], ..., C2 [[k]]. Luego coloco una regresión lineal para cada grupo en C1. Mi variable dependiente es "la muerte". Mis predictores son diferentes en cada grupo y las vars [[i]] (i = 1, ..., k) muestran una lista del nombre de los predictores. Quiero predecir la muerte para cada caso en el conjunto de datos de prueba (C2 [[1]], ..., C2 [[k]). Cuando ejecuto el siguiente código, para algunos de los clusters.
Recibí esta advertencia:
In predict.lm(y[[i]], C2[[i]]) :
prediction from a rank-deficient fit may be misleading
Leí mucho sobre esta advertencia, pero no pude averiguar cuál es el problema.
Puede inspeccionar la función de predicción con body(predict.lm)
. Allí podrás ver esta línea:
if (p < ncol(X) && !(missing(newdata) || is.null(newdata)))
warning("prediction from a rank-deficient fit may be misleading")
Esta advertencia comprueba si el rango de su matriz de datos es al menos igual al número de parámetros que desea ajustar. Una forma de invocarlo es tener algunas covariables colineales:
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
Observe que x3 y x4 tienen la misma dirección en los data
. Uno es el múltiplo del otro. Esto se puede verificar con la length(fit$coefficients) > fit$rank
Otra forma es tener más parámetros que las 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
Se debe a que una de sus variables dependientes tiene NA para los coeficientes dados como resultado de la función lm (..). Dicha variable no hace ninguna diferencia en el modelo, a menudo debido a un problema de multicolinealidad, es decir, que la variable predictiva depende linealmente de otras variables predictoras O porque, esa variable predictiva es constante para todos los registros (filas). Lo mejor que puede hacer es eliminar esa variable de la fórmula en la función lm (..) y volver a realizar la regresión. Esto no reduce la precisión del modelo. En mi caso,
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
El año variable tiene el mismo valor para todos los registros. Después de eliminar la variable año
model <- lm(Happiness.Score ~ Economy..GDP.per.Capita.+Health..Life.Expectancy., data=dfTrain)
preds <- predict.lm(model, dfTest[, c(1:nrow(dfTest)-1]))
Esto no da ningún mensaje de advertencia
Esta advertencia:
In predict.lm(model, test) :
prediction from a rank-deficient fit may be misleading
Se tira de la predict.lm
de predict.lm
Consulte: http://stat.ethz.ch/R-manual/R-devel/library/stats/html/predict.lm.html
Comprender la deficiencia de rango: Pídale a R que le diga el rango de una matriz:
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
Una matriz que no tiene "rango completo" se dice que es "deficiente de rango". Se dice que una matriz tiene rango completo si su rango es igual a su número de columnas o a su número de filas (o a ambos).
El problema es que predict.lm
emitirá esta advertencia incluso si sus matrices tienen rango completo (no es deficiente en rango) porque predict.lm saca un rápido bajo el capó, eliminando lo que considera características inútiles, modificando su entrada de rango completo a ser de rango deficiente. Luego se queja de ello a través de una advertencia.
Además, esta advertencia parece ser un punto de encuentro para otras situaciones como, por ejemplo, tiene demasiadas funciones de entrada y su densidad de datos es demasiado escasa y ofrece una opinión de que las predicciones son frágiles.
Ejemplo de pasar matrices de rango completo, pero predict.lm
Todavía predict.lm
quejándose de deficiencia de rango
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
predict.lm ve que los datos de entrenamiento tienen cero ganancias de información, y está eliminando características inútiles (básicamente todas), luego dice que lo que le ha dado no es confiable porque el modelo tiene problemas serios.
solución:
Suponiendo que la predicción está devolviendo buenas predicciones, puede ignorar la advertencia. predict.lm ofrece su opinión dada una perspectiva insuficiente y aquí está.
Así que deshabilite las advertencias en el paso de predicción como este:
options(warn=-1) #turn off warnings
predict(model, test)
options(warn=1) #turn warnings back on