我正在使用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
在自定义函数中应用权重的正确方法是什么?谢谢!
答案 0 :(得分:1)
希望其他人提供更完整的答案。 rpart
无法找到w
的原因是rpart
在环境中搜索为数据,权重等定义公式。公式是在某些环境中创建的,很可能是GlobalEnv
和w
是在其他一些函数中创建的。将公式的环境更改为使用w
创建parent.frame
的环境。 rpart
仍然可以找到数据,因为搜索路径始终会继续GlobalEnv
。我不确定为什么sys.frame(sys.nframe())
有效,因为环境不一样,但显然w
仍在搜索路径的某个地方
编辑:sys.frame(sys.nframe())
似乎与将forumla的环境设置为函数rpart
的环境相同(在此示例中为foo3
)。在这种情况下,rpart
会在w
中找到data
,foo3
等,然后是bar3
,然后是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>
答案 1 :(得分:1)
根据rpart文档(2017年3月12日,第23页,第6.1节),&#34;权重尚不支持,如果存在,将被忽略。&#34;
https://cran.r-project.org/web/packages/rpart/vignettes/longintro.pdf
答案 2 :(得分: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
}
现在一切正常!