Hi everyone,
This is my first post here, i read the FAQ and advice but please let me know if I should change something to make this post more "palatable" to regular users.
I need to do a non linear regression using about 1300 variables that interact in pairs, so overall this amounts to about 650 parameters, therefore I am trying to write a function evaluator program.
My question is two fold. I will outline it before giving more details :
I found function evaluator programs with about 50 variables and parameters which the users had painfully defined one by one. Here as I have to define about 650 terms, I would really like to be able to compute those terms in a loop. An added bonus would be if I could batch-initialize my parameters to the same value, but that is not crucial at all.
I wrote what I think is a minimal version of the code that I need to use, for which I gel the following error "verify that nlwind is a function evaluator program".
Any help is very much appreciated. I first write below a pseudo code in order to try and make what I am trying to do as clear as possible, then I paste my tentative function evaluator program whith comments
PSEUDO CODE - to generate non linear terms from specific pairs of variables
Thank you in advance for any advice on how to tackle this.
Justin Debu
This is my first post here, i read the FAQ and advice but please let me know if I should change something to make this post more "palatable" to regular users.
I need to do a non linear regression using about 1300 variables that interact in pairs, so overall this amounts to about 650 parameters, therefore I am trying to write a function evaluator program.
My question is two fold. I will outline it before giving more details :
- Is it possible to generate the required terms for my -nl- regression in a loop inside the function evaluator program
- If the above answer is yes, could anyone help me figure out how to write this program properly (cf below a tentative minimal program with the features that I need for my regression) ?
I found function evaluator programs with about 50 variables and parameters which the users had painfully defined one by one. Here as I have to define about 650 terms, I would really like to be able to compute those terms in a loop. An added bonus would be if I could batch-initialize my parameters to the same value, but that is not crucial at all.
I wrote what I think is a minimal version of the code that I need to use, for which I gel the following error "verify that nlwind is a function evaluator program".
Any help is very much appreciated. I first write below a pseudo code in order to try and make what I am trying to do as clear as possible, then I paste my tentative function evaluator program whith comments
PSEUDO CODE - to generate non linear terms from specific pairs of variables
Code:
program with between 1 and 1500 potential variables as inputdefine parameters that are the same across pairs of variables retrieve their values loop on the pairs{ extract an identifier from the name of the variables belonging to the pair to generate a pair-specific parameter name retrieve its value generate the non-linear term combining the two variables of the pair, the pair-specific parameter and the general parameters }do the regression of the dependent variable on all 650 non linear terms generated in the loopend
Code:
program nlwind
version 12
syntax varlist(min=1 max=1500) if, at(name)
*dependent variable is the first one in my variable list
local depend : word 1 of `varlist'
*as I have to work on my variable in pairs I count how many pairs I have in addition to my dependent variable
local count : word count `varlist'
replace count=(count-1)/2
// Retrieve parameters out of at matrix
*those are two parameters that are the same across pairs of variables
tempname sigma0 sigma1
scalar `sigma0' = `at'[1,1]
scalar `sigma1' = `at'[1,2]
//loop to create all the terms
*I need to generate terms using pairs of variables (650pairs) so I use a loop
forvalues i=1/`count' {
// local variables
*extract the code of the pair from their names, the name of "even" variables is of the type pinstallCODE where CODE is a 4 or 5 digit code
local pinst : word 2*`i' of `varlist'
local ins= substr("`pinst'", 9, .)
*create the index that will let me access both variables of pair `i'
local j=2*`i'
local k=2*`i'-1
*locals of those variables
local pinst`ins' : word `j' of `varlist'
local wprev`ins' : word `k' of `varlist'
// Retrieve parameters from the loop out of at matrix
*define a pair specific parameter, coded with the 4- or 5- digits extracted above and stored in local `ins'
tempname multi`ins'
scalar `multi`ins'' = `at'[1,2+i]
// Some temporary variables
*generate pair-specific non linear terms, which have to be summed for the overall regression, so I sum them directly in another variable to avoid writing the 650 of them in the regression below
tempvar prodvent`ins' sumterms
generate double `prodvent`ins''=pinst`ins'*(14/(14 + exp(-1*`sigma0' *(`multi`ins''*wprev`ins'- `sigma1'))))*(`multi`ins''*wprev`ins'<25) `if'
capture gen double `sumterms'=`prodvent`ins'' `if'
capture replace `sumterms'=`sumterms'+`prodvent`ins'' `if'
}
//Fill dependant variable
*the regression takes place on the sum of the terms generated in the loop, the sum is stored in `sumterms'
replace `depend'=`sumterms' `if'
end
Thank you in advance for any advice on how to tackle this.
Justin Debu
