首页 文章

R:glmrob不能预测具有下降的共线列的模型,而glm可以吗?

提问于
浏览
0

我正在学习在R中实现强大的glms,但无法弄清楚为什么当我的模型中由于共线性导致某些列被丢弃时,我无法让glmrob预测回归模型中的值 . 特别是当我使用预测函数来预测glmrob的值时,它总是为所有值提供NA . 当使用glm预测来自相同数据和模型的值时,我没有观察到这一点 . 我使用的数据似乎并不重要 - 只要拟合模型中存在NA系数(并且NA不是系数向量中的最后一个系数),预测就不起作用 .

此行为适用于我尝试过的由于共线性而丢弃内部列的所有数据集和模型 . 我包含一个假数据集,其中从模型中删除了两列,这在系数列表中给出了两个NA . glm和glmrob都给出几乎相同的系数,但预测只适用于glm模型 . 所以我的问题是:我不理解强大的回归会阻止我的glmrob模型产生预测值?

library(robustbase)

#Make fake data with two categorial predictors
df <- data.frame("category" = rep(c("A","B","C"),each=6))
df$location <- rep(1:6,each=3)
val <- rep(c(500,50,5000),each=6)+rep(c(50,100,25,200,100,1),each=3)
df$value <- rpois(NROW(df),val)

#note that predict works if we omit the newdata parameter. However I need the newdata param
#so I use the original dataframe here as a stand-in.  
mod <- glm(val ~ category + as.factor(location), data=df, family=poisson)
predict(mod, newdata=df) # works fine

mod <- glmrob(val ~ category + as.factor(location), data=df, family=poisson)
predict(mod, newdata=df) #predicts NA for all values

1 回答

  • 0

    我一直在深入研究这个问题,并得出结论,问题不在于我对鲁棒回归的理解,而是问题在于robustbase包中的一个错误 . predict.lmrob函数在预测之前没有从模型中正确地选择必要的系数 . 它需要选择前x个非NA系数(其中x =模型矩阵的秩) . 相反,它只选择前x个系数而不检查它们是否为NA . 这解释了为什么这个问题仅适用于NA不是系数向量中最后一个系数的模型 .

    为了解决这个问题,我使用以下方法复制了predict.lmrob源:

    getAnywhere(predict.lmrob)
    

    并创建了我自己的替换功能 . 在这个函数中,我对代码进行了一次修改:

    ...
    p <- object$rank
    if (is.null(p)) {
        df <- Inf
        p <- sum(!is.na(coef(object)))
        #piv <- seq_len(p) # old code
        piv <- which(!is.na(coef(object))) # new code
    }
    else {
        p1 <- seq_len(p)
        piv <- if (p) 
            qr(object)$pivot[p1]
    }
    ...
    

    我使用此更改运行了几百个数据集,并且运行良好 .

相关问题