I have a panel on workers in different companies over years. Each worker is assigned a number between 0 and 3 (corresponding to their layer/level of importance). In some companies some layers are missing, for example I may only have workers from layers 0 and 2. In those cases I would like to redefine the variable to keep the order but have consecutive numbers starting at 0, i.e. change those with layer = 2 to layer = 1. I wrote some code which loops over all companies which need changes but it's taking forever to run. I tried other options but I can't find a way to combine 'by' with 'levelsof' to write the condition I want to check in a single line. I was wondering if anyone has suggestions on a more efficient way to do this.
Thank you!
Code:
egen num_layers = nvals(layer), by(firm_id year) egen firm_year = group(firm_id year) gen wrong = . replace wrong = 1 if (num_layers == 2 & layer > 1) | (num_layers == 3 & layer == 3) gen need_fix = wrong*firm_year levelsof need_fix, local(f) foreach i of local f { levelsof layer if firm_year == `i' if (r(levels) == "0 2" | r(levels) == "0 3") { replace layer = 1 if firm_year == `i' & layer > 0 } if r(levels) == "1 2" { replace layer = 0 if firm_year == `i' & layer == 1 replace layer = 1 if firm_year == `i' & layer == 2 } if r(levels) == "2 3" { replace layer = 0 if firm_year == `i' & layer == 2 replace layer = 1 if firm_year == `i' & layer == 3 } if r(levels) == "0 1 3" { replace layer = 2 if firm_year == `i' & layer == 3 } if r(levels) == "0 2 3" { replace layer = 1 if firm_year == `i' & layer == 2 replace layer = 2 if firm_year == `i' & layer == 3 } if r(levels) == "1 2 3" { replace layer = 0 if firm_year == `i' & layer == 1 replace layer = 1 if firm_year == `i' & layer == 2 replace layer = 2 if firm_year == `i' & layer == 3 } }
Comment