5

数式の右辺をR関数に渡し、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'
4

4 に答える 4

12

Rの組み込み機能を使用する必要があるようです。つまり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)
于 2012-05-03T20:22:39.457 に答える
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()
}
于 2012-04-14T17:35:34.507 に答える
4

Kludgyですが、機能します:

form1 <- as.formula("hi ~ lo + mid")
form2 <- as.formula("blue ~ red + green")
form2[[3]] <- form1[[3]]
> form2
blue ~ lo + mid
于 2012-04-14T15:36:26.903 に答える
0

他の答えに基づいて、文字列(àla )を渡すことによってプログラムでLHSを置き換える必要がある場合はreformulate、2つの小さな調整が役立ちます。

@Tommyのアプローチの使用:

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)

@Derekのアプローチを使用する:

update(form, reformulate(".", "z"))
## z ~ s(x0) + s(x1) + s(x2) + s(x3)
于 2016-03-21T22:17:11.020 に答える