You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
4.8 KiB
Plaintext

7 months ago
*! 1.0.1 - allow either y() or choice(); yrank() or rank()
* 1.0.0 - revise option names: case->casevar; id->case
* 0.2.4 - small text formatting error
* 0.2.3 - change _optnum to altnum and add as option
* 0.2.2 - allow id() to specify new variable instead of using _id - 15Jul2005
* 0.2.1 - change specification of csv from varlist to case() - 11Jul2005
program define case2alt
version 9
syntax , [y(varname numeric) YRank(name) case(name) ///
Generate(name) REplace CASEVars(namelist) Alt(namelist) noNames altnum(name) ///
Choice(name) Rank(name)] // allow choice() and rank() to sub for y() and yrank()
** CHANGE 9/8/05: allow choice() instead of y() and allow rank() instead of yrank()
if "`choice'" != "" {
local y "`choice'"
local choice ""
}
if "`rank'" != "" {
local yrank "`rank'"
local rank ""
}
* either y() or yrank() must be specified
if "`y'" == "" & "`yrank'" == "" {
di as err "option y() or yrank() must be specified"
exit 198
}
* figure out if rankdata is being specified
local rankdata "yes"
if "`y'" != "" {
local rankdata "no"
}
if "`rankdata'" == "no" & "`generate'" == "" & "`replace'" == "" {
di as txt "(note: " as res "choice " as txt "used for outcome since no variable specified by gen())"
confirm new variable choice
local generate "choice"
}
local choice "`generate'"
if "`case'" == "" {
di as txt "(note: variable " as res "_id" as txt " used since case() not specified)"
confirm new variable _id
gen _id = _n
local case "_id"
}
if "`altnum'" == "" {
di as txt "(note: variable " as res "_altnum" as txt " used since altnum() not specified)"
confirm new variable _altnum
local altnum "_altnum"
}
capture confirm variable `case'
if _rc != 0 {
gen `case' = _n
}
if "`rankdata'" == "no" {
_pecats `y'
local catval = r(catvals)
local catnms = r(catnms)
local numcats = r(numcats)
forvalues i = 1(1)`numcats' {
local y`i' : word `i' of `catval'
local ynm`i' : word `i' of `catnms'
confirm integer number `y`i''
gen _ytemp`y`i'' = 1
}
local ytemp "_ytemp"
}
if "`rankdata'" == "yes" {
capture label drop `altnum'
foreach rvar of varlist `yrank'* {
local rvarnum = subinstr("`rvar'", "`yrank'", "", 1)
local rvarnumchk = real("`rvarnum'")
if "`rvarnum'" == "`rvarnumchk'" {
local rvarlabel : variable label `rvar'
label define `altnum' `rvarnum' "`rvarlabel'", modify
}
}
}
qui reshape long `ytemp' `yrank' `alt', i(`case') j(`altnum')
capture drop _ytemp
if "`rankdata'" == "no" {
tempvar ychosen
gen `ychosen' = `y'
if "`replace'" == "replace" {
drop `y'
local choice "`y'"
}
gen `choice' = (`altnum' == `ychosen') if `altnum' < .
}
if "`rankdata'" == "yes" {
label define `altnum', modify
label values `altnum' `altnum'
_pecats `altnum'
local catval = r(catvals)
local catnms = r(catnms)
local numcats = r(numcats)
forvalues i = 1(1)`numcats' {
local y`i' : word `i' of `catval'
local ynm`i' : word `i' of `catnms'
confirm integer number `y`i''
}
* if generate option specified, rename stub to that
if "`generate'" != "" {
rename `yrank' `generate'
local yrank "`generate'"
}
}
forvalues i = 1(1)`numcats' {
local name = "y`y`i''"
if "`names'" != "nonames" & "`ynm`i''" != "`y`i''" {
local name "`ynm`i''"
}
qui gen ytemp`y`i'' = (`altnum' == `y`i'') if `altnum' < .
label variable ytemp`y`i'' "`ynm`i''"
if "`casevars'" != "" {
foreach var of varlist `casevars' {
qui gen `name'X`var' = `var' * ytemp`y`i''
}
}
local ylist "`ylist' `name'*"
clonevar `name' = ytemp`y`i''
drop ytemp`y`i''
}
* output
if "`rankdata'" == "no" {
di _n as txt "choice indicated by:" as res " `choice'"
}
if "`rankdata'" == "yes" {
di _n as txt "ranks indicated by:" as res " `yrank'"
}
di as txt "case identifier:" as res " `case'"
di as txt "case-specific interactions:" as res "`ylist'"
if "`alt'" != "" {
di as txt "alternative-specific variables:" as res " `alt'"
}
end