我正在尝试编写一个使用公式表达式的模型构建函数,但我在理解模型update
函数的工作原理时遇到了一些问题。
这是一个精简的函数,它在使用update
函数时会导致错误:
modelx <- function(formula) {
mf <- mc <- match.call()
mf <- mf[c(1L, match("formula", names(mf), 0L))]
mf[[1L]] <- as.name("model.frame")
mf <- eval(mf, parent.frame())
y <- model.response(mf, "numeric")
mt <- attr(mf, "terms")
X <- model.matrix(mt, mf)
out<-list(y=y,X=X)
out$call<-mc
out
}
代码几乎是从lm
函数的开头复制的。一些示例数据和两个模型:
y<-x<-x1<-x2<-1:10
model<-modelx(y ~ x)
model1<-modelx(y ~ x1)
现在更新第一个模型不起作用,但第二个可以:
model<-update(model, . ~ . + x2)
Error in model.frame.default(formula = y ~ x + x2) :
invalid type (list) for variable 'x'
model1<-update(model1, . ~ . + x2)
如果我在out$terms <- mt
的输出中添加一个组件,那么modelx
在这两种情况下一切正常。为什么需要这个组件,为什么更新功能在第二种情况下没有它但在第一种情况下不能工作?