This code fragment page is designed to show how a number of simple linear and nonlinear models can be programmed using Stata’s ml command. These programs are not complete estimation commands but just those parts needed to compute the relevent statistics.
Acknowlegements: Most of the code on this page was borrowed or adapted from various sources that I would like to acknowledge here.
The code for OLS, binary logistic and probit regression came from “Maximum Likelihood Estimation with Stata,” by William Gould, Jeffrey Pitblado, and William Sribney
The code for poisson and negative binomial regression came from “Microeconometrics Using Stata,” by A. Colin Cameron and Pravin K. Trivedi.
The code for multinomial logistic regression was adapted from a Statalis posting by Maarten Buis.
All the programs use the same dataset, hsbdemo, and the same predictor variables, read and female. Please note that the programs for ordered logistic, ordered probit and multinomial logistic regression are coded to work with variables having exactly three categories. If your variables have more than three categories the code will need to be modified.
One way to tryout these programs is to copy and paste all of the code into your do-file editor. Load the hsbdemo dataset. Then, highlight the sections of code you are interested in and run it by clicking on the “Do document/selection” button in the editor.
Here are the code fragments:.
use https://stats.idre.ucla.edu/stat/data/hsbdemo
/****************************/
/* linear regression */
/****************************/
capture program drop lfols
program lfols
version 10.1
args lnf xb lnsigma
local y "$ML_y1"
quietly replace `lnf' = ln(normalden(`y', `xb',exp(`lnsigma')))
end
ml model lf lfols (xb: write = read female) (lnsigma:)
ml maximize
display exp([lnsigma]_cons)
/**********************************/
/* binary logistic regression */
/**********************************/
capture program drop lflogit
program lflogit
version 10.1
args lnf xb
local y "$ML_y1"
quietly replace `lnf' = ln( invlogit(`xb')) if `y'==1
quietly replace `lnf' = ln(1-invlogit(`xb')) if `y'==0
end
ml model lf lflogit (honors = read female)
ml maximize
/*************************/
/* probit regression */
/*************************/
capture program drop lfprobit
program lfprobit
version 10.1
args lnf xb
local y "$ML_y1"
quietly replace `lnf' = ln( normal(`xb')) if `y'==1
quietly replace `lnf' = ln(1-normal(`xb')) if `y'==0
end
ml model lf lfprobit (honors = read female)
ml maximize
/*************************************/
/* ordered logitistic regression */
/*************************************/
capture program drop lfologit
program lfologit
version 10.1
args lnf xb a1 a2
local y "$ML_y1"
quietly replace `lnf' = ln( invlogit(`a1'-`xb')) if `y'==1
quietly replace `lnf' = ln( invlogit(`a2'-`xb') -invlogit(`a1'-`xb')) if `y'==2
quietly replace `lnf' = ln(1-invlogit(`a2'-`xb')) if `y'==3
end
ml model lf lfologit (ses = read female, nocons) /cut1 /cut2
ml maximize
/*********************************/
/* ordered probit regression */
/*********************************/
capture program drop lfoprobit
program lfoprobit
version 10.1
args lnf xb a1 a2
local y "$ML_y1"
quietly replace `lnf' = ln( normal(`a1'-`xb')) if `y'==1
quietly replace `lnf' = ln( normal(`a2'-`xb') - normal(`a1'-`xb')) if `y'==2
quietly replace `lnf' = ln(1-normal(`a2'-`xb')) if `y'==3
end
ml model lf lfoprobit (ses = read female, nocons) /cut1 /cut2
ml maximize
/***************************************/
/* multinomial logistic regression */
/***************************************/
tab prog, gen(pr)
global y1 "pr1"
global y2 "pr2"
global y3 "pr3"
capture program drop lfmlogit
program lfmlogit
version 10.1
args lnf xb1 xb2
tempvar p1 p2 p3
quietly {
gen double `p1' = 1/(1+exp(`xb1')+exp(`xb2'))
gen double `p2' = exp(`xb1')/(1+exp(`xb1')+exp(`xb2'))
gen double `p3' = exp(`xb2')/(1+exp(`xb1')+exp(`xb2'))
replace `lnf' = $y1*ln(`p1') + $y2*ln(`p2') + $y3*ln(`p3')
}
end
ml model lf lfmlogit (eq1: prog = read female) (eq2: read female)
ml maximize
/**************************/
/* poisson regression */
/**************************/
capture program drop lfpois
program lfpois
version 10.1
args lnf theta1
tempvar lnyfact mu
local y "$ML_y1"
generate double `lnyfact' =lnfactorial(`y')
generate double `mu' = exp(`theta1')
quietly replace `lnf' = -`mu' + `y'*`theta1' - `lnyfact'
end
ml model lf lfpois (awards = read female), vce(robust)
ml maximize
/************************************/
/* negative binomial regression */
/************************************/
capture program drop lfnb
program lfnb
version 10.1
args lnf theta1 a
tempvar mu
local y "$ML_y1"
generate double `mu' = exp(`theta1')
quietly replace `lnf' = lngamma(`y'+ (1/`a'))-lngamma((1/`a')) ///
- lnfactorial(`y') - (`y'+(1/`a'))*ln(1+`a'*`mu') ///
+ `y'*ln(`a') + `y'*ln(`mu')
end
ml model lf lfnb (awards = read female)(a:)
ml maximize
