turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

Find a Community

Topic Options

- RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

07-20-2015 11:48 AM

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

- Mark as New
- Bookmark
- Subscribe
- RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

Posted in reply to Arkady

07-20-2015 03:40 PM

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;