Tirage aléatoire en R

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

Cheikh Kane
Messages : 10
Enregistré le : 24 Juil 2008, 16:26

Tirage aléatoire en R

Messagepar Cheikh Kane » 07 Aoû 2008, 18:27

Bonjour,

Je cherche comment faire un tirage aléatoire en R. J'ai une base de données de format excel (mais que je peux aussi tranformé en format texte) et je veux former plusieurs échantillons aléatoires en se basant sur les valeurs d'une variable. Cette variable prend deux valeurs: 0 et 1. Par exemple c'est une base de données qui a 2000 observations et je veux en former 10 échantillons de taille variable en spécifiant le nombre d'observations de la valeur 0 et le nombre d'observations de la valeur 1. Pour un échantillon de 200 observations, je veux pouvoir spécifier 50 de la valeur 0 et 150 de la valeur 1. Je veux ainsi former plusieurs bases de données aléatoirement en adoptant la meme technique. Merci pour votre aide.
Aide en R

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

Messagepar Nicolas Péru » 07 Aoû 2008, 21:15

Bonsoir,

C'est la fonction sample() qui permet de faire des tirages aléatoires.
Pour le reste déjà ça va dépendre si 1 ligne du tableau originel ne doit se retrouver que dans un seul des sous jeux de données ou non.

Nicolas.

Cheikh Kane
Messages : 10
Enregistré le : 24 Juil 2008, 16:26

Tirage aléatoire en R

Messagepar Cheikh Kane » 08 Aoû 2008, 17:52

Bonjour Nicolas,

Merci pour la réponse. Une ligne du tableau original peut être tirée à plusieurs reprises.

Merci.
Aide en R

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

Messagepar Nicolas Péru » 08 Aoû 2008, 20:28

Voilà une possibilité :

Code : Tout sélectionner

CheikhKane_fct <- function(tab,n1,n0,fac01){
##n1 : nombre de 1 souhaité
##n0 : nombre de 0 souhaité
##fac01 : une variable contenant les 0 et 1 ayant autant de valeurs que
## le nombre de ligne du tableau tab
tab0 <- subset(tab,fac01==0) #sélectionne les lignes de tab qui ont un "0" comme équivalent dans fac01
tab1 <- subset(tab,fac01==1) #sélectionne les lignes de tab qui ont un "0" comme équivalent dans fac01

if(n1>nrow(tab1)) stop("nombre de 1 souhaité trop grand") #cf ?"if ou ?"Syntax" pour des détails sur ces commandes
if(n0>nrow(tab0)) stop("nombre de 0 souhaité trop grand")


newtab0 <- tab0[sample(1:nrow(tab0),n0),] #tirage aléatoire de n0 lignes
newtab1 <- tab1[sample(1:nrow(tab1),n1),] #tirage aléatoire de n1 lignes

mysampledataset <- rbind(newtab0,newtab1)
return(mysampledataset)
}




un exemple d'utilisation :

Code : Tout sélectionner

dataset <- matrix(1:60,nr=20,nc=3) #une matrice de dimension [20,3]
dataset
      [,1] [,2] [,3]
 [1,]    1   21   41
 [2,]    2   22   42
 [3,]    3   23   43
 [4,]    4   24   44
 [5,]    5   25   45
 [6,]    6   26   46
 [7,]    7   27   47
 [8,]    8   28   48
 [9,]    9   29   49
[10,]   10   30   50
[11,]   11   31   51
[12,]   12   32   52
[13,]   13   33   53
[14,]   14   34   54
[15,]   15   35   55
[16,]   16   36   56
[17,]   17   37   57
[18,]   18   38   58
[19,]   19   39   59
[20,]   20   40   60

x01 <- rep(c(0,1),each=10)
x01<-sample(x01,20) #un vecteur de 20 valeurs 0 ou 1, et une utilisation de sample() pour mélanger un vecteur
test <- CheikhKane_fct(tab=dataset,n1=2,n0=3,fac01=x01) #on veut un jeu de donnée ayant deux "1" et trois "0"
test
       [,1] [,2] [,3]
[1,]   18   38   58
[2,]    9   29   49
[3,]    6   26   46
[4,]    2   22   42
[5,]   16   36   56

Cheikh Kane
Messages : 10
Enregistré le : 24 Juil 2008, 16:26

Messagepar Cheikh Kane » 09 Aoû 2008, 01:30

Bonsoir Nicolas,

Merci pour le code. C'est très gentil de votre part.

