Home  /  Resources & support  /  FAQs  /  Using nlcom with long expressions

Is there a way to estimate a nonlinear combination with nlcom, when the error “expression too long” is displayed?

Title   Using nlcom with long expressions
Author Isabel Canette, Gustavo Sánchez, StataCorp

There is a limit of 800 dyadic operators or 249 pairs of nested parentheses that can be used in an expression in Stata. The message

expression too long

indicates that a command is being called with an expression that is beyond those limits; therefore, you need to split the expression into smaller pieces. This can be tricky in the context of nlcom, so let us show you how it can be done.

Assume we run the following code:

sysuse auto
quietly regress mpg price rep78 displacement foreign
nlcom (normal(_b[price]* _b[rep78]) + exp(_b[displacement]*_b[foreign]))

The command nlcom will compute the variance of the expression

 normal(_b[price]* _b[rep78]) + exp(_b[displacement]*_b[foreign]))

by applying the delta method. This variance will be used to determine the confidence interval reported.

Now pretend that the expression we passed to nlcom was too long. If we split it in two parts, we can use nlcom to compute a covariance matrix for those two expressions. If, in addition, we use the option post, the new values and their covariance matrix would be posted as current results. This would allow us to use nlcom again to obtain the solution for the original problem.

nlcom (a1:normal(_b[price]* _b[rep78])) (a2:exp(_b[displacement]*_b[foreign])), post
nlcom _b[a1] + _b[a2]

Here is the output:

. nlcom (a1:normal(_b[price]* _b[rep78])) (a2:exp(_b[displacement]*_b[foreign])), post

          a1: normal(_b[price]* _b[rep78])
          a2: exp(_b[displacement]*_b[foreign])

mpg Coefficient Std. err. z P>|z| [95% conf. interval]
a1 .4999275 .0001062 4705.45 0.000 .4997192 .5001357
a2 1.044825 .0822261 12.71 0.000 .8836643 1.205985
. nlcom _b[a1] + _b[a2] _nl_1: _b[a1] + _b[a2]
mpg Coefficient Std. err. z P>|z| [95% conf. interval]
_nl_1 1.544752 .0822579 18.78 0.000 1.383529 1.705975