## A tip to debug your nl/nlsur function evaluator program

If you have a bug in your evaluator program, **nl** will produce, most probably, the following error:

your programreturned 198 verify thatyour programis a function evaluator program r(198);

The error indicates that your program cannot be evaluated.

The best way to spot any issues in your evaluator program is to run it interactively. You just need to define your sample (usually observations where none of the variables are missing), and a matrix with values for your parameters. Let me show you an example with **nlces2**. This is the code to fit the CES production function, from the documentation for the **nl** command:

cscript program nlces2 version 12 syntax varlist(min=3 max=3) if, at(name) local logout : word 1 of `varlist' local capital : word 2 of `varlist' local labor : word 3 of `varlist' // Retrieve parameters out of at matrix tempname b0 rho delta scalar `b0' = `at'[1, 1] scalar `rho' = `at'[1, 2] scalar `delta' = `at'[1, 3] tempvar kterm lterm generate double `kterm' = `delta'*`capital'^(-1*`rho') `if' generate double `lterm' = (1-`delta')*`labor'^(-1*`rho') `if' // Fill in dependent variable replace `logout' = `b0' - 1/`rho'*ln(`kterm' + `lterm') `if' end webuse production, clear nl ces2 @ lnoutput capital labor, parameters(b0 rho delta) /// initial(b0 0 rho 1 delta 0.5)

Now, let me show you how to run it interactively:

webuse production, clear *generate a variable to restrict my sample to observations *with non-missing values in my variables egen u = rowmiss(lnoutput capital labor) *generate a matrix with parameters where I will evaluate my function mat M = (0,1,.5) gen nloutput_new = 1 nlces2 nloutput_new capital labor if u==0, at(M)

This will evaluate the program only once, using the parameters in matrix M. Notice that I generated a new variable to use as my dependent variable. This is because the program **nlces2**, when run by itself, will modify the dependent variable.

When you run this program by itself, you will obtain a more specific error message. You can add debugging code to this program, and you can also use the **trace** setting to see how each step is executed. Type **help trace** to learn about this setting.

Another possible source of error (which will generate error r(480) when run from **nl**) is when an evaluator function produces missing values for observations in the sample. If this is the case, you will see those missing values in the variable nloutput_new, i.e., in the variable you entered as dependent when running your evaluator by itself. You can then add debugging code, for example, using **codebook** or **summarize** to examine the different parts that contribute to the substitution performed in the dependent variable.

For example, after the line that generates **`kterm’**, I could write

summarize `kterm' if u == 0

to see if this variable contains any missing values in my sample.

This method can also be used to debug your function evaluator programs for **nlsur**. In order to preserve your dataset, you need to use copies for all the dependent variables in your model.