Dear Statapeeps,
I need to replace some values of a variable that meet certain
conditions. Although I know it's not possible to make direct references
to rows using the -replace- command, this is what I want to do:
replace status = status[`j'] if status[`j'] == "NM" | status[`j'] == "W"
in `i'
I tried to use a local variable to avoid using status[`j'] in the
command line but it didn't work. Like this:
local sta = status[`j']
replace status = "`sta'" if
status[`j']=="NM"|status[`j']=="W" in `i'
You will find my whole script below.
Do you know how I can get past this problem?
Here I present a chunk of my dataset so that you understand the problem
better. You don't need to read the rest if you already understood what I
want to do from the command line above.
The data is organized in a panel format by country-date. What I need is
to fill in the values of 'status' whenever they are missing and they
meet certain conditions.
Suppose I start a loop that sweeps through 'status' row by row. Most
observations in 'status' are missing and suddenly, in observation [i] I
find one cell that is not missing.
(a) If status[i] = "M"/"W"/"NM", the subsequent rows (observations [j],
where j gets different values) should be "M"/"W"/"NM" whenever
country[i]=country[j] and date1[i]=date1[j].
(b) If, however, status[i] = "PC" then I need to look at the next
non-empty cell to decide what "PC" is going to be in [i]. PC is going to
be converted into "M" except if a subsequent value is "W" or "NM". A
value in row [j] is considered subsequent if [j] > [i] and
country[i]=country[j] and date1[i]=date1[j].
The data looks like this:
country date date1 date2 status
401. | Armenia 1997m5 1995m6 1999m12 |
402. | Armenia 1997m6 1996m2 1999m12 PC |
403. | Armenia 1997m7 1996m2 1999m12 |
404. | Armenia 1997m8 1996m2 1999m12 |
405. | Armenia 1997m9 1996m2 1999m12 |
|------------------------------------------------------|
406. | Armenia 1997m10 1996m2 1999m12 |
407. | Armenia 1997m11 1996m2 1999m12 |
408. | Armenia 1997m12 1996m2 1999m12 |
409. | Armenia 1998m1 1996m2 1999m12 |
410. | Armenia 1998m2 1996m2 1999m12 W |
|------------------------------------------------------|
411. | Armenia 1998m3 1996m2 1999m12 |
412. | Armenia 1998m4 1996m2 1999m12 |
413. | Armenia 1998m5 1996m2 1999m12 |
414. | Armenia 1998m6 1996m2 1999m12 |
415. | Armenia 1998m7 1996m2 1999m12 |
|------------------------------------------------------|
416. | Armenia 1998m8 1996m2 1999m12 |
417. | Armenia 1998m9 1996m2 1999m12 |
418. | Armenia 1998m10 1996m2 1999m12 |
419. | Armenia 1998m11 1996m2 1999m12 |
420. | Armenia 1998m12 1996m2 1999m12 PC |
|------------------------------------------------------|
421. | Armenia 1999m1 1996m2 1999m12 |
422. | Armenia 1999m2 1996m2 1999m12 |
423. | Armenia 1999m3 1996m2 1999m12 |
424. | Armenia 1999m4 1996m2 1999m12 |
425. | Armenia 1999m5 1996m2 1999m12 |
|------------------------------------------------------|
426. | Armenia 1999m6 1996m2 1999m12 |
427. | Armenia 1999m7 1996m2 1999m12 |
428. | Armenia 1999m8 1996m2 1999m12 |
429. | Armenia 1999m9 1996m2 1999m12 |
430. | Armenia 1999m10 1996m2 1999m12 M |
|------------------------------------------------------|
431. | Armenia 1999m11 1996m2 1999m12 |
432. | Armenia 1999m12 1996m2 1999m12 |
433. | Armenia 2000m1 . . |
434. | Armenia 2000m2 . . |
And after running my script it should look like this:
country date date1 date2 status
401. | Armenia 1997m5 1995m6 1999m12 |
402. | Armenia 1997m6 1996m2 1999m12 W |
403. | Armenia 1997m7 1996m2 1999m12 W |
404. | Armenia 1997m8 1996m2 1999m12 W |
405. | Armenia 1997m9 1996m2 1999m12 W |
|------------------------------------------------------|
406. | Armenia 1997m10 1996m2 1999m12 W |
407. | Armenia 1997m11 1996m2 1999m12 W |
408. | Armenia 1997m12 1996m2 1999m12 W |
409. | Armenia 1998m1 1996m2 1999m12 W |
410. | Armenia 1998m2 1996m2 1999m12 W |
|------------------------------------------------------|
411. | Armenia 1998m3 1996m2 1999m12 W |
412. | Armenia 1998m4 1996m2 1999m12 W |
413. | Armenia 1998m5 1996m2 1999m12 W |
414. | Armenia 1998m6 1996m2 1999m12 W |
415. | Armenia 1998m7 1996m2 1999m12 W |
|------------------------------------------------------|
416. | Armenia 1998m8 1996m2 1999m12 W |
417. | Armenia 1998m9 1996m2 1999m12 W |
418. | Armenia 1998m10 1996m2 1999m12 W |
419. | Armenia 1998m11 1996m2 1999m12 W |
420. | Armenia 1998m12 1996m2 1999m12 M |
|------------------------------------------------------|
421. | Armenia 1999m1 1996m2 1999m12 M |
422. | Armenia 1999m2 1996m2 1999m12 M |
423. | Armenia 1999m3 1996m2 1999m12 M |
424. | Armenia 1999m4 1996m2 1999m12 M |
425. | Armenia 1999m5 1996m2 1999m12 M |
|------------------------------------------------------|
426. | Armenia 1999m6 1996m2 1999m12 M |
427. | Armenia 1999m7 1996m2 1999m12 M |
428. | Armenia 1999m8 1996m2 1999m12 M |
429. | Armenia 1999m9 1996m2 1999m12 M |
430. | Armenia 1999m10 1996m2 1999m12 M |
|------------------------------------------------------|
431. | Armenia 1999m11 1996m2 1999m12 M |
432. | Armenia 1999m12 1996m2 1999m12 M |
433. | Armenia 2000m1 . . |
434. | Armenia 2000m2 . . |
This is my script and I don't know what the problem is:
local m = _N
forv i = 1/`m' {
if status[`i'] != "" {
if status[`i'] == "PC" {
local j = `i'+1
while status[`j'] == "" &
country[`j']==country[`i'] & date1[`i']==date1[`j'] {
local sta = status[`j']
replace status = "`sta'" if
status[`j']=="NM"|status[`j']=="W" in `i'
replace status = "M" if
status[`j']=="M"|(date1[`j']!=date1[`i'] & country[`j']!=country[`i'] in
`i'
}
}
else {
local j = `i'+1
local k = 0
while status[`j'] == "" &
country[`i']==country[`j'] & date1[`i']==date1[`j'] {
local sta = status[`i']
replace status = "`sta'" in `j'
local j = `j'+1
local k = `k'+1
}
}
local i = `i'+`k'
}
}
Thanks a lot,
Adrian
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/
--------------------------------------------------------