IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS STAT Discussion :

Générer des nombre aléatoires sous certaines conditions


Sujet :

SAS STAT

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 55
    Points : 61
    Points
    61
    Par défaut Générer des nombre aléatoires sous certaines conditions
    Bonjour à tous,

    voilà le problème qui m'amène sur ce forum:

    je souhaiterais générer des nombres aléatoire en fixant les contraintes suivantes:
    - avoir une moyenne de 2000 (précisément)
    - avoir des nombres qui soient compris entre 20 et 4000

    J'ai essayé avec ce code mais le problème est que lorsque je fixe un x petit, tous mes nombres sont très proches de 2000 et quand je fixe un x grand j'ai des nombres qui s'éloignent de 2000 mais ma moyenne n'est pas exactement de 2000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    do i=1 to 65;
    montant=round(2000+sqrt(220000)*rannor(15));
    output; 
    end;
    Avez-vous des idées pour avoir une distribution qui ressemble finalement plus à la courbe en bleu qu'à celle en noir (voir graphiques ci-dessous) ?

    Nom : test.PNG
Affichages : 1312
Taille : 35,2 Ko

    Merci d'avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Une piste : si ta moyenne est éloignée de 2000, tu peux corriger a posteriori ton tirage aléatoire pour recentrer sur 2000 ?

    Exemple :

    1/ echantillon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data test ;
        do i=1 to 1000 ;
            montant=round(2000+sqrt(220000)*rannor(15));
            output; 
        end;
    run ;
    2/ calcul de la moyenne de montant et enregistrement dans macrovar montant_mean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    proc SQL noprint ;
        select mean(montant)
        into: montant_mean
        from test ;
    quit ;
    3/ correction de la variable montant et vérification via proc means
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    data test ; 
        set test  ;
        montant_corrige = montant - (round(&montant_mean.) - 2000) ;
    run ;
    proc means data = test ;
        var montant montant_corrige ; 
    run ;

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    - avoir une moyenne de 2000 (précisément)
    - avoir des nombres qui soient compris entre 20 et 4000
    - avoir un échantillon de taille 65
    - avoir une distribution qui ressemble finalement plus à la courbe en bleu qu'à celle en noir.
    D’après la courbe en bleu symétrique par rapport à la moyenne, le montant suit la loi normale d’une moyenne =2000 et d’un écart type inconnu (paramètre important pour déterminer la distribution). L’étendu : max-min=4000-20=3980 donne déjà une idée sur l’écart type qu’il est probablement élevé. Une nouvelle condition qui s’ajoute.
    - avoir un écart type le plus grand possible en respectant les contraintes citées ci-dessus.
    Je te propose la simulation suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    /* Distribution symétrique : (3980/65)=61.320 */
    data test (drop=i);	  
    do i=20 to 4000 by 61.875 ;
    montant=i;
    output; 
    end;
    run ;	 
     
    proc means data=test noprint ;
    var montant ;
    output out=out_stats mean=moyenne std=ecart_type ;
    run;
     
    proc standard data=test mean=2000 std=1169.91 out=out_stnd ;
    var montant ;
    run;
    Je pense que l’écart type de ton échantillon atteint son maximum en : 1169.91 (si on veut respecter les contraintes).
    Par contre si on donne des valeurs inférieures à 1169.91 (via proc standard) on peut avoir des échantillons suivant les contraintes mais on s’éloigne de la courbe bleue (à tracer pour vérifier).
    Ward

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2014
    Messages : 55
    Points : 61
    Points
    61
    Par défaut
    Merci à vous deux pour ces propositions de code qui répondent parfaitement à mon besoin.

    Bon week-end.

    Cdt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/01/2008, 13h02
  2. Réponses: 4
    Dernier message: 12/09/2006, 17h42
  3. Générer des nombres aléatoires
    Par nbeligh dans le forum C++
    Réponses: 6
    Dernier message: 05/09/2006, 17h05
  4. Algo pour générer des nombres aléatoires
    Par Admin dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/06/2006, 10h06
  5. Réponses: 2
    Dernier message: 16/05/2006, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo