我一直在玩R中实现CV,但在LOOCV中的折叠中遇到了一个奇怪的问题。
首先,我会随机生成数据和标签,然后我会在randomForest上找到应该只是噪音的内容。从返回的循环中,我不仅获得了良好的AUC,而且获得了来自t检验的显着p值。我不明白这在理论上是如何发生的,所以我很好奇我尝试生成数据/标签的方式最好吗?
以下是显示我的问题的代码段。
library(randomForest)
library(pROC)
n=30
p=900
set.seed(3)
XX=matrix(rnorm(n*p, 0, 1) , nrow=n)
YY=as.factor(sample(c('P', 'C'), n, replace=T))
resp = vector()
for(i in 1:n){
fit = randomForest(XX[-i,], YY[-i])
pred = predict(fit, XX[i,], type = "prob")[2]
resp[i] <- pred
}
t.test(resp~YY)$p.value
roc(YY, resp)$auc
我尝试了多种生成数据的方法,所有这些方法都会导致同样的事情
XX=matrix(runif(n*p), nrow=n)
XX=matrix(rnorm(n*p, 0, 1) , nrow=n)
和
random_data=matrix(0, n, p)
for(i in 1:n){
random_data[i,]=jitter(runif(p), factor = 1, amount = 10)
}
XX=as.matrix(random_data)
由于randomForest在这种情况下找到了相关的预测因子,这让我相信数据可能不是真正随机的。有没有更好的方法可以生成数据或生成随机标签?这可能是R的问题吗?
答案 0 :(得分:0)
这是一个部分答案:我修改了你的roc函数调用,以确保AUC值的分布在0和1之间。然后我运行了20次。平均AUC和p值分别为0.73和0.12。改进但仍优于随机...
library(ROCR)
library(randomForest)
library(pROC)
n=30
p=900
pvs=vector()
aucs=vector()
for (j in seq(20)){
XX=matrix(rnorm(n*p, 0, 1) , nrow=n)
YY=as.factor(sample(c('C', 'P'), n, replace=T))
resp = vector()
for(i in 1:n){
fit = randomForest(XX[-i,], YY[-i])
pred = predict(fit, XX[i,], type = "prob")[2]
resp[i] <- pred
}
pvs[j]=t.test(resp~YY)$p.value
aucs[j]=roc(YY, resp, direction='>')$auc
}