Bonne soirée.
Aide en R

Cheikh Kane
Messages : 10
Enregistré le : 24 Juil 2008, 16:26

Tirage aléatoire en R

Messagepar Cheikh Kane » 14 Aoû 2008, 18:49

Bonsoir,

J'ai quelques ennuis avec la fonction rbin(). J'obtient le message d'erreur suivant: " number of columns of result is not a multiple of vector length".
En fait voici un exemple que ce je veux. J'ai par exemple la base de données suivantes:


Individus Poids Classe

individu1 65.5 0
individu2 45.8 0
individu3 35 1
individu4 50 0
individu5 40 1
individu6 39 1
individu7 78 0

Je veux à chaque fois, prendre aléatoirement un échantillon de cette base de données en spécifiant le nombre de "0" et le nombre de "1" au niveau de la variable "Classe". Par exemple, si je veux deux individus de la modalité "0" et un de "1", je peux avoir par exemple:

Individus Poids Classe

individu1 65.5 0
individu2 45.8 0
individu3 35 1

ou bien:


Individus Poids Classe

individu1 65.5 0
individu5 40 1
individu7 78 0

Merci pour votre soutien.




Nicolas Péru a écrit :Voilà une possibilité :

Code : Tout sélectionner

CheikhKane_fct <- function(tab,n1,n0,fac01){
##n1 : nombre de 1 souhaité
##n0 : nombre de 0 souhaité
##fac01 : une variable contenant les 0 et 1 ayant autant de valeurs que
## le nombre de ligne du tableau tab
tab0 <- subset(tab,fac01==0) #sélectionne les lignes de tab qui ont un "0" comme équivalent dans fac01
tab1 <- subset(tab,fac01==1) #sélectionne les lignes de tab qui ont un "0" comme équivalent dans fac01

if(n1>nrow(tab1)) stop("nombre de 1 souhaité trop grand") #cf ?"if ou ?"Syntax" pour des détails sur ces commandes
if(n0>nrow(tab0)) stop("nombre de 0 souhaité trop grand")


newtab0 <- tab0[sample(1:nrow(tab0),n0),] #tirage aléatoire de n0 lignes
newtab1 <- tab1[sample(1:nrow(tab1),n1),] #tirage aléatoire de n1 lignes

mysampledataset <- rbind(newtab0,newtab1)
return(mysampledataset)
}




un exemple d'utilisation :

Code : Tout sélectionner

dataset <- matrix(1:60,nr=20,nc=3) #une matrice de dimension [20,3]
dataset
      [,1] [,2] [,3]
 [1,]    1   21   41
 [2,]    2   22   42
 [3,]    3   23   43
 [4,]    4   24   44
 [5,]    5   25   45
 [6,]    6   26   46
 [7,]    7   27   47
 [8,]    8   28   48
 [9,]    9   29   49
[10,]   10   30   50
[11,]   11   31   51
[12,]   12   32   52
[13,]   13   33   53
[14,]   14   34   54
[15,]   15   35   55
[16,]   16   36   56
[17,]   17   37   57
[18,]   18   38   58
[19,]   19   39   59
[20,]   20   40   60

x01 <- rep(c(0,1),each=10)
x01<-sample(x01,20) #un vecteur de 20 valeurs 0 ou 1, et une utilisation de sample() pour mélanger un vecteur
test <- CheikhKane_fct(tab=dataset,n1=2,n0=3,fac01=x01) #on veut un jeu de donnée ayant deux "1" et trois "0"
test
       [,1] [,2] [,3]
[1,]   18   38   58
[2,]    9   29   49
[3,]    6   26   46
[4,]    2   22   42
[5,]   16   36   56
Aide en R

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 15 Aoû 2008, 07:12

merci de renvoyer ce message en commençant un autre sujet.

Renaud

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

Messagepar Logez Maxime » 15 Aoû 2008, 08:05

Bonjour,

Pour reprendre la fonction de Nicolas :

Code : Tout sélectionner

CheikhKane_fct <- function(tab,n0,n1,fac01){
##n1 : nombre de 1 souhaité
##n0 : nombre de 0 souhaité
##fac01 : une variable contenant les 0 et 1 ayant autant de valeurs que
## le nombre de ligne du tableau tab
if(n1>sum(fac01==1)) stop("nombre de 1 souhaité trop grand") #cf ?"if ou ?"Syntax" pour des détails sur ces commandes
if(n0>sum(fac01==0)) stop("nombre de 0 souhaité trop grand")

auxi <- c(sample(which(fac01==1),n1),sample(which(fac01==0),n0))
auxi <- sample(auxi)

mysampledataset <- tab[auxi,]
return(mysampledataset)
}

