1

使用下面的代码说明了该问题。如果你运行它,你会看到 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
arch x86_64
os linux-gnu
system x86_64, linux-gnu
status
major 3
minor 0.2
year 2013
month 09
day 25
svn rev 63987
language R
version.string R version 3.0.2 (2013-09-25 ) 昵称飞盘帆船

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

4

1 回答 1

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您的公式!

为什么?

因为稍后我们会看到:

X <- model.matrix(form, dataMod)

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

因此,当我使用predict.gls该注释的版本drop.unused.levels并且我设置cyl为数据框中的一个因素时,它会为我生成预测就好了。

但我建议询问包作者这是否是预期的行为。对我来说这似乎很奇怪,但就像我说的那样,对于一个如此古老且使用良好的包裹来说,这样的事情是无意的似乎很奇怪。

于 2014-03-07T17:12:55.473 回答