2017-11-17 14 views
1

Borutaパッケージで変数を選択しています。ボルタは標準グラフシリーズを1つのグラフに表示しますが、これは便利ですが、プレゼンターが多すぎるという事実を考えると、ボルタプロットに現れるボックスプロットの数を制限できることを望んでいる。次の画像のようなもの。Borutaボックスプロットin R

Boruta plot

Basicaclyは、私はプロットの右端の「ズーム」にしたいが、どのように行うには考えていることborutaプロットオブジェクトと。

おかげで、

MR

答えて

1

は、簡単な質問のように聞こえるが、解決策は驚くほど複雑なようです。おそらく誰かが速く/よりエレガントな方法...ここ

を思い付くことができ、私はソース機能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); 
} 

は、今、私たちが行う必要があるすべてではなく plotplot.Boruta.selを呼び出し、そして我々は含めたい変数を指定しています。

plot.Boruta.sel(fit, pars = c("Sepal.Length", "Sepal.Width")); 

enter image description here

+0

うわー。どうもありがとう。この答えにはかなりの努力が払われました。ほんとうにありがとう。同じ質問をした他の人たちが将来的に恩恵を受けることを願っています。再び多くのありがとう。 –

+0

@MarioReyesの心配はありません。喜んで助けてください。 –