Turn on suggestions

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

Showing results for

- Home
- /
- Programming
- /
- Programming
- /
- macro for simple linear regression

Options

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

🔒 This topic is **solved** and **locked**.
Need further help from the community? Please
sign in and ask a **new** question.

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Posted 09-15-2019 06:31 PM
(3151 views)

Hello,

I am trying to make a macro that will allow me to do linear regressions by changing the independent and dependent variables.

proc reg data=mydata;

model y1=x1;

run;

Thank you!

- Tags:
- macro
- regression

1 ACCEPTED SOLUTION

Accepted Solutions

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

You'd only need to use a couple of %do loops. You'll have to set how high you want the value of y to go. Not knowing, I used 9. Also, I haven't tested the following .. thus no guarantees on whether it's correct.

```
%macro doit;
%do y=1 %to 9;
%do x=1 %to 9;
proc reg data=mydata;
model y&y.=x&x.;
run;
%end;
%end;
%mend;
%doit
```

Art, CEO, AnalystFinder.com

4 REPLIES 4

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

You'd only need to use a couple of %do loops. You'll have to set how high you want the value of y to go. Not knowing, I used 9. Also, I haven't tested the following .. thus no guarantees on whether it's correct.

```
%macro doit;
%do y=1 %to 9;
%do x=1 %to 9;
proc reg data=mydata;
model y&y.=x&x.;
run;
%end;
%end;
%mend;
%doit
```

Art, CEO, AnalystFinder.com

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

https://blogs.sas.com/content/iml/2017/02/13/run-1000-regressions.html

An easy way to run 1000's of regressions in SAS - without macros and it makes it easier to parse the output in this manner because it's all together especially any output tables.

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

@Reeza . I don't often get the opportunity to disagree with @Rick_SAS, so I had to disagree this time. Not regarding getting output that's easier to parse, but regarding processing times of macros vs byvar approaches.

Yes, sometimes byvar processing can vastly reduce runtimes, but not for a simple regression like @akf06 asked about.

I ran the following code to compare the two approaches. The run times were very similar for both 100 and 1000 cases (just under a minute for N=100). And, since the byvar approach required one to write more code than the macro approach, I still vote for the macro approach (in this case).

```
/* Create wide data with variables Y1, y2, y3 ..., X1, X2, X3, ....*/
%let xCont = 9; /* <== Specify the number of continuous ind variables */
%let yCont = 9; /* <== Specify the number of continuous dep variables */
%let N = 100; /* Specify sample size */
data Wide(keep= y: x:);
call streaminit(54321); /* set the random number seed */
array x[&xCont]; /* explanatory vars are named x1-x&nCont */
array y[&yCont]; /* dependent vars are named y1-y&yCont */
do i = 1 to &N; /* for each observation in the sample */
do j = 1 to dim(x);
x[j] = rand("Normal"); /* 2. Simulate explanatory variables */
end;
do j = 1 to dim(y);
y[j] = rand("Normal"); /* 2. Simulate dependent variables */
end;
output;
end;
run;
/****** macro approach ******/
%macro RunReg;
%do i = 1 %to 9; /* repeat for each x&i */
%do j = 1 %to 9; /* repeat for each y&i */
proc reg data=wide;
model Y&j. = x&i; /* model Y_j = x_i */
quit;
%end;
%end;
%mend;
%RunReg
/* byvar approach */
/* 1. make file long */
data Long (keep=ind dep byvar);
set Wide;
array x [*] x1-x&nCont;
array y [*] y1-y&yCont;
do xNum = 1 to dim(x);
ind = x[xNum];
do yNum = 1 to dim(y);
dep = y[yNum];
byvar=catt(xNum,yNum);
output;
end;
end;
run;
/* 2. Sort by BY-group variable */
proc sort data=long;
by byvar;
run;
/* 3. Call PROC REG and use BY statement to compute all regressions */
proc reg data=Long;
by byvar;
model dep = ind;
quit;
```

Art, CEO, AnalystFinder.com

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

I haven't done any testing, but it would seem to me that there is an even faster approach, where for each X, you invert the matrix only once, and you put all the Y variables on the left hand side of the equal sign in the MODEL statement. Now, if you have a data set of 20 observations, this may not save anything but a trivial amount of time, but if your data set has 2 million observations, I'm sure it will save time.

```
%macro doit;
%do x=1 %to 9;
proc reg data=mydata;
model %do y=1 %to 9; y&y. %end;=x&x.;
run;
%end;
%mend;
%doit
```

Naturally, I add in my usual disclaimer: I am not recommending this approach of running multiple regressions, there are better approaches to modeling that don't involve running many many many PROC REGs when you have many X variables and many Y variables, specifically (but not limited to) Partial Least Squares regression. Just because you CAN do it this way doesn't mean you SHOULD do it this way.

--

Paige Miller

Paige Miller

Are you ready for the spotlight? We're accepting content ideas for **SAS Innovate 2025** to be held May 6-9 in Orlando, FL. The call is **open **until September 25. Read more here about **why** you should contribute and **what is in it** for you!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.