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;
Merci Joe. Donc le 'output' que j'ai enlevé, que faisait-il? – indiansrulz
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
oh okay. cela fait beaucoup plus de sens maintenant. Merci pour votre aide! – indiansrulz