hi everyone
i have a problem with simulation using sas/iml and i cannot get on data just x1-x10 without data anyone help me please to correct this program.
thanks alot
%include "RandMVOrd.sas";
proc iml;
load module=_all_; /* load the modules */
/* P1 P2 P3 p4 p5 p6 p7 p8 p9 p10 */
P = {0.35 0.50 0.20 0.10 0.10 0.30 0.20 0.25 0.15 0.20,
0.30 0.10 0.20 0.30 0.20 0.20 0.40 0.05 0.45 0.10,
0.15 0.20 0.35 0.25 0.50 0.20 0.25 0.55 0.10 0.10,
0.20 0.20 0.25 0.35 0.20 0.30 0.15 0.15 0.30 0.60};
/* expected values and variance for each ordinal variable */
Expected = Mean(P) // Var(P);
varNames = "X1":"X10";
print Expected[r={"Mean" "Var"} c=varNames];
/* test the RandMVOrd function */
Delta = {1 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05,
0.45 1 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1,
0.4 0.45 1 0.45 0.4 0.35 0.3 0.25 0.2 0.15,
0.35 0.4 0.45 1 0.45 0.4 0.35 0.3 0.25 0.2,
0.3 0.35 0.4 0.45 1 0.45 0.4 0.35 0.3 0.25,
0.25 0.3 0.35 0.4 0.45 1 0.45 0.4 0.35 0.3,
0.2 0.25 0.3 0.35 0.4 0.45 1 0.45 0.4 0.35,
0.15 0.2 0.25 0.3 0.35 0.4 0.45 1 0.45 0.4,
0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 1 0.45,
0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 1};
call randseed(54321);
X = RandMVOrdinal(1000, P, Delta);
/* print results */
varNames = ('x1':'x10');
create MVO var {X1 X2 X3 X4 X5 X6 X7 X8 X9 X10}; append from var; close MVO; /* write data */
run;
Hi
I am waiting anyone help me to correct the previous program please.
Regards
As I commented in another thread (https://communities.sas.com/thread/52019), it is extremely hard to invent means and covariances that are valid. Try using smaller correlations. The following program works:
d = 1 || do(0.4, 0.04, -0.04);
Delta = toeplitz(d);
v = {0.05 0.05 0.05 0.05 0.10 0.10 0.10 0.10 0.2 0.20}`;
P = j(10,10);
P[,1] = v;
call randseed(1);
do i = 2 to 10;
P[,i] = v[ranperm(10)];
end;
print P, Delta;
X = RandMVOrdinal(1000, P, Delta);
thank you so much for your help i dont have any problem when i used small number of variables but in my research i need to simulate at least 10 variables so i forgot to put quotation marks in include statement after that i got on a results. thanks alot
HI
when i simulating data i found some outliers but i dont write any condition to put outliers in data how can i solve this problem.
thanks in advance
If by "outlier" you mean "an observation from an area in which the probability density is low," then this isn't necessarily a problem. You expect to get a few points in those regions. For example, if you simulate 1 million observations from a univariate standard normal distribution, you should expect to get 63 observations such that |x|>4:
P = 2*1e6*Cdf("Normal", -4);
print P;
They are outliers, yes, but they are supposed to be there. The same is true for other distributions. It is only a "problem" if you are observing these low-probability regions more often than theory predicts.
THANKS ALOT
hi
if i want to simulate multi sample data can i just change the rand seed for each one.
thanks in advance
If you want to generate many samples in one program, you can use a loop or just generate one long matrix:
/* loop approach */
NumSamples = 10;
call randseed(54321);
do i = 1 to NumSamples;
X = RandMVOrdinal(1000, P, Delta);
/* do something with each sample */
end;
/* or */
/* each block of 1000 is a sample */
X = RandMVOrdinal(NumSamples*1000, P, Delta);
thanks dr. rick
i want to simulate different samples like different cultures or different countries.
thanks alot
this code is ok now ?
proc iml;
load module=_all_; /* load the modules */
/* P1 P2 P3 p4 p5 p6 p7 p8 p9 p10 */
P = {0.35 0.50 0.20 0.10 0.10 0.30 0.20 0.25 0.15 0.20,
0.30 0.10 0.20 0.30 0.20 0.20 0.40 0.05 0.45 0.10,
0.15 0.20 0.35 0.25 0.50 0.20 0.25 0.55 0.10 0.10,
0.20 0.20 0.25 0.35 0.20 0.30 0.15 0.15 0.30 0.60};
/* expected values and variance for each ordinal variable */
Expected = Mean(P) // Var(P);
varNames = "X1":"X10";
print Expected[r={"Mean" "Var"} c=varNames];
/* test the RandMVOrd function */
Delta = {1 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05,
0.45 1 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1,
0.4 0.45 1 0.45 0.4 0.35 0.3 0.25 0.2 0.15,
0.35 0.4 0.45 1 0.45 0.4 0.35 0.3 0.25 0.2,
0.3 0.35 0.4 0.45 1 0.45 0.4 0.35 0.3 0.25,
0.25 0.3 0.35 0.4 0.45 1 0.45 0.4 0.35 0.3,
0.2 0.25 0.3 0.35 0.4 0.45 1 0.45 0.4 0.35,
0.15 0.2 0.25 0.3 0.35 0.4 0.45 1 0.45 0.4,
0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 1 0.45,
0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 1};
/* loop approach */
NumSamples = 10;
call randseed(54321);
do i = 1 to NumSamples;
X = RandMVOrdinal(1000, P, Delta);
/* do something with each sample */
/* print results */
c=varNames;
create MVO from X[colname=c]; append from X; close MVO;
quit;
because i receive this warning
WARNING: DO group statements were not executed due to missing END at the time of QUIT.
dear dr.
i still have some errors after putting the previous code can you correct it to me please
proc iml;
load module=_all_; /* load the modules */
/* P1 P2 P3 p4 p5 p6 p7 p8 p9 p10 */
P = {0.35 0.50 0.20 0.10 0.10 0.30 0.20 0.25 0.15 0.20,
0.30 0.10 0.20 0.30 0.20 0.20 0.40 0.05 0.45 0.10,
0.15 0.20 0.35 0.25 0.50 0.20 0.25 0.55 0.10 0.10,
0.20 0.20 0.25 0.35 0.20 0.30 0.15 0.15 0.30 0.60};
/* expected values and variance for each ordinal variable */
Expected = Mean(P) // Var(P);
varNames = "X1":"X10";
print Expected[r={"Mean" "Var"} c=varNames];
/* test the RandMVOrd function */
Delta = {1 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05,
0.45 1 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1,
0.4 0.45 1 0.45 0.4 0.35 0.3 0.25 0.2 0.15,
0.35 0.4 0.45 1 0.45 0.4 0.35 0.3 0.25 0.2,
0.3 0.35 0.4 0.45 1 0.45 0.4 0.35 0.3 0.25,
0.25 0.3 0.35 0.4 0.45 1 0.45 0.4 0.35 0.3,
0.2 0.25 0.3 0.35 0.4 0.45 1 0.45 0.4 0.35,
0.15 0.2 0.25 0.3 0.35 0.4 0.45 1 0.45 0.4,
0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 1 0.45,
0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 1};
/* loop approach */
NumSamples = 2;
call randseed(54321);
do i = 1 to NumSamples;
X = RandMVOrdinal(500, P, Delta);
/* do something with each sample */
end;
/* print results */
c=varNames;
create MVO from X[colname=c]; append from X; close MVO;
quit;
many thanks
Every time you exit SAS, you need to say
%include "RandMVOrd.sas";
again.
thanks alot dr. wicklin
i got on result but the results are one sample only i need 2 samples (means two different data) and when i changed number of samples in sas program i got on 1 sample also how can i simulate two different sample such n=500 , n1=250 , n2=250.
thanks again
hi
i still wait anyone tell me how can i get on a two different data by using the above command.
regards
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 16. Read more here about why you should contribute and what is in it for you!
Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.
Find more tutorials on the SAS Users YouTube channel.