创建循环/函数以消除否定的varImp结果

时间:2018-07-18 08:51:43

标签: r regression

我想创建一个用于对数据建模的循环,获取变量的重要性,分配负值/重要性列,并从数据中进行过滤,然后再次对其进行建模,直到没有负值为止。在下面,您可以看到用于创建模型和获得变量重要性的示例代码:

library(party)
library(caret)
model_cforest <- cforest(drat~.,data=mtcars,controls=cforest_unbiased())
cforest_var <- varImp(model_cforest,conditional=TRUE)

我们可以看到 cforest_var 给出了此表:

          Overall
mpg   0.009778909
cyl   0.033507134
disp  0.056359569
hp    0.000000000
wt    0.044186730
qsec  0.000000000
vs   -0.000309504
am    0.050791540
gear  0.060967894
carb  0.000000000

在此表的基础上,我想删除列 vs (具有负值)并再次运行cforest模型(如果再次存在负值,则删除并运行模型,直到没有负值)。

最终结果应该是包含最重要变量的表。

据我所知:

removeNeg <- function(data){
  model_cforest <- cforest(drat~., mtcars,controls=cforest_unbiased())
  cforest_var <- varImp(model_cforest,conditional=TRUE)
  varImp_neg <- row.names(cforest_var)[apply(cforest_var, 1, function(u) any(u < 0))]
}

但是我感觉方向不对,只能停留在一个地方。谢谢帮助!

2 个答案:

答案 0 :(得分:2)

使用loop时使用的解决方案

对给定数据运行cforest模型的功能:

getForest <- function(data) {
    library(caret)
    library(party)
    model_cforest <- cforest(drat ~ ., data, controls = cforest_unbiased())
    varImp(model_cforest, conditional = TRUE)
}

如果有任何负while结果,则运行varImp循环的函数。

getForestRemove <- function(data = mtcars) {
    resultModel <- getForest(data)
    resultSign  <- sign(resultModel$Overall)
    while(any(resultSign == -1)) {
        resultModel <- getForest(data[c("drat", rownames(resultModel)[resultSign != -1])])
        resultSign  <- sign(resultModel$Overall)
    }
    return(resultModel)    
}

getForestRemove()
# No negative results
#         Overall
# mpg  0.006325008
# cyl  0.019562726
# disp 0.050269930
# wt   0.065210330
# qsec 0.000000000
# am   0.041387607
# gear 0.085664931
# carb 0.000000000

答案 1 :(得分:1)

您可以使用recursion来调用自身内部的函数以再次执行操作

removeNeg <- function(dat){
  model_cforest <- cforest(drat~., data=dat,controls=cforest_unbiased())
  cforest_var <- varImp(model_cforest,conditional=TRUE)
  varImp_neg <- rownames(cforest_var)[cforest_var$Overall<0];varImp_neg
  if(length(varImp_neg)) removeNeg(dat[setdiff(names(dat),varImp_neg)])
  else cforest_var
}

removeNeg(mtcars)
         Overall
mpg  0.008729557
cyl  0.017711035
disp 0.052728670
hp   0.000000000
wt   0.069339311
qsec 0.000000000
am   0.038151787
gear 0.073904189
carb 0.000000000