我有一个模型构建函数,它使用公式来定义模型。除了公式类型为 的通常回归情况外y ~ x
,我还想增加添加趋势分量作为解释变量的可能性,该解释变量将在函数内部定义。这是一个例子:
modelx <- function(formula, data,...) {
mf <- mc <- match.call()
mf <- mf[c(1L, match(c("formula", "data"), names(mf), 0L))]
formula_vars <- all.vars(formula)
if ("trend" %in% formula_vars) {
trend <- TRUE
formula <- update.formula(formula, ~. - trend)
} else trend <- FALSE
mf[[2L]] <- formula
mf[[1L]] <- as.name("model.frame")
mf$na.action <- as.name("na.pass")
mf <- eval(mf, parent.frame())
y <- model.response(mf, "numeric")
mt <- attr(mf, "terms")
X <- model.matrix(mt, mf)
# y, X and possible trend component etc. are combined into the model object
if(trend)
X<-cbind(X,1:length(y)) #just an example
list(y=y,X=X)
}
这里的想法是公式的类型是 y ~ x + trend
,并且函数检查是否trend
在公式中调用了一个变量,将其删除并将标志trend
转换为TRUE
,稍后它将用于为模型构建适当的趋势组件。
我想知道有没有更好的方法来实现这一点?这种方法的一个小问题是,可能存在用户想要使用的名称为趋势的变量,并且它与模型的趋势组件混合在一起,另一个问题是例如这种类型的函数不起作用,因为变量trend
不存在:
combn(c(trend,x1,x2),m=2,modelx,y=y)
如果不是trend
我使用 string "trend"
,问题是all.vars(formula)
不捕获字符串。
有什么建议如何处理这种类型的公式,或者任何指向某些函数的指针,这些函数的公式包含这种可能性?