2

我正在尝试编写一个使用公式表达式的模型构建函数,但我在理解模型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在这两种情况下一切正常。为什么需要这个组件,为什么更新功能在第二种情况下没有它但在第一种情况下不能工作?

4

1 回答 1

4

如果您查看update( ?update) 的帮助,它会告诉您:

描述

update 将更新并(默认情况下)重新拟合模型。它通过提取存储在对象中的调用、更新调用和(默认情况下)评估该调用来做到这一点。有时仅使用一个参数调用更新很有用,例如,如果数据框已被更正。

update() 和类似函数中的“提取调用”使用 getCall(),它本身是一个 (S3) 泛型函数,具有简单获取 x$call 的默认方法。

因此,update() 通常会(通过其默认方法)在新模型类上工作,要么自动,要么为该类提供简单的 getCall() 方法。

用法

更新(对象,...)

调用(x,...)

在我看来,冲突正在发生,因为信息正在传递给参数名称getCall所在的函数,x然后这会与您的名称发生冲突,x并且语言正在选择本地x而不是您的x.

于 2013-03-04T13:19:37.450 回答