program define choi_lr_support_interval , rclass version 14 * Calculate the upper and lower bounds for the \$k_global support interval * This is done using the nl command following an approach described in * http://www.stata.com/support/faqs/programming/system-of-nonlinear-equations/ * The nl program fits non-linear regression functions by least squares. We get * an exact solution to an equation by fitting a model with two parameters and * two variables. (For some reason this approach doesn't work with only one * record). The dependent variable must take the values 1 and 0 in records 1 & 2. * Suppose we wish to solve f(x) = 0 * We let y = 1 = f(x) +1 in the first record and * y = 0 = dummy in the second * nl then findes the least squares estimates of x and dummy, which will equal * the value of x that gives f(x) = 0, and dummy = 0, respectively. clear // Note that this command does not erase our scalar values. * Calculate the upper bound of the \$k_global support interval * Calculate a starting value assuming a normal approximation of the likelihood function local a = y1 local b = y2 local c = n1-`a' local d = n2-`b' local sigma = sqrt(1/`a' + 1/`b' +1/`c' + 1/`d') local log_ub = psi_mle +`sigma'*sqrt(2*log(\$k_global)) local ub = exp(`log_ub') local support_start = `log_ub' quietly set obs 2 generate y = 0 quietly replace y = 1 in 1 quietly nl _choi_support_interval @ y, parameters(psi dummy ) /// initial(psi `support_start' dummy 0 ) scalar psi = [psi]_b[_cons] scalar dummy = [dummy]_b[_cons] scalar LRsupport_ub = exp(psi) choi_lr_hyperg_prob n1 n2 y1 y2 psi * Calculate the lower bound * Calculate the starting value local log_lb = psi_mle - `sigma'*sqrt(2*log(\$k_global)) local lb = exp(`log_lb') local support_start = `log_lb' quietly nl _choi_support_interval @ y, parameters(psi dummy ) /// initial(psi `support_start' dummy 0 ) scalar psi = [psi]_b[_cons] scalar dummy = [dummy]_b[_cons] scalar LRsupport_lb = exp(psi) choi_lr_hyperg_prob n1 n2 y1 y2 psi local k_alpha =strofreal(\$k_global,"%-10.7g") display "1/`k_alpha'LSI for the OR = [" /// LRsupport_lb ", "LRsupport_ub "]" return scalar LRsupport_lb =LRsupport_lb return scalar LRsupport_ub =LRsupport_ub end // *****************************************************************