Obsidian | Level 7

## Re: How to create two-way interaction terms of multiple variables and store them into a data table?

Thanks! I like it!
Barite | Level 11

## Re: How to create two-way interaction terms of multiple variables and store them into a data table?

I developed my idea above into a small helper function that others might find useful.

``````proc iml;
/* The TRI_IDX function returns the index numbers of the triangular elements in a
square matrix of side n.

The parameter UPPER is a Boolean that gives the upper triangle when true,
the lower triangle when false.

The parameter MAINDIAG is a Boolean that indicates whether or not the
elements from the main diagonal should be included.
*/
start tri_idx(n, upper, maindiag);
idx = cusum( vech( diag((1-maindiag):(n-1)) + 1));
if upper then return(idx); else return((n#n+1) - idx[nrow(idx):1] );
finish;

/* demonstrate function for a 4x4 matrix */
print (shape(1:16,4)) [format=2.0];
print (tri_idx(4,0,0)) [l='lower triangle no diagonal'];
print (tri_idx(4,0,1)) [l='lower triangle including diagonal'];
print (tri_idx(4,1,0)) [l='upper triangle no diagonal'];
print (tri_idx(4,1,1)) [l='upper triangle including diagonal'];
quit;``````
SAS Super FREQ

## Re: How to create two-way interaction terms of multiple variables and store them into a data table?

For additional thoughts on @IanWakeling's function, see "Extract the lower triangular elements of a matrix", which uses the built-in VECH function when the diagonal elements are included.

Obsidian | Level 7

## Re: How to create two-way interaction terms of multiple variables and store them into a data table?

Sure. Thanks!
Obsidian | Level 7

## Re: How to create two-way interaction terms of multiple variables and store them into a data table?

I like it! Thanks!
From The DO Loop