stepwise stepaic stats multivariate funcion r lm

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