capture program drop mlboolean /* Version 1.3 */ program define mlboolean version 8.1 global xpath "`0'" gettoken rem feed: 0 global feed "`feed'" global typepl "`1'" capture assert "$typepl"=="logit" | "$typepl"=="probit" if _rc { di in red "Improper link function: $typepl" di in red "Link function must be either logit or probit" exit 198 } local n = "`2'" capture assert `n'<6 & `n'>1 if _rc { di in red "Invalid number of causal paths (`n')" exit 198 } foreach i of numlist 900 1000 0 1001 1/`n' { gettoken path`i' 0 : 0, match(holder) } global depvarxx "`path1001'" confirm variable $depvarxx capture assert $depvarxx==0 | $depvarxx==1 | $depvarxx==. if _rc { di in red "$depvarxx is not a 0/1 variable." exit 450 } gettoken bs ps: 0, parse(",") local boptions = subinstr("`bs'",",","",.) tokenize "`boptions'", parse("(",")") local foo `1' local foo2 `3' if "`foo'" != "" { if "`foo'" == "ystar" { local vname="`foo2'" } else{ di in red "Unknown pre-comma option: `foo'." exit 450 } } else{ local vname="ystar" } capture confirm variable boolpred if !_rc{ di in red "Warning: Variable boolpred exists and will be overwritten." di in green "Continue? (y/n)" _request(cont) if "$cont" != "y" & "$cont" != "Y" & "$cont" != "yes" { di in green "Exiting..." exit 110 } else { di in green "Dropping variable boolpred and continuing..." quietly capture drop boolpred } } capture confirm variable `vname'_a if !_rc{ di in red "Warning: Variable `vname'_a exists and will be overwritten." di in green "Continue? (y/n)" _request(cont) if "$cont" != "y" & "$cont" != "Y" & "$cont" != "yes" { di in green "Names for saved latent variables can be set with the ystar() option." di in green "Exiting..." exit 110 } else { di in green "Dropping variable `vname'_a and continuing..." quietly capture drop `vname'_a } } if `n' > 1 { capture confirm variable `vname'_b if !_rc{ di in red "Warning: Variable `vname'_b exists and will be overwritten." di in green "Continue? (y/n)" _request(cont) if "$cont" != "y" & "$cont" != "Y" & "$cont" != "yes" { di in green "Names for saved latent variables can be set with the ystar() option." di in green "Exiting..." exit 110 } else { di in green "Dropping variable `vname'_b and continuing..." quietly capture drop `vname'_b } } } if `n' > 2 { capture confirm variable `vname'_c if !_rc{ di in red "Warning: Variable `vname'_c exists and will be overwritten." di in green "Continue? (y/n)" _request(cont) if "$cont" != "y" & "$cont" != "Y" & "$cont" != "yes" { di in green "Names for saved latent variables can be set with the ystar() option." di in green "Exiting..." exit 110 } else { di in green "Dropping variable `vname'_c and continuing..." quietly capture drop `vname'_c } } } if `n' > 3 { capture confirm variable `vname'_d if !_rc{ di in red "Warning: Variable `vname'_d exists and will be overwritten." di in green "Continue? (y/n)" _request(cont) if "$cont" != "y" & "$cont" != "Y" & "$cont" != "yes" { di in green "Names for saved latent variables can be set with the ystar() option." di in green "Exiting..." exit 110 } else { di in green "Dropping variable `vname'_d and continuing..." quietly capture drop `vname'_d } } } if `n' > 4 { capture confirm variable `vname'_e if !_rc{ di in red "Warning: Variable `vname'_e exists and will be overwritten." di in green "Continue? (y/n)" _request(cont) if "$cont" != "y" & "$cont" != "Y" & "$cont" != "yes" { di in green "Names for saved latent variables can be set with the ystar() option." di in green "Exiting..." exit 110 } else { di in green "Dropping variable `vname'_e and continuing..." quietly capture drop `vname'_e } } } local poptions = subinstr("`ps'",",","",.) /* End programming in progress. */ if "$typepl" == "logit" { mlboolprep `feed' ml model lf mlboollog $mlpart1 $mlpart2 $mlpart3 $mlpart4 $mlpart5, maximize title(Boolean Logit Estimates) `poptions' ml display } if "$typepl" == "probit" { mlboolprep `feed' ml model lf mlboolprob $mlpart1 $mlpart2 $mlpart3 $mlpart4 $mlpart5, maximize title(Boolean Probit Estimates) `poptions' ml display } tempvar dropme quietly predict `dropme' if e(sample) matrix b = e(b) mlboolpred tempvar hitsasf quietly gen `hitsasf' = (boolpred >= .5)*($depvarxx==1)+(boolpred < .5)*($depvarxx==0) quietly replace `hitsasf'=. if `dropme'==. capture quietly sum `hitsasf' di "Correctly predicted " in yellow r(sum) in green " of " in yellow e(N) in green " cases, or " in yellow round((r(sum)/e(N))*100,0.01) "%" in green "." capture rename PathProb1 `vname'_a capture rename PathProb2 `vname'_b capture rename PathProb3 `vname'_c capture rename PathProb4 `vname'_d capture rename PathProb5 `vname'_e end