2017-06-12 3 views
0

Hé les gars, merci beaucoup, à l'avance, pour votre aide! J'ai une étape de données avant le code ci-dessous appelé « simulation_tracking3 », qui sort quelque chose comme:Est-ce que loop - random number génère deux fois le même nombre et ne l'ajoute pas dans un total cumulé

CDFx Allowed_Claims 
.06 120 
.12 13 
.15 1400 

Mes moyennes de table de hachage des Allowed_Claims sur la base d'une valeur aléatoire (de 0 à 1). Par exemple, appelons ce processus A, si Px = rand('Uniform',0,1) donne 0,09, je veux qu'il soit moyen entre les valeurs Allowed_Claims où Px = .06 et Px = 0,12, ce qui est (120 + 13)/2

Le rôle de le tableau est qu'il dicte combien d'itérations de Process AI veulent. La matrice est

Members {24} _temporary_ (5 6 8 10 12 15 20 25 30 40 50 60 70 80 
            90 100 125 150 175 200 250 300 400 500); 

Ainsi, lorsque la boucle démarre, il effectue 5 itérations du procédé A, en produisant ainsi des valeurs moyennes 5 « de allowed_claims ». Je veux la somme de ces cinq revendications. Ensuite, la boucle continuera et effectuera 6 itérations du processus A et produira 6 valeurs "allow_claims" en moyenne. Encore une fois, je veux la somme de ces 6 revendications.

La table de sortie ressemble à ceci:

`

Member[i] Average_Expected_Claims 
    5    (sum of 5 'averaged 'claims) 
    6    (sum of 6 'averaged' claims) 
    8    (sum of 8 'averaged' claims) 

Mon problème est que, sur le deuxième à la dernière et la dernière itération, il utilise la même valeur aléatoire pour générer les revendications autorisées . et il ne le résume pas dans un format «cumulatif». Par exemple, les quatrième et cinquième itérations pour le groupe de 5 membres ont les mêmes revendications autorisées, les cinquième et sixième pour le groupe de 6 membres, etc. En outre, le nombre qui est produit dans la table de sortie correspondant à un X -member group, somme la valeur des revendications autorisées de la première occurrence à la seconde à la dernière. Par exemple, pour le groupe de 5 personnes, la somme des revendications autorisées est comprise entre 1 et 4, et non entre 1 et 5. Donc, les deux problèmes que je vois sont: il ne génère pas de valeur aléatoire unique pour calculer les revendications autorisées; il ne parvient pas à ajouter la dernière occurrence au total cumulé.

Les valeurs de la table générée 5 membres ressemble à ceci:

allowed_claims _i_simul rand_value ac_average 
805.61154253  1  0.4518515905 805.61154253 
805.61154253  2  0.2017115643 0 
5091.2264605  3  0.7019698818 4285.614918 
8207.1931206  4  0.6518877812 3115.9666601 
8207.1931206  5  0.6518877812 3115.9666601 

Ci-dessous mon code:

data simulation_members; *simulates allowed claims for each member in member array; 
    call streaminit(454); 
     array members [24] _temporary_ (5 6 8 10 12 15 20 25 30 40 50 
             60 70 80 90 100 125 150 175 200 250 300 400 500); *any number of members here is fine; 
if _n_ eq 1 then do; * initiliaze the hash tables; 
if 0 then set simulation_tracking3; * defines the variables used; 
    declare hash _iter(dataset:'simulation_tracking3', ordered: 'a'); *ordered = ascending - do not need a sort first; 
     _iter.defineKey('CDFx');     * key is artificial, but has to exist; 
     _iter.defineData('CDFx','Allowed_Claims'); * data variables to retrieve; 
     _iter.defineDone(); 
     declare hiter hi_iter('_iter');   * the iterator object; 
end; 


    do _i_member = 1 to dim(members);   * iterate over members array; 
     call missing(claims_simulated); 
      do _i_simul = 1 to members[_i_member]-1; 
       rand_value = rand('Uniform',0,1); 
       do rc = hi_iter.first() by 0 until (hi_iter.next() ne 0 or CDFx gt rand_value); 
end; 
       ac_max = allowed_claims; 
       rc = hi_iter.prev(); 
       ac_min = allowed_claims; 
       ac_average = mean(ac_max,ac_min); 
       claims_simulated + ac_average; 
      put rand_value= claims_simulated=;     *just for logging; 
      output; 
     end; 
    putlog; 
output; *drop unnecessary columns; 
end; 
stop; 
run; 

Répondre

0

Cela n'a rien à voir avec RNG et tout à voir avec la logique de programmation . Il ne génère pas de nombre deux fois, vous produisez deux fois la même ligne.

Supprimez le output qui a le commentaire *drop unnecessary columns; et mettez à jour la boucle pour supprimer le -1.

+0

Merci Joe. Donc le 'output' que j'ai enlevé, que faisait-il? – indiansrulz

+1

Sortie d'une ligne dans l'ensemble de données - dans ce cas, une ligne supplémentaire. ('output' est ce qui dit à SAS d'écrire réellement quelque chose dans l'ensemble de données de destination.Si vous n'avez pas d'instruction' output', il en prend un sur 'run;', mais sinon il écrit souvent vous le dites.) – Joe

+0

oh okay. cela fait beaucoup plus de sens maintenant. Merci pour votre aide! – indiansrulz