BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Kaushik1
Obsidian | Level 7

I have data(data1) in following format :

obs  |   A   |  B   |   C   |...

 1     |  10  |  20 |  40   |...

 2     |  05  |  24 |  45   |...

 3     |  67  |  45 |  152 |...

:

I want to pass each columns to call svd which is available in proc iml.

and also want to store values of call svd in another data for further use...

I have tried using ...

proc iml;
use data1;
read all;
call svd(U, D, V, A); 
call svd(U, D1, V, B); 
call svd(U, D2, V, C); 
:

call symputx("result1", D);
call symputx("result2", D1);
call symputx("result3", D2);
:
quit;

%put &result1
&result2
&result3;

data data2;
array a{*} a1-aN;
a1=&result1;
a2=&result2;
a3=&result3;
: run;

Can you help me to run this dynamically?

1 ACCEPTED SOLUTION

Accepted Solutions
PeterClemmensen
Tourmaline | Level 20

You can do something like this

 

data data1;
input A B C;
datalines;
10 20 40
05 24 45
67 45 152
;

proc iml;
   use data1;
      read all var _NUM_ into X;
   close data1;

   D=j(nrow(X), 1, .);

   do i=1 to ncol(X);
      call svd(U, temp, V, X[ ,i]);
      D[i]=temp;
   end;

   create data2 var {D};
      append;
   close data2;
quit;

 

View solution in original post

2 REPLIES 2
PeterClemmensen
Tourmaline | Level 20

You can do something like this

 

data data1;
input A B C;
datalines;
10 20 40
05 24 45
67 45 152
;

proc iml;
   use data1;
      read all var _NUM_ into X;
   close data1;

   D=j(nrow(X), 1, .);

   do i=1 to ncol(X);
      call svd(U, temp, V, X[ ,i]);
      D[i]=temp;
   end;

   create data2 var {D};
      append;
   close data2;
quit;

 

Rick_SAS
SAS Super FREQ

This seems like a lot of work to compute the norm of a vector. When you pass a vector to the SVD, the singular value is the (uncorrected) sum of squares of the elements, which is equal to the vector (L2) norm, which you can compute by using the NORM function::

 

proc iml;
use sashelp.class;
read all var {height weight age} into X;
close;

D = j(ncol(X), 1, .);
norm = j(ncol(X), 1, .);
do i=1 to ncol(X);
   call svd(U, Q, V, X[ ,i]);
   D[i]=Q;
   norm[i] = norm(X[ ,i]); /* more efficient: use NORM of each col */
end;

print D norm;

Even more efficient: the L2 norm is simply the sqrt of the sum of squares of each column, so the most efficient computation is to use the ## subscript reduction operator on each column:

 

D = sqrt( X[##, ] ); /* most efficient: sqrt(SSQ) of each column */
print D;

 

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

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
  • 2 replies
  • 758 views
  • 0 likes
  • 3 in conversation