[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]
st: RE: Still having trouble coding loops
What look like loops in (al)most any other language
are not necessarily loops in any language that
As I understand it, for each household,
1. You want non-initial sequences of zero to be
replaced by the previous non-zero observed.
2. You want initial sequences of zeros to be replaced
by the first non-zero observed.
When you say "proceeding" I take it that you mean "preceding".
The second is indeed trickier than the first, but
there is a kind of mirror symmetry here which should
suggest that essentially the same approach would
These are variations on a more common problem
in which we have not zero, but missing, as the
problematic value to be fudged. There is a long-winded
FAQ . . . . . . . . . . . . . . . . . . . . . . . Replacing missing values
2/03 How can I replace missing values with previous or
following nonmissing values?
I am going to assumed that -rd- is a sequence
variable. So, for #1, we can go
bysort hhold (rd) : replace acre = acre[_n-1] if acre == 0 & _n > 1
That's not quite what you had. Note with this that I took
care with the initial condition. When under -by:- we look
at acre, the first value in each block, the previous
value, acre, will always be missing, which counts as positive.
We don't want that missing to over-write any initial 0, so
no replacements are allowed for _n of 1.
On the other hand, with this, initial sequences of 0 will otherwise
be unchanged, which we don't mind, so the condition which you had
... if acre[_n-1] > 0
is not needed for those other observations.
For #2, the "reverse time" trick explained in the
FAQ referred to above seems the simplest. Put each household sequence
back to front
gsort hhold - rd
Now it's the same idea, almost:
by hhold : replace acre = acre[_n-1] if acre == 0
If I got the logic right, there will be no initial zeros
to replace, as these would have been final zeros previously
and replaced by the previous cascade of changes,
but if you like to put it there the extra condition
... if _n > 1
should do no harm:
by hhold : replace acre = acre[_n-1] if acre == 0 & _n > 1
Then we sort back:
sort hhold rd
In related territory are other FAQs such as
FAQ . . . . . . . . . . . . . . . First and last occurrences in panel data
12/05 How can I identify first and last occurrences
systematically in panel data?
FAQ . . . . . . . . . . . . . . . . . . Dropping spells of missing values
9/03 How can I drop spells of missing values at the
beginning and end of panel data?
which may be useful for spelling out basic techniques for future problems.
> I'm still having some trouble coding loops.
> I have a dataset that looks like:
> hhold rd acre rent
> 1 1 0 0
> 1 2 0 0
> 1 3 1 1
> 1 4 0 0
> 1 5 2 2
> 1 6 0 0
> What I want to do is recode the 0's to be equal to the value
> proceeding it, if that observation is equal zero and the
> proceeding observation is greater than zero. I also want to
> code all zeros that have no proceeding positive valued
> observations to be equal to the value of the first
> observation after in the sequence that is greater than zero.
> This is probably a little confusing so here is an example.
> In rd 1 and rd 2, I would like acre to equal 1 and rent 1
> In rd 4, I would like acre to equal 1 and rent to equal 1.
> In rd 6, I would like acre to equal 2 and rent to equal 2.
> I know how to code the first part of the problem.
> Using: bysort hhold (rd): replace acre = acre[_n-1] if acre
> == 0 & acre[_n-1] > 0
> I don't know how to code the second part. I'm assuming that
> I'll probably have to use a -foreach- loop, but I don't know
> how to program it. Any help would be very appreciated
* For searches and help try: