Tirage aléatoire sans remise

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

Mohamed Zoghlami
Messages : 18
Enregistré le : 20 Juil 2015, 10:30

Tirage aléatoire sans remise

Messagepar Mohamed Zoghlami » 31 Juil 2015, 14:07

Bonjour;
j'ai une base de données X d'1 million d'observations, je voudrais appliquer une boucle de 1000 itérations
pour faire le tirage aléatoire de 1000 observations à chaque fois.
A chaque itération, les 1000 observations retenues doivent être différentes des anciennes.
Merci pour votre aide.

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Tirage aléatoire sans remise

Messagepar Eric Casellas » 31 Juil 2015, 15:26

Bonjour,

Tu as la fonction sample qui permet de faire des tirage sans remise.
Par exemple :

Code : Tout sélectionner

(X <- 1:1000) # toutes les obs

# version "manuelle"
(s1 <- sample(X, 100, replace=FALSE)) # 1er echantillon
(s2 <- sample(X[!(X %in% s1)], 100, replace=FALSE)) # 2eme echantillon
(s3 <- sample(X[!(X %in% c(s1, s2))], 100, replace=FALSE)) # 3eme echantillon
#etc...

# version avec une boucle
sX <- list() # liste des différents echantillons
s <- c() # les echantillons déjà tirés
for (i in 1:10) {
  sX[[i]] <- sample(X[!(X %in% s)], 100, replace=FALSE)
  s <- c(s, sX[[i]])
}
Eric

Mohamed Zoghlami
Messages : 18
Enregistré le : 20 Juil 2015, 10:30

Re: Tirage aléatoire sans remise

Messagepar Mohamed Zoghlami » 31 Juil 2015, 15:47

Merci Bcp Iric pour Ton aide;

mais il reste quelques améliorations si vous permettez . En effet, chaque observation contient 2 colonnes
voilà mon code :

Code : Tout sélectionner

MyData<- read.table(file=list.files()[1], sep=",", dec=".")
class(MyData)
dataset<-as.matrix(MyData)
x<-dataset
x <- as.matrix(x)

# j'ai appliqué le code de la boucle,

# version avec une boucle

Code : Tout sélectionner

sX <- list() # liste des différents echantillons
s <- c() # les echantillons déjà tirés
for (i in 1:5) {
  sX[[i]] <- sample(x[!(x %in% s)], 10, replace=FALSE)
  print(sX[[i]])
  s <- c(s, sX[[i]])
}


il m'a donné ce résultat

Code : Tout sélectionner

[1] 1001  596  991  998  996  600 1677 1687  201  204
 [1]  598 1678  601  608  605  606 1684 1670  608 1680
 [1]  203  199  200  200  202  604  203 1674 1008  592
 [1] 1002 1685 1692 1683 1002  198 1676 1003  992  196
 [1]  191 1689 1006 1007 1688 1688 1699  599  206  609


je voudrais que chaque ensemble d'échantillons formés par des lignes à 2 colonnes.

Merci d'avance

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Tirage aléatoire sans remise

Messagepar jean lobry » 31 Juil 2015, 18:11

Bonjour,

si j'ai bien compris le problème, il te suffit de faire une permutation de ton jeu de données puis d'extraire 1000 blocs de 1000, quelque chose dans ce goût là :

Code : Tout sélectionner

nobs <- 10^6 # Nombre d'observations dans le jeu de données
ncol <- 3    # Nombre de colonnes
données <- data.frame(matrix(rnorm(ncol*nobs), ncol = ncol)) # Jeu de données bidon

permutation <- sample(1:nobs) # On mélange les données

for(i in seq(from = 1, to = nobs, by = 1000)){
   échantillon <- données[permutation[i:(i + 999)], ]
   # Faire quelque chose avec l'échantillon, ici afficher les moyennes par colonne
   print(colMeans(échantillon))
}


Amicalement,

jean

Mohamed Zoghlami
Messages : 18
Enregistré le : 20 Juil 2015, 10:30

Re: Tirage aléatoire sans remise

Messagepar Mohamed Zoghlami » 01 Aoû 2015, 08:40

Merci Jean pour votre contribution, mais l'objectif c'est pas une permutation. Je m'explique:
J'ai une grande BD de presque 10^6 lignes. Si je fais mes calculs sur tte base, ceci risque de charger la mémoire et le programme plante.

