BookmarkSubscribeRSS Feed
mamzolo
Calcite | Level 5

I have a macro which orders means (ascending/descending) using PROC IML. But I want to do this for each simulation number. Is it possible to do this, given that in the usual data step I can use the 'BY statement'?

Here is it this SAS macro and a small dataset is attached (with variables sim, meanX1--meanX5). This macro is support to arrange the means in a descending order per 'sim'.

%macro mean_will(numbersim=, J1=, J2=, J3=, J4=, J5=, df=);


proc iml;

start MLE(x,n);

      k=ncol(x);

      m=j(1,k,.);

      a=j(1,k,.);

      c=j(1,k,.);

      do i=1 to k;

         do u=1 to i;

            do v=i to k;

            a=sum(x[u:v]#n[u:v])/sum(n[u:v]);

         end;

         c=max(a);

         a=j(1,k,.);

         end;

         m=min(c);

         c=j(1,k,.);

      end;

      return(m);

finish;

use meanXit;

read all into Xmat;

   x=Xmat[,2]||Xmat[,3]||Xmat[,4]||Xmat[,5]||Xmat[,6];

   n={&J1 &J2 &J3 &J4 &J5};

   m=MLE(x,n);

create meanX from m;

append from m;

run;

quit;

%mend;

%mean_will(numbersim=2, J1=7, J2=2, J3=2, J4=2, J5=2, df=20);

4 REPLIES 4
Rick_SAS
SAS Super FREQ

You say that you want to "order means for each simulation number," but I don't understand the connection to the %mean_will macro, which is not sorting anything.

The example data are

sim meanX1 meanX2 meanX3 meanX4 meanX5

1 1.85570 1.82321 1.85598 1.80608 1.81799

2 1.84527 1.82912 1.85502 1.85474 1.82042

What do you want the results to be, and why? Do you want each row to appear in sorted order?  Do you want to run the %mean_will macro and then sort the resulting vector?

BTW, in the macro I notice that you are computing with x[u:v] when x is a matrix. Are you trying to work with the columns x[ ,u:v]?

mamzolo
Calcite | Level 5

Yes the proc iml inside %mean_will macro looks at the mean values meanX1-meanX5 to see if they are all in a non-increasing order, if that's not the case it will take the average of those means that violate this restriction.

I want to be able to do this for each sim=1, 2, etc. The reason is that I'm doing some analysis where the alternative hypothesis is ordered this way. For this macro I want to be able to get the means computed/arranged as indicated in the proc iml but this done for each 'sim'. The whole macro works perfect when only 1 row is considered, problems start when I include several rows.

Yes, I'm working with the columns.

All in all it's more like this: For each sim (row) : The value in column 1 >= the value in column 2 >= etc.

I hope this helps.

Rick_SAS
SAS Super FREQ

I can't make sense of what your algorithm is doing, but here are some tips:

In the innermost loop, you have a computation that is equivalent to

         w = x[u:v]#n[u:v];

         a=w[+] / sum(n[u:v]);

This expression is incorrect when x is a matrix.  Instead, you might consider a vector expression like this:

         w = x[ ,u:v]#n[ ,u:v];

         a[ ,v]=w[ ,+] / sum(n[u:v]);

where now a is now a matrix: a = j(nrow(x), ncol(x), .);

Then you have to do something with the MIN and MAX functions, so that you get the min and max for each row(?).  Perhaps you can use  something like this:

       maxOfRows = a[ , <>];

      minOfRows = a[ , ><];

In short, express everything as vectors and use subscript reduction operators. Subscript reduction operators are described here: Compute statistics for each row by using subscript operators - The DO Loop

Good luck.     

mamzolo
Calcite | Level 5

Thanks a lot, will look into your considerations carefully!

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Multiple Linear Regression in SAS

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.

From The DO Loop
Want more? Visit our blog for more articles like these.
Discussion stats
  • 4 replies
  • 1095 views
  • 3 likes
  • 2 in conversation