## multivariate Non linear regression

Solved
Occasional Contributor
Posts: 5

# multivariate Non linear regression

[ Edited ]

Hi All,

I am trying to use NLIN Model (Non linear regression) using Sas guide.

My model has many covariats. When using the Sas Wizard, it's written that the number of explanatory variable is limited to 1 (not sure why..). However, when trying to update the code, it allowed me to add two more covariates but when adding dozens, I get the message: 'Zero observations could be evaluated' and the model did not predict anything.

Do you have any idea how to make it work?

Accepted Solutions
Solution
‎05-25-2017 03:44 PM
SAS Super FREQ
Posts: 3,831

## Re: multivariate Non linear regression

Although your title says "nonlinear regression," this looks like a LINEAR equation with constrained coefficients > 0.

You can put the bounds on a single statement:

BOUNDS a b ... az > 0;

Without the real code, there's not much to say. However, here is a simulated linear regression data set that contains 20 variables and an intercept. PROC NLIN has no problems finding the parameter estimates. Maybe you can use this example to help guide you. Good luck.

``````%let N = 100000;        /* Specify sample size */
%let nCont = 20;       /* Specify the number of continuous variables */

data SimReg1(keep= Y x:);
call streaminit(54321);              /* set the random number seed */
array x[&nCont];         /* explanatory vars are named x1-x&nCont  */

/* 1. Specify model coefficients. You can hard-code values such as
array beta[0:&nCont] _temporary_ (-4 2 -1.33 1 -0.8 0.67 -0.57 0.5 -0.44 0.4 -0.36);
or you can use a formula such as the following */
array beta[0:&nCont] beta0-beta&nCont;
do j = 0 to &nCont;
beta[j] = round(4*rand("uniform"), 0.1); /* formula for beta[j]  */
end;
put (beta[*]) (=);     /* put each element of array */

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;

eta = beta[0];                       /* model = intercept term   */
do j = 1 to &nCont;
eta = eta + beta[j] * x[j];       /*     + sum(beta[j]*x[j])  */
end;
epsilon = rand("Normal", 0, 1.5);    /* 3. Specify error distrib */
Y = eta + epsilon;                   /* 4. Y = model + error     */
output;
end;
run;

ods select ParameterEstimates;
proc nlin data=SimReg1;
parms b1-b20 =1;
bounds b1-b20 > 0;
model Y = b1*x1 + b2*x2 + b3*x3 + b4*x4 + b5*x5 +
b6*x6 + b7*x7 + b8*x8 + b9*x9 + b10*x10 +
b11*x11 + b12*x12 + b13*x13 + b14*x14 + b15*x15 +
b16*x16 + b17*x17 + b18*x18 + b19*x19 + b20*x20;
run;``````

All Replies
SAS Super FREQ
Posts: 3,831

## Re: multivariate Non linear regression

Paste the "updated code" that you typed in.  It's possible that that model cannot be evaluated on this data. For example, a model that has the term "log(x)"  doesn't make sense if x is always negative.  Sample data would be helpful, too.

Occasional Contributor
Posts: 5

## Re: multivariate Non linear regression

Hi,

I don't have access to the code at the moment, but I changed the generated code in 4 sections to change it to mulrivariates.

when I added a total of 15 covariates it did work. But from 16 it gave me the warning and did not work.

These are the changes I made:

(cov1 = name of the first covariate)

Select

1. a*"cov1"n ; b*"cov2"n ; ...az*"cov52"n;

2. "dependentVar1"n = a*"cov1"n + b*"cov2"n + c*"cov3"n + ... + az*"cov52"n

3. a = 0.001 b= 0.001 c= 0.001....az = 0.001;

4.

Bounuds a > 0;

Bounuds b > 0;............

Bounuds az > 0;

Regarding the input: there are about 100 vectors which describe amounts - integers between 1 and 10,000 while some of them are very sparse (mostly zeros).

I hope this is enought information.

Thanks!

Solution
‎05-25-2017 03:44 PM
SAS Super FREQ
Posts: 3,831

## Re: multivariate Non linear regression

Although your title says "nonlinear regression," this looks like a LINEAR equation with constrained coefficients > 0.

You can put the bounds on a single statement:

BOUNDS a b ... az > 0;

Without the real code, there's not much to say. However, here is a simulated linear regression data set that contains 20 variables and an intercept. PROC NLIN has no problems finding the parameter estimates. Maybe you can use this example to help guide you. Good luck.

``````%let N = 100000;        /* Specify sample size */
%let nCont = 20;       /* Specify the number of continuous variables */

data SimReg1(keep= Y x:);
call streaminit(54321);              /* set the random number seed */
array x[&nCont];         /* explanatory vars are named x1-x&nCont  */

/* 1. Specify model coefficients. You can hard-code values such as
array beta[0:&nCont] _temporary_ (-4 2 -1.33 1 -0.8 0.67 -0.57 0.5 -0.44 0.4 -0.36);
or you can use a formula such as the following */
array beta[0:&nCont] beta0-beta&nCont;
do j = 0 to &nCont;
beta[j] = round(4*rand("uniform"), 0.1); /* formula for beta[j]  */
end;
put (beta[*]) (=);     /* put each element of array */

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;

eta = beta[0];                       /* model = intercept term   */
do j = 1 to &nCont;
eta = eta + beta[j] * x[j];       /*     + sum(beta[j]*x[j])  */
end;
epsilon = rand("Normal", 0, 1.5);    /* 3. Specify error distrib */
Y = eta + epsilon;                   /* 4. Y = model + error     */
output;
end;
run;

ods select ParameterEstimates;
proc nlin data=SimReg1;
parms b1-b20 =1;
bounds b1-b20 > 0;
model Y = b1*x1 + b2*x2 + b3*x3 + b4*x4 + b5*x5 +
b6*x6 + b7*x7 + b8*x8 + b9*x9 + b10*x10 +
b11*x11 + b12*x12 + b13*x13 + b14*x14 + b15*x15 +
b16*x16 + b17*x17 + b18*x18 + b19*x19 + b20*x20;
run;``````
☑ This topic is solved.