Dear SAS IML Experts,
I have some simulated data, n=500 in the following format:
x1 x2 x3 x4 x5 y1 y2 y3 y4 y5 count
I need to fit a cubic spline to each observation, probably by using the Splinec call in SAS/IML, and output 'nout' (200 fitted points).
But Splinec requires that I input 5x2 matrix (no weights required).
So I would have to enter the data in 5x2 format (e.g.: x1,y1; x2 y2; x3 y3; x4 y4; x5 y5).
How do I sample 500 5x2 matrixes from the 500 x 11 matrix that I have?
Note that each row is sufficient to create one 5x2 matrix.
Once I obtain 'nout' from each 5x2 matrix I would like to graph it, and overlay all 500 graphs on one plot. How could I do this?
Finally, I would like to have a output database where all the 'nout's are listed by 'count' and x variables - a DB of fitted values from slightly different splines for the same x-value.
How could I merge 500 'nouts' in an efficient manner?
Your help would be greatly appreciated. Many Thanks!
Best regards,
Arkady Gershteyn
Well, I'm guessing at some of the details of how your data are structured and what you are really looking for, but here's my best guess. The following DATA step creates 50 (instead of 500) data points that follow the model y = 3 + sin(x) + RANDOM_NOISE. Use whatever other model you want.
data have;
array x[5] x1-x5;
array y[5] y1-y5;
drop i;
call streaminit(12345);
do count = 1 to 50;
do i = 1 to dim(x);
x = i;
y = 3 + sin(x) + rand("Normal", 0, 0.2);
end;
output;
end;
run;
It sounds like you want to read in this data and fit a cubic spline to each observation. To do that,read the x1-y5 variables data into the matrix Z. For each row, use the SHAPE function and the T (transpose) function to reshape the row into a 5x2 matrix. Call the SPLINE function to fit the data on evenly-spaced grid of x values.
Save all the results and write it to a SAS data set so that PROC SGPLOT can graph it.
proc iml;
varNames = ("x1":"x5") || ("y1":"y5");
use have;
read all var varNames into Z;
read all var {"Count"};
close;
nout = 20; /* for testing, set NOUT small */
x = j(nrow(Z), nout); /* for storing results */
y = j(nrow(Z), nout); /* for storing results */
do i = 1 to nrow(Z); /* for each row */
v = shape(Z[i,],2); /* x is row 1 and y is row 2 */
xy = T(v); /* x is col 1 and y is col 2 */
call spline(fit, xy) NOUT=nout;
x[i,] = T(fit[,1]); /* store x values in i_th row of y */
y[i,] = T(fit[,2]); /* store predicted values in i_th row of y */
end;
/* Write data to data set; index each spline by ID var */
group = repeat(count, 1, nout);
create spline var {group x y};
append;
close;
quit;
/* plot overlay */
title "Overlay of Splines";
proc sgplot data=spline noautolegend;
series x=x y=y / group=group lineattrs=GraphData1 transparency=0.9; /* turn on transparency */
run;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.
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.