predict.lm() in a loop. warning: prediction from a rank-deficient fit may be misleading

前端 未结 3 909
一向
一向 2020-12-04 21:41

This R code throws a warning

# Fit regression model to each cluster
y <- list() 
length(y) <- k
vars <- list() 
length(vars) <- k
f <- list()
         


        
3条回答
  •  -上瘾入骨i
    2020-12-04 22:24

    You can inspect the predict function with body(predict.lm). There you will see this line:

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

    This warning checks if the rank of your data matrix is at least equal to the number of parameters you want to fit. One way to invoke it is having some collinear covariates:

    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
    

    Notice that x3 and x4 have the same direction in data. One is the multiple of the other. This can be checked with length(fit$coefficients) > fit$rank

    Another way is having more parameters than available variables:

    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
    

提交回复
热议问题