基于R中的wilcoxon检验选择单变量特征的任何方法?

问题描述 投票:2回答:1

我打算使用care::sbf进行单变量特征选择,其中我的输入是具有多个变量(又称其列),候选特征列表和标签(又称类别变量)的数据框。阅读caret软件包文档后,我尝试使用sbfsbfController进行功能选择,但在下面遇到了错误:

contrasts<-中的错误(*tmp*,值= contr.funs [1 + isOF [nn]]):对比仅适用于两个或两个以上级别的因子

有人可以指出我该如何解决此错误?使用caret::sbf进行特征选择正确吗?有什么想法吗?

可复制的示例

这里是reproducible example on public gist,我将其用作输入。

我目前的尝试

library(caret)
library(e1071)
library(randomForest)

df=read.csv("df.csv", header=True)

sbfCtrl <- sbfControl(method = 'cv', number = 10, returnResamp = 'final', functions = caretFuncs, saveDetails = TRUE)

model <- sbf(form= ventil_status~ .,
                 data= df,
                 methods='knn',
                 trControl=trainControl(method = 'cv', classProbs = TRUE),
                 tuneGrid=data.frame(k=1:10),
                 sbfControl=sbfControl(functions = sbfCtrl,
                                       methods='repeatedcv', number = 10, repeats = 10))

print(model)
print(model$fit$results)

> model <- sbf(ventil_status~ ., data=df, sizes=c(1,5,10,20),
+              method= 'knn', trControl=trainControl(method = 'cv', classProbs = TRUE),
+              tuneGrid = data.frame(k=1:10),
+              sbfControl=sbfCtrl)
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

我搜索了此错误,但仍然无法克服。有什么想法可以使上面的代码起作用吗?使用caret::sbf进行滤波器选择的正确方法是什么?

我想要的是输出数据帧必须具有附加了其p值的选定要素。所以这是我的尝试:

newdf <- df[ , -which(names(df) %in% c("subject"))]
p_value_vector <- sapply(names(newdf), function(i) 
    tryCatch(
        wilcox.test(newdf[newdf$ventil_status %in% "0", i], 
                        newdf[newdf$ventil_status %in% "1", i], 
                    na.action(na.omit))$p.value),
    warning = function(w) return(NA),
    error = function (e) return(NA)
)

预期输出

我期望具有选定特征的输出数据帧,其中wilcox.test返回的p值应附加到相应的特征。有什么想法可以做到这一点吗?如何正确使用caret::sbf进行功能选择?任何想法?

这是我的R sessioninfo:

> sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggpubr_0.2.5        magrittr_1.5        reshape2_1.4.3     
 [4] forcats_0.5.0       purrr_0.3.3         readr_1.3.1        
 [7] tibble_2.1.3        tidyverse_1.3.0     stringr_1.4.0      
[10] dplyr_0.8.5         scales_1.1.0        tidyr_1.0.2        
[13] aws.s3_0.3.20       randomForest_4.6-14 e1071_1.7-3        
[16] mlbench_2.1-1       caret_6.0-86        ggplot2_3.3.0      
[19] lattice_0.20-38  
r r-caret feature-extraction statistical-test
1个回答
3
投票
对于使用sbf,您可以使用caretSBF,然后添加分数并按照您希望的定义进行过滤:

library(mlbench) library(caret) knnSBF = caretSBF knnSBF$summary <- twoClassSummary knnSBF$score <- function(x, y) { wilcox.test(x ~ y)$p.value } knnSBF$filter <- function(score, x, y) { score <= 0.05 }

© www.soinside.com 2019 - 2024. All rights reserved.