test
  Individus Poids Classe
1 individu1  65.5      0
2 individu2  45.8      0
3 individu3  35.0      1
4 individu4  50.0      0
5 individu5  40.0      1
6 individu6  39.0      1
7 individu7  78.0      0

CheikhKane_fct(test,2,1,test$Classe)
  Individus Poids Classe
6 individu6  39.0      1
2 individu2  45.8      0
7 individu7  78.0      0

CheikhKane_fct(test,2,1,test$Classe)
  Individus Poids Classe
7 individu7  78.0      0
3 individu3  35.0      1
2 individu2  45.8      0


Maxime

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

Messagepar Nicolas Péru » 15 Aoû 2008, 10:42

la question est la même qu'au début...le code est toujours valable d'où la réponse de maxime...je comprends pas bien où est le problème. Et c'est quoi la fonction rbin, je ne la trouve nulle part ?

Cheikh Kane
Messages : 10
Enregistré le : 24 Juil 2008, 16:26

Tirage aléatoire en R

Messagepar Cheikh Kane » 15 Aoû 2008, 16:59

Bonjour Nicolas,

La fonction c'est rbind() au lieu de rbin() comme je l'avais précédemment écris. C'est que avec cette fonction, les lignes des "1" tirées aléatoirement étaient directement placées ensemble au dessous des lignes des "0" tirées aléatoirement. Cette disposition n'était pas bien adaptée car je veux ensuite faire des arbres de décision avec les échantillons. Excusez-moi, mais c'est la première fois que je programme en R. J'aime bien le langage mais je suis très débutant.
Y a-t-il un moyen de sauvegarder les échantillons qu'on crée en fichier qu'on peut utiliser dans d'autres applications (sauvegarder par exemple l'échantillon tirée en un fichier texte que je pourrai utiliser dans un logiciel de construction d'arbres de décision).

Merci beaucoup
Aide en R

Cheikh Kane
Messages : 10
Enregistré le : 24 Juil 2008, 16:26

Tirage aléatoire en R

Messagepar Cheikh Kane » 15 Aoû 2008, 17:27

La dernière possibilité avec la modification apportée par Maxime fonctionne bien comme je le veux. J'obtiens l'échantillon "mélangée" comme dans ma base de données initiales.
Je lis la documentation car je voudrai un moyen pour sauvegarder ces échantillons afin de les utiliser dans d'autres applications.

Merci vous tous, le forum est très intéressant.
Aide en R

Cheikh Kane
Messages : 10
Enregistré le : 24 Juil 2008, 16:26

Tirage aléatoire en R

Messagepar Cheikh Kane » 15 Aoû 2008, 18:58

C'est bon, j'ai vu comment sauvegerder les échantillons tirés au hasard (write.table). Merci.

Avez-vous des indications à me donner pour coder des arbres de décision avec R? Je vais utiliser Gini, entropie et Kolmogorov-Smirnov pour comparer les résultats

Merci
Aide en R

romain legrand
Messages : 13
Enregistré le : 25 Avr 2008, 09:19

Re: Tirage aléatoire en R

Messagepar romain legrand » 22 Aoû 2008, 13:00

Cheikh Kane a écrit :Avez-vous des indications à me donner pour coder des arbres de décision avec R?


1) Bien maitriser les fonctions récursives
2) Du café :roll:

Pour l'échantillonnage, je pense que tu devrais faire attention en imposant la proportion de tes classes.
pour moi y'a un risque de sur-apprentissage sur une classe, si la proportion n'est pas la même entre la base initial et ton échantillon.

Sinon , à quoi va te servir Kolmogorov ??

Hervé Bassinga
Messages : 3
Enregistré le : 02 Sep 2014, 10:22

echantillon stratifié

Messagepar Hervé Bassinga » 07 Nov 2014, 12:26

J'ai une base et je veux tirer un échantillon proportionnellement à la taille des ménages selon le milieu de résidence (Urbain, rural) et selon les régions(13 régions). Au total je crois avoir 26 strates(2*13).

Ma variable milieu de résidence est HM025 et région HM024.
Aidez moi s'il vous plait
J'adore l'innovation


Retourner vers « Questions en cours »

Qui est en ligne

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