Echantillonage aléatoire

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

victor Bruyere
Messages : 11
Enregistré le : 06 Déc 2006, 13:37

Echantillonage aléatoire

Messagepar victor Bruyere » 23 Avr 2007, 15:24

Bonjour,

Je travaille actuellement sur les arbres de décision avec les packages rpart et randomForest.
Dans le cadre de ce travail, je recherche une fonction qui permet de faire un échantillonage aléatoire sans remise de 20 % des valeurs par exemple et ceci dans une data.frame.
J'ai essayé la fonction Random mais celle ci extrait simplement des valeurs alors que je voudrais extraire des lignes entières.

Est ce que l'un de vous aurait une idée de code?
Merci d'avance en tout cas.

Victor Bruyere

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 23 Avr 2007, 15:32

Il faut utiliser la fonction sample()
L'idée est d'utiliser les numéros des lignes.
Par exemple pour un tableau de 100 lignes, nommé de façon très originale "tab" :D, on peut écrire ce code :

Code : Tout sélectionner

lignenumber <- sample(1:100,100) #tire les 100 numéros dans un ordre aléatoire, sans remise par défaut cf. ?sample

permutetab <- tab[lignenumber,] #on sélectionne le tableau selon l'odre des lignes définit par le sample


voilà, j'ai pas retesté mais ça doit marcher comme ça

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 23 Avr 2007, 16:13

Bonjour,


La réponse de Nicolas devrait être suffisante si tu cherches à tirer aux hasards 20% de tes "lignes" (encore que Nicolas les reprends toutes mais les mets dans le désordre). Par contre si tu cherches à recréer un tableau dans contient dans chaque colonne 20% de valeurs prises dans le tableau d'origine (tu ne tiens plus compte que les valeurs sont en lignes) tu devras étendre ce qu'a fait Nicolas à tes colonnes :

Code : Tout sélectionner

# le tableau de départ
ted <- matrix(rpois(100,4),10,10,dimnames=list(paste("L",1:10,sep=""),paste("C",1:10,sep="")))
ted
    C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
L1   5  6  5  4  5  6  6  3  4   3
L2   2  1  5  8  6  4  4  6  8   2
L3   4  6  0 12  6  3  6  3  4   4
L4   4  8  8  9  4  7  5  2  2   4
L5   5  1  4  2  3  2  8  5  3   3
L6   6  3  1  1  7  5  4 10  5   7
L7   3  3  3  3  1  1  2  2  5   6
L8   1  1  6  5  5  2  5  4  2   4
L9   7  9  3  4  2  0  0  5  7   2
L10  6  7  4  3  6  7  5  5  8   4

# dans le cas du choix de 20% des lignes
ted2 <- ted[sample(1:nrow(ted),2),]
ted2
   C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
L1  5  6  5  4  5  6  6  3  4   3
L3  4  6  0 12  6  3  6  3  4   4

# si tu cherches a créer un nouveau tableau en piochant dans chaque colonne de façon aléatoire et indépendante 20% des valeurs :
ted3 <- apply(ted,2,sample,2)
ted3
     C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
[1,]  5  1  3  2  7  7  5  2  2   4
[2,]  6  1  0  1  5  2  6  5  5   7


Maxime

victor Bruyere
Messages : 11
Enregistré le : 06 Déc 2006, 13:37

Messagepar victor Bruyere » 24 Avr 2007, 07:06

Merci pour ces informations.

Ca a l'air de marcher comme je le voulais pour cette partie là, mais est il possible de mettre dans un tab3 les lignes du tableau tab de départ auquel on aurait enlevé les lignes de tab2, tout ça pour faire un échantillon de construction et un échantillon de test pour mes arbres et forêt?

Victor Bruyere

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 24 Avr 2007, 07:42

Bonjour,


Il est tout a fait possible de le faire si au départ tu as récupéré les numéros de ligne du tableau que tu conserves pour faire tab2 tu fais tab3 en ne prenant pas ces lignes :

Code : Tout sélectionner

tab <- matrix(rpois(100,4),10,10,dimnames=list(paste("L",1:10,sep=""),paste("C",1:10,sep="")))
tab
    C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
L1   3  5  3  4  4  6  4  2  4   1
L2   6  8  1  5  1  7  7  2  5   6
L3   8  4  3  3  8  2  5  7  2   5
L4   2  5  2  5  4  5  3  4  3   0
L5   5  4  1  6  5  2  6  2  4   5
L6   6  4  4  2  4  2  4  8  4   5
L7   5  4  3  1  5  2  4  4  8   5
L8   7  2  4  3  3  4  3  2  4   5
L9   3  6  7  4  1  3  7  6  3   5
L10  6  3  4  3  5  1  1  1  5   4
lignestab2 <- sample(1:nrow(tab),2)
tab2 <- tab[lignestab2,]
tab2
   C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
L8  7  2  4  3  3  4  3  2  4   5
L4  2  5  2  5  4  5  3  4  3   0
tab3 <- tab[-lignestab2,]
    C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
L1   3  5  3  4  4  6  4  2  4   1
L2   6  8  1  5  1  7  7  2  5   6
L3   8  4  3  3  8  2  5  7  2   5
L5   5  4  1  6  5  2  6  2  4   5
L6   6  4  4  2  4  2  4  8  4   5
L7   5  4  3  1  5  2  4  4  8   5
L9   3  6  7  4  1  3  7  6  3   5
L10  6  3  4  3  5  1  1  1  5   4


Maxime

victor Bruyere
Messages : 11
Enregistré le : 06 Déc 2006, 13:37

Messagepar victor Bruyere » 24 Avr 2007, 07:59

Maxime merci pour ces explications trés clair et rapide en plus.
C'est tout à fait ce que je voulais faire.

Bonne continuation

Victor


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité