BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
NiceToBeHere
Fluorite | Level 6

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?

 

Thanks a lot in advance!

1 ACCEPTED SOLUTION

Accepted Solutions
Rick_SAS
SAS Super FREQ

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;

View solution in original post

3 REPLIES 3
Rick_SAS
SAS Super FREQ

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.

NiceToBeHere
Fluorite | Level 6

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!

Rick_SAS
SAS Super FREQ

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;

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

What is ANOVA?

ANOVA, or Analysis Of Variance, is used to compare the averages or means of two or more populations to better understand how they differ. Watch this tutorial for more.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 3 replies
  • 2073 views
  • 1 like
  • 2 in conversation