*! version 2.1 January 5, 2003
* (C) Copyright 1998-2003 Michael Tomz, Jason Wittenberg, Gary King
* This file is part of the program Clarify.  All Rights Reserved.
* Description: Applies multivariate logistic transformation to list of vars
* Syntax:      tlogit v1old v1new v2old v2new..., basevar(varname) [percent]
* Future:      Allow if-in?
program define tlogit
   version 6.0
   gettoken vars 0 : 0, parse(",")
   syntax , BASE(string) [Percent]
   tsunab base : `base', max(1)          /* check for presence of basevar */
   if "`percent'" == "" { local p 1 }    /* original vars are proportions */
   else { local p 100 }                  /* original vars are percentages */
   local n 0
   local sumall `base'                   /* begin building sum expression */
   while "`vars'" ~= "" {
      local n = `n' + 1
      gettoken old`n' vars : vars
      summarize `old`n'', meanonly
      if r(min) < 0*`p' | r(max) > 1*`p' {
         di in r "Values in `old`n'' are invalid.  All " /*
            */ "values must be between " 0*`p' " and " 1*`p'
         exit 198
      }
      gettoken new`n' vars : vars
      confirm new variable `new`n''
      local fun`n' ln(`old`n''/`base')
      local sumall `sumall' + `old`n''     /* build expression */
   }
   tempvar sum
   qui gen `sum' = `sumall'
   summarize `sum', meanonly
   if r(min) <= .99*`p' | r(max) >= 1.01*`p' {
      di in r "Variable list is invalid."  /*
         */ "  Values must sum to " 1*`p' "."
      exit 198
   }
   local i 1
   while `i' <= `n' {
      qui gen `new`i'' = `fun`i'' if `sum' ~= .
      label var `new`i'' "`fun`i''"
      local i = `i' + 1
   }
end