Unless you are working under the aegis of -by:- _N will always be
interpreted as the total number of observations. This code doesn't
satisfy that.
I echo Martin Weiss in suspecting that your -if `touse'- is a bug. You
are almost certainly confusing the two flavours of -if-.
Otherwise, your code still looks very confused and based on a variety of
misunderstandings. Apart from `touse', which is defined by -marksample-,
all of the local macros you refer to will be treated as empty strings,
as none has been defined earlier in the program. I am surprised to hear
that it is running at all.
It does not look as if you need a program anyway. My impression is that
all you need is to use -by:- but I don't understand your problem well
enough to suggest better code. Someone else may be able to give better
help. If not, rather than a lengthy word description, you should perhaps
give an example of your data with the intended result.
Nick
[email protected]
Ilona Carneiro
I am trying to write a programme that will run a command sequentially
for observations of an individual. For each individual I have multiple
spells and multiple failures. However, the twist is that I also need
to exclude a period of time at risk after each treatment (prophylaxis)
and after each failure (to prevent double-counting of failures that
may actually be the same episode). I managed to do this without any
problem for the treatment, but if an episode is disqualified (by a
prior treatment or episode) I don't want it to disqualify a subsequent
episode. Therefore I need to run the code sequentially for each spell
of an individual, but using the marksample touse code to run it "by"
individual doesn't seem to be working - the "forvalues" seems to
always interpret _N as the last observation in the whole dataset, not
the last observation for each individual.
I have the following code:
program define byid, byable(recall, noheader)
marksample touse
sort `id' `start'
if `touse' {
forvalues i = 1(1)`=_N' {
replace lagend = (`end' + `lag') if ((`tx' > 0 & `tx' <
.) | (`case'
> 0 & `case' < .))
drop if lagend[`i'-1]>`end' & `id'[`i'-1]==`id'
}
}
end
gen lagend=.
qui by id: byid
but I get the error:
2nd by group not found
r(111);
And the programme isn't doing what I need it to.
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/