1

rpart次のように、いくつかのモデルに合わせてパッケージを使用しています。

fitmodel = function(formula, data, w) {

    fit = rpart(formula, data, weights = w)
}

カスタム関数を呼び出す

fit = fitmodel(y ~ x1 + x2, data, w)

これにより、次のエラーが発生します。

Error in eval(expr, envir, enclos) : object 'w' not found

それから私は使用することにしました

fitmodel = function(formula, data, w) {

    data$w = w
    fit = rpart(formula, data, weights = w)
}

これは機能しますが、別の問題があります。

これはうまくいきます

fit = fitmodel(y ~ x1 + x2, data, w)

これは動作しません

fit = fitmodel(y ~ ., data, w)

Error in eval(expr, envir, enclos) : object 'w' not found

カスタム関数内で重みを適用する正しい方法は何ですか? ありがとう!

4

3 に答える 3

1

他の誰かがより完全な答えを出してくれることを願っています。rpart見つからない理由wは、数式が定義されている環境でデータ、重みなどを検索するためです。数式は、rpartおそらく何らかの環境で作成され、他の関数内で作成されます。式の環境を作成した環境に変更するという修正を行いました。検索パスは常に に続くため、. 環境が同じではないため、なぜ機能するのかわかりませんが、明らかに検索パスのどこかにあるようですGlobalEnvwwparent.framerpartGlobalEnvsys.frame(sys.nframe())w

edit:で呼び出されるsys.frame(sys.nframe())関数の環境にフォーラムの環境を設定するのと同じようですrpart(foo3この例では)。その場合、で、 などをrpart探し、次に.wdatafoo3bar3GlobalEnv

library(rpart)
data(iris)

bar <- function(formula, data) {
   w <- rpois(nrow(iris), 1)
   print(environment())
   foo(formula, data, w)
}

foo <- function(formula, data, w) {
  print(environment(formula))
  fit <- rpart(formula, data, weights = w)
  return(fit)
}


bar(I(Species == "versicolor") ~ ., data = iris)
## <environment: 0x1045b1a78>
## <environment: R_GlobalEnv>
## Error in eval(expr, envir, enclos) (from #2) : object 'w' not found


bar2 <- function(formula, data) {
  w <- rpois(nrow(iris), 1)
  print(environment())
  foo2(formula, data, w)
}

foo2 <- function(formula, data, w) {
  print(environment(formula))
  environment(formula) <- parent.frame()
  print(environment(formula))
  fit <- rpart(formula, data, weights = w)
  return(fit)
}

bar2(I(Species == "versicolor") ~ ., data = iris)
## <environment: 0x100bf5910>
## <environment: R_GlobalEnv>
## <environment: 0x100bf5910>


bar3 <- function(formula, data) {
  w <- rpois(nrow(iris), 1)
  print(environment())
  foo3(formula, data, w)
}

foo3 <- function(formula, data, w) {
  print(environment(formula))
  environment(formula) <- environment() ## seems to be the same as sys.frame(sys.nframe())
  print(environment(formula))
  print(environment())
  fit <- rpart(formula, data, weights = w)
  return(fit)
}

bar3(I(Species == "versicolor") ~ ., data = iris)
## <environment: 0x104e11bb8>                                                                                                                                                                                                                 
## <environment: R_GlobalEnv>                                                                                                                                                                                                                 
## <environment: 0x104b4ff78>                                                                                                                                                                                                                 
## <environment: 0x104b4ff78>
于 2014-03-07T20:30:38.807 に答える
0

以下のコードを使用してこれを解決できましたが、もっと良い方法があると確信しています:

弱い学習者

fitmodel = function(formula, data, w) {

    # just paste the weights into the data frame
    data$w = w
    rpart(formula, data, weights = w, control = rpart.control(maxdepth = 1))
}

アルゴリズム

ada.boost = function(formula, data, wl.FUN = fitmodel, test.data = NULL, M = 100) {

    # Just rewrites the formula and get ride of any '.'
     dep.var = all.vars(formula)[1]
     vars = attr(terms(formula, data = data), "term.labels")
     formula = as.formula(paste(dep.var, "~", paste(vars, collapse = "+")))


    # ...more code
}

今、すべてが動作します!

于 2014-03-07T20:28:13.340 に答える