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.
274 lines
8.9 KiB
Plaintext
274 lines
8.9 KiB
Plaintext
9 months ago
|
*! torumm.ado version 1.1.2 fw 12/23/00 convert stata files to rumm format
|
||
|
*! syntax varlist(numeric) [, FILEname(string) FACTors(varlist numeric max=3) REVerse(varlist) IDvar(varname) ]
|
||
|
*! rev 1.1.0 (12/18/01): adds length of label check
|
||
|
|
||
|
/*
|
||
|
itemSeq Sequence of study items
|
||
|
testType E = extended/polytomous M = multiple choice
|
||
|
itemCode A maximum 5 character code describeing each item
|
||
|
itemState A 30 character description (label)
|
||
|
respType N = numeric A = alpha
|
||
|
respNumb The number of possible responses
|
||
|
scKey Scoring key: blank or R for reversed
|
||
|
respSeq 0 to 5 for numeric, A to E for alpha (the lowest level of response)
|
||
|
|
||
|
itemSeq testType itemCode itemState respType respNumb scKey respSeq
|
||
|
1 E I0001 Descriptor for Item 1 N 4 1
|
||
|
2 E I0002 Descriptor for Item 2 N 4 R 1
|
||
|
3 E I0003 Descriptor for Item 3 N 4 1
|
||
|
4 E I0004 Descriptor for Item 4 N 4 R 1
|
||
|
5 E I0005 Descriptor for Item 5 N 4 R 1
|
||
|
6 E I0006 Descriptor for Item 6 N 4 R 1
|
||
|
7 E I0007 Descriptor for Item 7 N 4 1
|
||
|
8 E I0008 Descriptor for Item 8 N 4 R 1
|
||
|
9 E I0009 Descriptor for Item 9 N 4 R 1
|
||
|
10 E I0010 Descriptor for Item 10 N 4 1
|
||
|
11 E I0011 Descriptor for Item 11 N 4 R 1
|
||
|
12 E I0012 Descriptor for Item 12 N 4 1
|
||
|
13 E I0013 Descriptor for Item 13 N 4 R 1
|
||
|
14 E I0014 Descriptor for Item 14 N 4 1
|
||
|
15 E I0015 Descriptor for Item 15 N 4 1
|
||
|
16 E I0016 Descriptor for Item 16 N 4 R 1
|
||
|
|
||
|
*/
|
||
|
|
||
|
program define torumm
|
||
|
version 6.0
|
||
|
syntax varlist(numeric) [, FILEname(string) FACTors(varlist numeric max=3) REVerse(varlist) IDvar(varname) ]
|
||
|
tokenize `varlist'
|
||
|
|
||
|
set more off
|
||
|
|
||
|
preserve
|
||
|
|
||
|
/* Process spc file items */
|
||
|
|
||
|
qui dropvars itemSeq testType itemCode itemStat respType respNumb scKey respSeq
|
||
|
|
||
|
di "Building SPC file ..."
|
||
|
qui gen byte itemSeq = .
|
||
|
qui gen str1 testType = "E"
|
||
|
qui gen str5 itemCode = ""
|
||
|
qui gen str30 itemStat = ""
|
||
|
qui gen str1 respType = "N"
|
||
|
qui gen byte respNumb = .
|
||
|
qui gen str1 scKey = ""
|
||
|
qui gen byte respSeq = .
|
||
|
|
||
|
|
||
|
if "`ttype'" == ""{
|
||
|
local ttype E
|
||
|
}
|
||
|
if "`rtype'" == ""{
|
||
|
local rtype N
|
||
|
}
|
||
|
|
||
|
local wcount: word count `varlist'
|
||
|
local varnum 0
|
||
|
while `"`1'"' != ""{
|
||
|
local varnum `varnum' + 1
|
||
|
local label : variable label `1'
|
||
|
local vword "`1'"
|
||
|
* di "`1'" " " "`label'"
|
||
|
* di `vanum'
|
||
|
qui replace itemStat = "`label'" if _n == `varnum'
|
||
|
qui replace itemStat = "`vword'" if itemStat == "" & _n == `varnum'
|
||
|
qui replace itemSeq = _n if _n == `varnum'
|
||
|
qui replace itemCode = "I" + string(_n) if _n == `varnum'
|
||
|
qui su `1'
|
||
|
qui replace respNumb = (r(max) - r(min)) + 1 if _n == `varnum'
|
||
|
qui replace respSeq = r(min) if _n == `varnum'
|
||
|
qui bothlist `1' \ `reverse'
|
||
|
if "`r(list)'" == "`1'" {
|
||
|
qui replace scKey = "R" if _n == `varnum'
|
||
|
}
|
||
|
|
||
|
mac shift
|
||
|
}
|
||
|
qui compress
|
||
|
listblck itemSeq - respSeq in 1 / `wcount'
|
||
|
qui outsheet itemSeq-respSeq using "`filename'.spc" in 1 / `wcount',noquote replace
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/* Process itm file items */
|
||
|
|
||
|
qui tostring `varlist', nodecode /* convert study variables to strings */
|
||
|
qui dropvars blockID segID comments blockS blockW TestType RespType itemLen itemSubN missSymb
|
||
|
|
||
|
|
||
|
/* We convert the ID variable to a string format */
|
||
|
local type : type `idvar'
|
||
|
if substr("`type'",1,3) != "str" {qui tostring `idvar', f(%5.0f)}
|
||
|
recast str5 `idvar'
|
||
|
qui replace `idvar' = ltrim(`idvar')
|
||
|
qui moreobs
|
||
|
qui gen order = _n
|
||
|
qui replace `idvar' ="aaaaa" in l
|
||
|
|
||
|
qui gen blockID = _n /* Data should be in order required before running this program */
|
||
|
qui gen str2 segID = ""
|
||
|
qui gen str30 comments = ""
|
||
|
qui gen byte blockS = .
|
||
|
qui gen blockW = .
|
||
|
qui gen byte TestType = 0
|
||
|
qui gen byte RespType = 0
|
||
|
qui gen byte itemLen = 0
|
||
|
qui gen itemSubN = 0
|
||
|
qui gen str3 missSymb = "bsp"
|
||
|
|
||
|
/* enter blockID data *** This is for line 1*/
|
||
|
qui replace blockID = 1 in 1
|
||
|
qui replace segID = "1" in 1
|
||
|
qui replace comments = "ID" in 1
|
||
|
qui replace blockS = 1 in 1
|
||
|
qui replace blockW = 5 in 1
|
||
|
local block = 1
|
||
|
|
||
|
if "`factors'" != ""{
|
||
|
unab cats : `factors'
|
||
|
tokenize "`cats'"
|
||
|
local facount : word count `cats'
|
||
|
*di "Number of factor variables = " "`facount'"
|
||
|
local counter = 0
|
||
|
local starter = 7 /* we begin variable placement counting at 30 */
|
||
|
/* we have skipped a space so lets add the spacer to the output template */
|
||
|
sort order
|
||
|
qui gen str1 space1 = ""
|
||
|
qui replace space1 = "s" in l
|
||
|
|
||
|
/* we have to do the same for the factors - we will do do below */
|
||
|
while `"`1'"' != ""{
|
||
|
local counter = `counter' + 1
|
||
|
local facword : word `counter' of `cats'
|
||
|
qui tab `1'
|
||
|
*di "Variable (" `counter' ") " "`1'" " has " `r(r)' " levels"
|
||
|
local block = `block' + 1
|
||
|
qui replace blockID in `block' = `block'
|
||
|
|
||
|
/* Now we enter the factor data - the variable name goes first*/
|
||
|
qui replace segID = "2" in `block'
|
||
|
local label : variable label `1'
|
||
|
if length("`label'") >5 {
|
||
|
di
|
||
|
di in red "label for `1' (`label') is more than 5 characters in length"
|
||
|
exit 198
|
||
|
}
|
||
|
if "`label'" != "" {
|
||
|
qui replace comments = "`label'" in `block'
|
||
|
}
|
||
|
else {qui replace comments = "`1'" in `block'}
|
||
|
|
||
|
qui replace blockS = `starter' in `block'
|
||
|
qui replace blockW = 1 in `block'
|
||
|
local starter = `starter' + 1
|
||
|
|
||
|
/* Now we move to the labelled categories & move down a row */
|
||
|
local block = `block' + 1
|
||
|
qui replace blockID in `block' = `block'
|
||
|
qui tab `1' /* The number of levels is r(r) then `catlev'*/
|
||
|
local catlev = `r(r)'
|
||
|
qui vallist `1',label s(^)
|
||
|
local avals `r(list)'
|
||
|
local avals : subinstr local avals " " "_", all
|
||
|
local avals : subinstr local avals "^" " ", all
|
||
|
qui vallist `1'
|
||
|
local nvals `r(list)'
|
||
|
local vcount = 1
|
||
|
*di "Alpha list = " "`avals'"
|
||
|
*di "Numerical list = " "`nvals'"
|
||
|
*di
|
||
|
|
||
|
while `vcount' <= `catlev' {
|
||
|
|
||
|
local aword : word `vcount' of `avals'
|
||
|
local nword : word `vcount' of `nvals'
|
||
|
qui replace comments = "`aword'" in `block'
|
||
|
qui replace segID = "2`counter'" in `block'
|
||
|
qui replace blockS = `counter' in `block'
|
||
|
qui replace blockW = `nword' in `block'
|
||
|
qui replace missSymb = "0" in `block'
|
||
|
*di "`aword'" " " "`nword'"
|
||
|
if `vcount' != `catlev' {local block = `block' + 1 }
|
||
|
local vcount = `vcount' + 1
|
||
|
}
|
||
|
qui tostring `1', nod
|
||
|
sort order
|
||
|
qui replace `1' = "f" in l
|
||
|
mac shift
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else{
|
||
|
di "No factor model"
|
||
|
qui gen str1 space1 = ""
|
||
|
qui replace space1 = "s" in l
|
||
|
local starter = 7
|
||
|
}
|
||
|
|
||
|
/* Now begin the placement of variables */
|
||
|
local block = `block' + 1
|
||
|
local starter = `starter' + 2
|
||
|
sort order
|
||
|
qui gen str2 space2 = ""
|
||
|
qui replace space2 = "ss" in l
|
||
|
qui replace segID = "3" in `block'
|
||
|
qui replace comments = "Items" in `block'
|
||
|
qui replace blockS = `starter' in `block'
|
||
|
qui replace blockW =`varnum' in `block'
|
||
|
qui compress comments
|
||
|
qui replace TestType = 1 in `block'
|
||
|
qui replace RespType = 1 in `block'
|
||
|
qui replace itemLen = 1 in `block'
|
||
|
qui replace itemSubN = `varnum' in `block'
|
||
|
|
||
|
/* replace varlist here with v */
|
||
|
tokenize `varlist'
|
||
|
while `"`1'"' != ""{
|
||
|
qui replace `1' = "v" in l
|
||
|
mac shift
|
||
|
}
|
||
|
listblck blockID segID comments blockS blockW TestType RespType itemLen itemSubN missSymb in 1 / `block'
|
||
|
qui outsheet blockID segID comments blockS blockW TestType RespType itemLen itemSubN missSymb using "`filename'.itm" in 1 / `block',noquote replace
|
||
|
|
||
|
/* We can now concatenate into a long string */
|
||
|
|
||
|
*format `idvar' %030s
|
||
|
|
||
|
if "`factors'" != ""{
|
||
|
local outvar "`idvar' space1 `cats' space2 `varlist'"
|
||
|
}
|
||
|
else {local outvar "`idvar' space1 space2 `varlist'"}
|
||
|
tokenize `outvar'
|
||
|
while `"`1'"' != ""{
|
||
|
qui replace `1' = "^^^^^^^^^^^^^^^^^^^^" if `1' == "",nop
|
||
|
mac shift
|
||
|
}
|
||
|
local outvar : subinstr local outvar " " "+" , all
|
||
|
*di "`outvar'"
|
||
|
gen str80 outvar = `outvar'
|
||
|
sort order
|
||
|
local lcount = 0
|
||
|
while `lcount' < _N {
|
||
|
local lcount = `lcount' + 1
|
||
|
local tempout = outvar in `lcount'
|
||
|
local sub : subinstr local tempout "^" " " , all
|
||
|
qui replace outvar = "`sub'" in `lcount'
|
||
|
}
|
||
|
qui compress outvar
|
||
|
qui drop in l
|
||
|
di "`file'"
|
||
|
*format outvar %-080s
|
||
|
outfile outvar using `filename'.dat, wide replace noq
|
||
|
l outvar
|
||
|
restore
|
||
|
di
|
||
|
su `varlist'
|
||
|
|
||
|
di
|
||
|
di "Files Created: (1) `filename'.scr (2) `filename'.itm (3) `filename'.dat"
|
||
|
|
||
|
end
|
||
|
|