2013-03-04 198 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"