Mathieu_D Posté 7 décembre 2018 Signaler Share Posté 7 décembre 2018 J'ai un challenge pour vous messieurs mesdames. J'ai une base avec des individus qui des jours sont là, des jours sont pas là. J'ai y jours par individus. LEs données se présentent de la forme Id date 1 03/09/2018 1 04/09/2018 1 07/09/2018 1 11/09/2018 2 17/10/2018 2 30/10/2018 2 17/11/2018 Je veux tirer au hasard n jours par individus. n est un multiple de 5. On ne garde pas les week-ends. Je veux que le tirage global : équilibre le nombre d'observation par semaine (numero iso de la semaine) équilibre le nombre de jours nommés (c(lundi, mardi, mercredi, jeudi, vendredi) Et je veux que le tirage par individu : comporte n/5 lundi, n/5 mardi... ai au moins n semaines différentes Pour la simplicité on ne garde que les individus présents au moins 2 jours nommés de chaque. (2 lundi, 2 mardi...) et présents au moins n semaine. Si vous avez un programme R ou SAS, ou un algo qui fait ça, je suis tout ouïe. Lien vers le commentaire
Lancelot Posté 7 décembre 2018 Signaler Share Posté 7 décembre 2018 Déjà pour faire le ménage je convertirais les dates en un format non horrible. > strptime("03/09/2018", "%d/%m/%Y", tz="GMT") [1] "2018-09-03 GMT" Ensuite je rajouterais des colonnes avec le numéro de la semaine et le jour puisque c'est important. # Week of the year as decimal number (00–53) using the first Sunday as day 1 of week 1 > strftime("2018-09-03 GMT", format = "%U") [1] "35" # Abbreviated weekday name in the current locale. (Also matches full name on input.) > strftime("2018-09-03 GMT", format = "%a") [1] "lun." Cf. http://www.astrostatistics.psu.edu/su07/R/html/base/html/strptime.html pour les options. Lien vers le commentaire
Mathieu_D Posté 7 décembre 2018 Auteur Signaler Share Posté 7 décembre 2018 Ha ben lubridate pour les dates oui bien sûr. (fonctions weekdays() et week() ) Lien vers le commentaire
Bézoukhov Posté 7 décembre 2018 Signaler Share Posté 7 décembre 2018 Spontanément, j'irai dénombrer le nombre de possibilités P par individu et pour chaque individu sampler 1/P. Ensuite le dénombrement est assez dégueulasse. Ca doit être un truc du genre, avec S le nombre de semaines : (n parmi S)(n parmi S-5)(n parmi S-10)...(n parmi S-20) - (coefficient de dénombrement lié aux impasses) Le deuxième terme me semblant un peu galère. Lien vers le commentaire
Lancelot Posté 7 décembre 2018 Signaler Share Posté 7 décembre 2018 Bah si j'ai bien compris du coup on a un dataframe comme ça : Id W D 1 1 1 * 1 1 2 1 1 3 1 1 4 1 1 5 1 2 1 1 2 2 * 1 2 3 1 2 4 1 2 5 1 3 1 1 3 2 1 3 3 * 1 3 4 1 3 5 1 4 1 1 4 2 1 4 3 1 4 4 * 1 4 5 1 5 1 1 5 2 1 5 3 1 5 4 1 5 5 * 2 1 1 2 1 2 * 2 1 3 2 1 4 2 1 5 2 2 1 2 2 2 2 2 3 * 2 2 4 2 2 5 2 3 1 2 3 2 2 3 3 2 3 4 * 2 3 5 2 4 1 2 4 2 Et si on contrôle là où il y a les étoiles (sujet 1 = semaine 1 jour 1, semaine 2 jour 2, semaine 3 jour 3..., sujet 2 = semaine 1 jour 2, semaine 2 jour 3, semaine 3 jour 4...) ça respecte les contraintes à la fois sur le tirage global et par individu. C'est généralisable à un nombre arbitraire de sujets mais pas forcément de semaines (la flemme de tester avec 10 pour voir mais à vue de nez je dirais que ça marche en doublant le nombre de tirages et en continuant la série). Reste à randomiser en reparamétrant pour assigner à chaque semaine/jour un nouveau nombre aléatoire. Mais bon, c'est vendredi soir, je suis fatigué, je loupe sûrement un truc Lien vers le commentaire
Mathieu_D Posté 7 décembre 2018 Auteur Signaler Share Posté 7 décembre 2018 Le truc c'est que : 1 les gens ne sont pas là tous les jours 2 il faut que mon tirage global soit équilibré en jours nommés et semaine La condition 2 fait chier, sinon je m'en tirais avec des sample_n() de dplyr. Lien vers le commentaire
Lancelot Posté 7 décembre 2018 Signaler Share Posté 7 décembre 2018 Ah je pensais que le but était justement de tester quand ils étaient là ou pas. Du coup oui il faut rajouter des exceptions et ça fout le bordel au niveau global et c'est chiant. Lien vers le commentaire
Lancelot Posté 8 décembre 2018 Signaler Share Posté 8 décembre 2018 Est-ce qu'on est sûr qu'au moins une solution existe ? Si non, ça peut commencer à devenir intéressant de faire N tirages valables au niveau local et de déterminer une mesure de la distance par rapport à un tirage équilibré au niveau global. Si des tirages sont valables aussi au niveau global on en prend un au hasard, sinon on en prend un au hasard parmi les plus proches. Selon ce qui est mesuré on peut même envisager de faire du bootstrapping Lien vers le commentaire
Noob Posté 9 décembre 2018 Signaler Share Posté 9 décembre 2018 Tu peux pas faire l'inverse ? Tu sélectionnes tout, tu classes comme tu veux, tu définis tes quotas pour chaque catégorie et ensuite tu jètes des éléments au hasard tant que tu tes quotas sont pas ce que tu attends. Lien vers le commentaire
Mathieu_D Posté 9 décembre 2018 Auteur Signaler Share Posté 9 décembre 2018 10 hours ago, Noob said: Tu peux pas faire l'inverse ? Tu sélectionnes tout, tu classes comme tu veux, tu définis tes quotas pour chaque catégorie et ensuite tu jètes des éléments au hasard tant que tu tes quotas sont pas ce que tu attends. Oui je comptais tester comme ça, sachant que la condition "n jours par gugusse" est plus importante que "n jours par semaine au global". Le problème mineur c'est qu'en R en faisant comme ça c'est long un tirage. (plusieurs centaines de secondes contre quelques dixièmes le sampling simple) J'vais p'être devoir y aller en rcpp (api c++ dans r) et ça me déprime. (quoique je n'ai pas testé avec SAS) Lien vers le commentaire
Mathieu_D Posté 9 décembre 2018 Auteur Signaler Share Posté 9 décembre 2018 21 hours ago, Lancelot said: bootstrapping Tutut pa de remise. (mais oui je dois étudier la variance rééchantillonnée pour environ 500 tirages) Lien vers le commentaire
Messages recommandés