为什么在原始数据的一个子集上预测,当lm做到这一点时,使用gls会失败?

时间:2014-03-06 16:07:16

标签: r debugging predict nlme

使用下面的代码说明问题。如果你运行它,你会看到lm优雅地处理预测,而gls没有这样做。这很可能是predict.gls中的一个问题,但我不明白为什么。这只是使用因子调用时的一个问题。没有它,一切都很好。我相信predict.gls会失败,因为新数据集中不存在所有级别。但是,lm可以解决这个问题。对我而言,这感觉就像一个错误,但我不够精通gls代码来确定它。

library(nlme)

# lm example
myfit<-lm(mpg~factor(cyl):disp+hp, data=mtcars)
mypred<-predict(myfit, mtcars[1:3, 1:7])

# gls example
myfit2<-gls(mpg~factor(cyl):disp+hp, data=mtcars)
mypred2<-predict(myfit2, mtcars[1:3, 1:7])

失败并显示错误:

# Error in X[, names(cf), drop = FALSE] : subscript out of bounds

有什么想法吗?

我的R.version输出:

平台x86_64-pc-linux-gnu
拱x86_64
os linux-gnu
system x86_64,linux-gnu
状态
专业3 小0.2 2013年 月09日 第25天 svn rev 63987
语言R
version.string R版本3.0.2(2013-09-25) 昵称飞盘航行

nlme包版本:“package'nlme'version 3.1-113”

1 个答案:

答案 0 :(得分:2)

由于我不是predict.gls的作者,我无法准确回答为什么这是以这种方式编写的,但我对于建议不要犹豫不决这是一个功能/包中的错误,已经存在了很长时间。

无论如何......它与lm一起使用的原因是当predict.lm调用model.frame时:

m <- model.frame(Terms, newdata, na.action = na.action, 
            xlev = object$xlevels)

它使用xlev参数和拟合模型对象本身的级别信息。我不相信gls对象可以存储这些信息。

predict.gls中,有两件事正在发生。首先,对model.frame的初始调用:

mfArgs <- list(formula = form, data = newdata, na.action = na.action)
mfArgs$drop.unused.levels <- TRUE
dataMod <- do.call("model.frame", mfArgs)

请注意,我们在这里没有使用xlev参数,事实上我们明确表示要删除未使用的级别。如果您创建自己的predict.gls版本并对drop.unused.levels行发表评论,只要您不在公式中调用factor,就可以。 / em>的

为什么?

因为稍后我们会看到:

X <- model.matrix(form, dataMod)

您的公式正在重新应用。这意味着factor在不存在级别的列上被调用,强制它们被删除。

因此,当我使用predict.gls版本注释drop.unused.levels行,时,我将cyl设置为数据中的预先因素框架,它为我生成预测就好了。

但我建议询问包裹作者是否是预期的行为。这对我来说似乎很奇怪,但就像我说的那样,对于一个这个古老而且使用得很好的软件包来说,似乎很奇怪这样的东西是无意的。