1

私はCVでRを実装していましたが、LOOCVの折り返しの間に返された値に奇妙な問題が発生しました。ランダムなデータの生成でランダムなデータが生成される

まず、データとラベルをランダムに生成します。次に、雑音だけでなく、ランダムフォレストに合わせます。返されたループから、私は良い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) 

ランダムフォレストが私をリードし、このシナリオに関連した予測因子を見つけることですので、データが本当にランダムではない可能性があると信じています。データを生成する方法や、ランダムなラベルを生成する方法がありますか?これがRの問題である可能性はありますか?

+0

@ChiPak(1) '私は〜0.68のp値を取得set.seed'ではなくて...改善されたが、ランダムよりもまだ良い '(3)'私は、p型を取得しますset.seed 〜0.00095の値。 'roc'は' pROC'からのものですが、私は投稿にコードを含めて編集します – TCulos

+0

Rについては全く分かりません。多分私は完全にオフですが、寸法は良い乱数を作り出すために大変重要です。行の乱数は球の乱数と同じではありません。ランダムなサンプルの場所は乱数だけではありません。少なくとも層別サンプリングが必要なのでしょうか? – starmole

+0

サンプルサイズが小さいと問題が発生する可能性があります。 – useR

答えて

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 
}