使用下面的代码说明问题。如果你运行它,你会看到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”
答案 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
设置为数据中的预先因素框架,它为我生成预测就好了。
但我建议询问包裹作者是否是预期的行为。这对我来说似乎很奇怪,但就像我说的那样,对于一个这个古老而且使用得很好的软件包来说,似乎很奇怪这样的东西是无意的。