Statistical programming, matrix languages, and more

Creating an average matrix from four individual matrices of same size in SAS / IML

Accepted Solution Solved
Reply
New Contributor
Posts: 2
Accepted Solution

Creating an average matrix from four individual matrices of same size in SAS / IML

[ Edited ]

I am using IML/SAS in SAS Enterprise Guide for the first time, and want to do the following:

1.  Read some datasets into IML matrices
2.  Average the matrices
3.  Turn the resulting IML matrix back into a SAS data set

My input data sets look something like the following (this is dummy data - the actual sets are larger). The format of the input data sets is also the format I want from the output data sets.

    data_set0:     d_1    d_2    d_3
                   1      2      3
                   4      5      6
                   7      8      9


I proceed as follows:

  

 proc iml;
        /* set the names of the migration matrix columns */
        varNames = {"d_1","d_2","d_3"};
       
        /* 1. transform input data set into matrix
        USE data_set_0;
        READ all var _ALL_ into data_set0_matrix[colname=varNames];
        CLOSE data_set_0;
 
        USE data_set_1;
        READ all var _ALL_ into data_set1_matrix[colname=varNames];
        CLOSE data_set_1;

        USE data_set_2;
        READ all var _ALL_ into data_set2_matrix[colname=varNames];
        CLOSE data_set_2;

        USE data_set_3;
        READ all var _ALL_ into data_set3_matrix[colname=varNames];
        CLOSE data_set_3;

        /* 2. find the average matrix */
        matrix_sum = (data_set0_matrix + data_set1_matrix +
                      data_set2_matrix + data_set3_matrix)/4;
    
        /* 3. turn the resulting IML matrix back into a SAS data set */
        create output_data from matrix_sum[colname=varNames];
        append from matrix_sum;
        close output_data;
     quit; 


    
I've been trying loads of stuff, but nothing seems to work for me. The error I currently get reads:

ERROR: Matrix matrix_sum has not been set to a value


What am I doing wrong? Thanks up front for the help.


Accepted Solutions
Solution
‎02-21-2017 04:30 AM
New Contributor
Posts: 2

Re: Creating an average matrix from four individual matrices of same size in SAS / IML

Turns out the code above works. I had a seperate issue in my dataset. I'll leave the question up in case somebody else wants to do something simillar in the future.

View solution in original post


All Replies
Solution
‎02-21-2017 04:30 AM
New Contributor
Posts: 2

Re: Creating an average matrix from four individual matrices of same size in SAS / IML

Turns out the code above works. I had a seperate issue in my dataset. I'll leave the question up in case somebody else wants to do something simillar in the future.

Super Contributor
Posts: 400

Re: Creating an average matrix from four individual matrices of same size in SAS / IML

[ Edited ]
data data_set0;
   input d_1 d_2 d_3;
   datalines;
1      2      3
4      5      6
7      8      9
;

data data_set1;
   input d_1 d_2 d_3;
   datalines;
1      2      3
4      5      6
7      8      9
;

data data_set2;
   input d_1 d_2 d_3;
   datalines;
1      2      3
4      5      6
7      8      9
;

data data_set3;
   input d_1 d_2 d_3;
   datalines;
1      2      3
4      5      6
7      8      9
;


proc iml;
        /* set the names of the migration matrix columns */
        varNames = {"d_1","d_2","d_3"};
       
        /* 1. transform input data set into matrix */
        USE data_set0;
        READ all var _ALL_ into data_set0_matrix[colname=varNames];
        CLOSE data_set_0;
 
        USE data_set1;
        READ all var _ALL_ into data_set1_matrix[colname=varNames];
        CLOSE data_set_1;

        USE data_set2;
        READ all var _ALL_ into data_set2_matrix[colname=varNames];
        CLOSE data_set_2;

        USE data_set3;
        READ all var _ALL_ into data_set3_matrix[colname=varNames];
        CLOSE data_set_3;

        /* 2. find the average matrix */
        matrix_sum = (data_set0_matrix + data_set1_matrix +
                      data_set2_matrix + data_set3_matrix)/4;
    
        /* 3. turn the resulting IML matrix back into a SAS data set */
        create output_data from matrix_sum[colname=varNames];
        append from matrix_sum;
        close output_data;
     quit; 

Just minor corrections will make your code work as above Smiley Happy

 

EDIT: I see you made it work already. Thumbs up Smiley Happy

Post a Question
Discussion Stats
  • 2 replies
  • 201 views
  • 0 likes
  • 2 in conversation