2012-04-14 5 views
5

式の右辺をR関数に渡して、式の左辺を「加算」してgam()を呼び出したいとします。私はこれを醜いas.formula()の構築などなしで達成したいと思います。式の右辺を別の式に渡すにはどうすればよいですか?

私は次の最小限の例で立ち往生しました。

require(mgcv) 
set.seed(0) ## set.seed(1) 
gamEx1 <- gamSim(1, n=400, dist="normal", scale=2) ## simulate some data 
str(gamEx1) ## display structure 

## calling gam() and passing the right-hand side of a formula 
gamFitter <- function(formula.RHS, data, ...){ 
    z <- 2*data$y + data$f0 # some given values 
    gam(z ~ formula.RHS, data=data, ...) # call gam() 
} 

## call the function with the right-hand side of a formula 
gamFitter(formula.RHS=~s(x0)+s(x1)+s(x2)+s(x3), data=gamEx1) 

Error in model.frame.default(formula = z ~ formula.RHS, data = data, 
          drop.unused.levels = TRUE) : 
    invalid type (language) for variable 'formula.RHS' 

答えて

12

それはそうあなたは、Rの組み込みの機能を使用する必要がありますmely update.formula、新機能記述する必要はありません:他の回答に

> form <- ~s(x0)+s(x1)+s(x2)+s(x3) 
> form 
~s(x0)+s(x1)+s(x2)+s(x3) 
> update.formula(form, z ~ .) 
z ~ s(x0) + s(x1) + s(x2) + s(x3) 
+0

ありがとう、デレク、私はこの機能が存在するのか分からなかった。 –

+0

@MariusHofertこの答えは、現在受け入れられているよりもエレガントです。受け入れを再考できますか? – Andrie

4

場しのぎが、それは動作します:

form1 <- as.formula("hi ~ lo + mid") 
form2 <- as.formula("blue ~ red + green") 
form2[[3]] <- form1[[3]] 
> form2 
blue ~ lo + mid 
+0

まあ、私が書いたように、私は* 'as.formulaを(使用したくない*)'と文字列、それは単に悪い習慣です。とにかくありがとう。 –

+0

@MariusHofert - 'as.formula()'について悪い習慣を説明できますか? – Chase

+0

数式は式であり、そのように扱う必要があります。それを文字列で変換/処理するのは悪い習慣です。数式で関数を構築するために推奨されるアプローチは、ここで扱われます:http://developer.r-project.org/model-fitting-functions.txt文字列を含まない*良い*例は2つあります。 'as.formula()')は関数 'lm()'と '(mgcv::) gam'です。 –

5

は、ここでの@ GSK3のアイデア時にバージョン建物です:

changeLHS <- function(formula, lhs) { 
    if (length(formula) == 2) { 
    formula[[3]] <- formula[[2]] 
    } 
    formula[[2]] <- substitute(lhs) 
    formula 
} 

changeLHS(a~b+c, z+w) # z + w ~ b + c 
changeLHS(~b+c, z+w) # z + w ~ b + c 

だから、あなたのコードは次のようになります。

gamFitter <- function(formula.RHS, data, ...){ 
    frm <- changeLHS(formula.RHS, 2*y + f0) 
    gam(frm, data=data, ...) # call gam() 
} 
+0

*ニース*、ありがとう。私は 'rhs'が' changeLHS'の 'lhs'ではっきりさせるべきだと思いますが、間違いなくうまくいきます。 –

+0

@MariusHofert - 良い点、私はそれを変更しました。今、「右手側」が残っていますよね? ;-) – Tommy

0

ビルをあなたはLHS programmatically by passing strings(アラカルトをreformulate)交換する必要がある場合、2つの小さな微調整を助けることができます。

トミーのアプローチ@使用:

changeLHS <- function(formula, lhs) { 
    if (length(formula) == 2) { 
     formula[[3]] <- formula[[2]] 
    } 
    formula[[2]] <- as.symbol(lhs) 
    formula 
} 

form <- ~s(x0)+s(x1)+s(x2)+s(x3) 
changeLHS(form, "z") 
## z ~ s(x0) + s(x1) + s(x2) + s(x3) 

をデレクのアプローチ@使用:

update(form, reformulate(".", "z")) 
## z ~ s(x0) + s(x1) + s(x2) + s(x3) 
関連する問題