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找不到的原因wrpart在定义公式的环境中搜索数据、权重等。公式很可能是在某些环境中创建的GlobalEnv,而w是在其他函数中创建的。将公式的环境更改为通过修复w创建的环境。仍然可以找到数据,因为搜索路径将一直持续到. 我不确定为什么可以工作,因为环境不一样,但显然仍在搜索路径上的某个地方parent.framerpartGlobalEnvsys.frame(sys.nframe())w

编辑:sys.frame(sys.nframe())似乎与将forumla的环境设置rpart为调用函数的环境相同(foo3在本例中)。在这种情况下,在 中rpart查找w,datafoo3bar3然后在GlobalEnv.

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 回答
1

根据 rpart 文档(2017 年 3 月 12 日,第 23 页,第 6.1 节),“尚不支持权重,如果存在,将被忽略。”

https://cran.r-project.org/web/packages/rpart/vignettes/longintro.pdf

于 2017-08-07T00:15:09.980 回答
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 回答