Aller au contenu
Mathieu_D

Challenge sampling

Messages recommandés

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Ha ben lubridate pour les dates oui bien sûr.

(fonctions weekdays() et week() )

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :mrgreen:

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :jesaispo:

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

 

Partager ce message


Lien à poster
Partager sur d’autres sites
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)

Partager ce message


Lien à poster
Partager sur d’autres sites
21 hours ago, Lancelot said:

bootstrapping :jesaispo:

Tutut pa de remise.

 

(mais oui je dois étudier la variance rééchantillonnée pour environ 500 tirages)

Partager ce message


Lien à poster
Partager sur d’autres sites

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.

×