1

J'ai joué avec l'implémentation de CV dans R mais j'ai rencontré un problème étrange avec la valeur renvoyée parmi les replis dans LOOCV. Je vais d'abord générer aléatoirement des données ainsi que des étiquettes, puis j'ajouterai un randomForest sur ce qui devrait être du bruit. A partir de la boucle retournée, j'obtiens non seulement une bonne AUC mais une valeur p significative d'un test t. Je ne comprends pas comment cela pourrait se produire théoriquement, j'étais curieux de savoir si les méthodes que j'utilisais pour générer des données/étiquettes étaient les meilleures?Génération de données aléatoires menant à une bonne prédiction sur les étiquettes aléatoires

Voici un extrait de code qui montre mon problème.

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 

J'ai essayé plusieurs façons de générer des données qui résultent toutes de la même chose

XX=matrix(runif(n*p), nrow=n) 
XX=matrix(rnorm(n*p, 0, 1) , nrow=n) 

et

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) 

Depuis la forêt d'arbres décisionnels est de trouver des prédicteurs pertinents dans ce scénario qui me conduit croire que les données peuvent ne pas être vraiment aléatoires. Y a-t-il une meilleure façon possible de générer des données ou de générer les étiquettes aléatoires? Est-il possible que ce soit un problème avec R?

+0

@ChiPak avec 'set.seed (1)' Je reçois une valeur de p ~ 0,68 mais avec 'set.seed (3)' Je reçois un P- valeur de ~ 0,00095. 'roc' vient du' pROC', je vais éditer mon post pour l'inclure dans le code – TCulos

+0

Je n'ai vraiment aucune idée de R, alors peut-être que je suis complètement éteint, mais les dimensions importent beaucoup pour créer de bons nombres aléatoires. Les nombres aléatoires sur une ligne ne sont pas les mêmes que sur une sphère. Les emplacements d'échantillons aléatoires ne sont pas seulement des nombres aléatoires. Peut-être faut-il au moins un échantillonnage stratifié? – starmole

+0

Votre petite taille d'échantillon pourrait être un problème. Essayez un plus gros 'n' comme 500. – useR

Répondre

0

Voici une réponse partielle: J'ai modifié votre appel de fonction roc pour m'assurer que la distribution des valeurs AUC est comprise entre 0 et 1. Puis je l'ai exécuté 20 fois. L'ASC et la valeur p moyennes sont respectivement de 0,73 et 0,12. L'amélioration mais toujours mieux que ... au hasard

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 
}