2013-03-04 108 views
1

我有一个模型构建函数,它使用公式来定义模型。除了公式类型为y ~ x的通常回归情况外,我还想添加例如趋势分量作为解释变量的可能性,该变量将在函数内部定义。下面是一个例子:类型y〜x +趋势或y〜x +“趋势”的R公式,其中趋势/“趋势”用作指标?

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变量是在该式中,删除它并接通标志trendTRUE,其将在以后使用以便为该模型构建适当的趋势组件。

我想知道是否有更好的方法来完成此?这种方法的一个小问题是,用户想要使用的名称趋势可能会变化,并且会与模型的趋势分量混合在一起,另一个问题是,例如,此类功能不起作用,因为变量trend不存在:

combn(c(trend,x1,x2),m=2,modelx,y=y) 

如果,而不是trend我用字符串"trend",问题是all.vars(formula)不捕获字符串。

任何建议如何处理这种类型的公式,或任何指向某些函数的指针,这些函数的公式包含这种类型的可能性?

+0

解决我缺少的东西?看起来最明显的做法是给你的'modelx'函数一个'trend'参数,它将被赋予'TRUE'或'FALSE'值,那么你不需要用公式来解决。 – Marius 2013-03-04 10:23:18

+0

的确,我的例子太简单了。在我的真实应用程序中,我有几种这类指标,所以我觉得将模型定义为'xmodel(y〜x + ind1 + ind2 + ind3)'而不是'xmodel(y〜x, IND1 = IND1,IND2 = IND2,IND3 = IND3)'。 – 2013-03-04 10:31:46

+0

我可以看到这一点,但你正在为自己做很多辛苦的工作,只有这样你才能实现将参数填入公式规范的可疑目标。参数(因为这就是它们)被从公式规范中提取出来并几乎立即转换回参数/标志。 – Marius 2013-03-04 10:36:10

回答

1

这里使用reshape2

unlist(reshape2:::parse_formula(y~x+'trend')) 
[[1]] 
y 

[[2]] 
x 

[[3]] 
[1] "trend"