|
|
|
||||
|
Help the Stat Consulting Group by
giving a gift
| |||||
|
Loading
|
|||||
* make a fake data file
clear
input id month var1
1 1 0
1 2 0
1 3 1
1 4 0
1 5 0
1 6 0
1 7 1
1 8 1
1 9 1
1 10 0
1 11 1
1 12 1
1 13 0
1 14 0
1 15 0
1 16 1
1 17 1
1 18 1
1 19 1
1 20 1
2 1 0
2 2 0
2 3 1
2 4 1
2 5 1
2 6 1
2 7 1
2 8 1
2 9 1
2 10 0
2 11 1
2 12 1
2 13 0
2 14 0
2 15 0
2 16 1
2 17 1
2 18 1
2 19 1
2 20 1
3 1 0
3 2 0
3 3 0
3 4 0
3 5 0
3 6 0
3 7 0
3 8 0
3 9 1
3 10 1
3 11 1
3 12 1
3 13 1
3 14 1
3 15 1
3 16 1
3 17 1
3 18 1
3 19 1
3 20 1
4 1 0
4 2 0
4 3 0
4 4 0
4 5 0
4 6 0
4 7 1
4 8 0
4 9 1
4 10 1
4 11 0
4 12 1
4 13 1
4 14 1
4 15 1
4 16 1
4 17 1
4 18 1
4 19 1
4 20 1
end
* set line where spell must start by
local line = 6
* set minimum spell length (for it to be a spell)
local minspel = 2
* can do find and replace to change these variable names
* id variable is named "id"
* month variable is named "month"
* binary variable is called "var1"
sort id month
* make f_id which is 0/1 if first id of group
generate f_id = 0
quietly by id : replace f_id=1 if _n == 1
* make l_id which is 0/1 if last id of group
generate l_id = 0
quietly by id : replace l_id=1 if _N == _n
* initialize variables
gen sp_strt = 0 /* start of spell */
gen sp_end = 0 /* end of spell */
gen sp_len = 0 /* spell length */
* cycle through obs, 1 to _N, examining spells
local obs = 1
while (`obs' <= _N) {
* initialize vars at start of ID
if f_id[`obs']==1 {
local start = 0 /* macro var with start of spell */
local stop = 0 /* macro var with end of spell */
local inspel = 0 /* 0/1 if in spell */
local hadspel = 0 /* 0/1 if already found a spell for this id */
}
* if 1, try to identify start of spell
if var1[`obs'] == 1 {
* start of spell
if (`inspel' == 0) & (`hadspel' == 0) {
local inspel = 1
local start = month[`obs']
replace sp_strt = 1 in `obs'
}
}
* if 0, try to identify end of spell
if var1[`obs'] == 0 {
* are we in a spell
if (`inspel' == 1) & (`hadspel' == 0) {
replace sp_end = -1 in `obs'
* does the spell start after the line,
* or end after the line, and is spell long enough
if ( (`start' >= `line') | (month[`obs'-1] >= `line') ) & ///
((month[`obs'-1]-`start'+1) >= `minspel') {
local stop = month[`obs'-1]
replace sp_end = 1 in `obs'
local hadspel = 1
}
else {
* otherwise, reset spell info
local inspel = 0
local start = 0
}
}
}
* if at last observation for id
if (l_id[`obs'] == 1) {
* check to see if in a spell not completed
if (`inspel' == 1) & (`hadspel' == 0) {
local stop = month[`obs']
}
* store spell info in last observation for id
replace sp_strt = `start' in `obs'
replace sp_end = `stop' in `obs'
replace sp_len = `stop' - `start' + 1 in `obs'
}
* add 1 to obs
local obs = `obs' + 1
}
* have a look at results to see if OK
clist month var1 sp*
* keep just last obs
quietly by id: keep if _N == _n
keep id sp*
* look at final values
clist
UCLA Researchers are invited to our Statistical Consulting Services
We recommend others to our list of Other Resources for Statistical Computing Help
These pages are Copyrighted (c) by UCLA Academic Technology Services