在R中的Boruta箱线图

3
我正在使用R中的Boruta包进行变量选择。Boruta在单个图形中给出了标准的一系列箱线图,这很有用,但考虑到我有太多的预测变量,我希望能够限制出现在Boruta图中的箱线图数量。就像以下图片一样。

Boruta plot

基本上,我想要在绘图的右端“缩放”,但不知道如何在boruta绘图对象中实现。谢谢,MR
1个回答

8
听起来像是一个简单的问题,但解决方案似乎异常复杂。也许有人可以想出更快/更优雅的方法...
在这里,我基于源函数plot.Boruta创建了一个新函数,并添加了一个函数参数pars,它接受我们想要包含在图中的变量/预测器的名称。
作为示例,我使用iris数据集来拟合模型。
# Fit model to the iris dataset
library(Boruta);
fit <- Boruta(Species ~ ., data = iris, doTrace = 2);

generateCol函数是被plot.Boruta内部调用的,但它没有被导出,因此在包外不可用。 然而,我们需要该函数来修订我们的plot.Boruta程序。

# generateCol is needed by plot.Boruta
generateCol<-function(x,colCode,col,numShadow){
 #Checking arguments
 if(is.null(col) & length(colCode)!=4)
  stop('colCode should have 4 elements.');
 #Generating col
 if(is.null(col)){
  rep(colCode[4],length(x$finalDecision)+numShadow)->cc;
  cc[c(x$finalDecision=='Confirmed',rep(FALSE,numShadow))]<-colCode[1];
  cc[c(x$finalDecision=='Tentative',rep(FALSE,numShadow))]<-colCode[2];
  cc[c(x$finalDecision=='Rejected',rep(FALSE,numShadow))]<-colCode[3];
  col=cc;
 }
 return(col);
}

我们现在修改plot.Boruta函数,并添加一个函数参数pars,通过该参数我们过滤变量列表。
# Modified plot.Boruta
plot.Boruta.sel <- function(
    x,
    pars = NULL,
    colCode = c('green','yellow','red','blue'),
    sort = TRUE,
    whichShadow = c(TRUE, TRUE, TRUE),
    col = NULL, xlab = 'Attributes', ylab = 'Importance', ...) {

    #Checking arguments
    if(class(x)!='Boruta')
        stop('This function needs Boruta object as an argument.');
    if(is.null(x$ImpHistory))
        stop('Importance history was not stored during the Boruta run.');

    #Removal of -Infs and conversion to a list
    lz <- lapply(1:ncol(x$ImpHistory), function(i)
        x$ImpHistory[is.finite(x$ImpHistory[,i]),i]);
    colnames(x$ImpHistory)->names(lz);

    #Selection of shadow meta-attributes
    numShadow <- sum(whichShadow);
    lz <- lz[c(rep(TRUE,length(x$finalDecision)), whichShadow)];

    #Generating color vector
    col <- generateCol(x, colCode, col, numShadow);

    #Ordering boxes due to attribute median importance
    if (sort) {
        ii <- order(sapply(lz, stats::median));
        lz <- lz[ii];
        col <- col[ii];
    }

    # Select parameters of interest
    if (!is.null(pars)) lz <- lz[names(lz) %in% pars];

    #Final plotting
    graphics::boxplot(lz, xlab = xlab, ylab = ylab, col = col, ...);
    invisible(x);
}

现在我们所需要做的就是调用plot.Boruta.sel而不是plot,并指定我们想要包括的变量。
plot.Boruta.sel(fit, pars = c("Sepal.Length", "Sepal.Width"));

enter image description here


没关系 @MarioReyes 。很高兴能帮助。 - Maurits Evers
谢谢!非常努力!但是为什么上面的图表中Sepal.Width和Sepal.Length显示蓝色,而在完整的Boruta拟合中它们是绿色的? - AussieAndy
这只是颜色选择的问题 @AussieAndy,在函数最后的部分你可以选择自己喜欢的颜色:`#Final plotting graphics::boxplot(lz, xlab = xlab, ylab = ylab, col = col, ...); invisible(x);`因此,你可以通过设置 col = "g" 来选择绿色。 - Amir Charkhi
@Derelict 具体是哪些内容的 data.frame - Maurits Evers
@MauritsEvers 我想将整个输出转换为DF。我找到了一个解决方案,虽然不是很理想,但它可以工作。 - derelict
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接