Donc j'ai pensé à utiliser une boucle de 1000 itérations et extraire aléatoirement à chaque fois une petite ensemble de 1000 lignes pour les traiter. Les 1000 lignes extraites et traitées à une itération donnée doivent être supprimée de la BD et ne doivent pas figurées pour les prochaines itérations. Les itérations se terminent lorsqu'on épuise tte la BD.

Merci pour votre compréhension

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Tirage aléatoire sans remise

Messagepar jean lobry » 01 Aoû 2015, 19:16

Bonjour,

j'avais donc bien compris. Je t'ai juste donné un algorithme équivalent moins consommateur de ressources.

amicalement,

jean

Mohamed Zoghlami
Messages : 18
Enregistré le : 20 Juil 2015, 10:30

Re: Tirage aléatoire sans remise

Messagepar Mohamed Zoghlami » 02 Aoû 2015, 10:32

Oui Jean, il tourne parfaite, il reste quelques ajustements, je t'en remercie.

Amicalement

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Tirage aléatoire sans remise

Messagepar jean lobry » 03 Aoû 2015, 19:00

Bonjour Mohamed,

tu es le bienvenu dans ce forum.

Amicalement,

jean

Mohamed Zoghlami
Messages : 18
Enregistré le : 20 Juil 2015, 10:30

Re: Tirage aléatoire sans remise

Messagepar Mohamed Zoghlami » 05 Aoû 2015, 11:07

Merci Bcp Jean;

je suis bien reconnaissant :)

amicalement

Mathilda Rossiere
Messages : 1
Enregistré le : 08 Avr 2022, 10:16

Re: Tirage aléatoire sans remise

Messagepar Mathilda Rossiere » 12 Avr 2022, 05:08

Eric Casellas a écrit :Bonjour,

Tu as la fonction sample qui permet de faire des tirage sans remise.
Par exemple :

Code : Tout sélectionner

(X <- 1:1000) # toutes les obs

# version "manuelle"
(s1 <- sample(X, 100, replace=FALSE)) # 1er echantillon
(s2 <- sample(X[!(X %in% s1)], 100, replace=FALSE)) # 2eme echantillon
(s3 <- sample(X[!(X %in% c(s1, s2))], 100, replace=FALSE)) # 3eme echantillon
#etc...

# version avec une boucle
sX <- list() # liste des différents echantillons
s <- c() # les echantillons déjà tirés
for (i in 1:10) {
  sX[[i]] <- sample(X[!(X %in% s)], 100, replace=FALSE)
  s <- c(s, sX[[i]])
}



Bonjour à tous !

Je réactive ce post qui m'a beaucoup aidée, cependant il me manque une petite ligne de code pour arriver à mes fins. Je m'explique : j'ai un échantillon avec 18 valeurs. Je voudrais tirer dans cet échantillon 1 valeur, puis 2 valeurs.. jusqu'à 6. Du coup je pensais faire 6 boucles. La première :
for (i in 1:18), la deuxième for (i in 1:18^2) etc.. jusqu'à for (i in 1:18^6). Pour que chaque fois toutes les combinaisons soient testées. Le problème c'est que comme je mets replace = FALSE, il ne me trouve à chaque fois que peu de combinaisons (normal). Je voudrais arriver à lui dire de ne pas re-tester la même combinaison, mais aucune idée de comment faire..

Avez-vous une idée ?
Merci par avance !
Mathilda

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

Re: Tirage aléatoire sans remise

Messagepar Logez Maxime » 12 Avr 2022, 17:23

Bonjour,

Si tu as une nouvelle question il vaut mieux ouvrir un nouveau post et faire référence à l'ancien avec un lien par exemple.
Est-ce que tu veux pour chaque valeur de n avoir toutes les combinaisons possibles ? avec ou sans remises ? Ou vraiment avoir n tirage aléatoire ?
Pour toutes les combinaisons possibles sans remises regarde du côté de la fonction combn, pour toutes les combinaisons possibles avec remises regarde du côté de expand.grid.

Code : Tout sélectionner

# pour les combinaisons :
for (i in 1:6) {
  
c1 <- combn(18i)
  for (
j in 1:ncol(c1)) {
  ...
  }
}
# pour les arrangements (combinaison avec répétition)
for (i in 1:6) {
  
c1 <- do.call(expand.gridreplicate(i1:18simplify F))
  for (
j in 1:nrowl(c1)) {
  ...
  }
}
 

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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