Count observations within dynamic range

前端 未结 2 1565
刺人心
刺人心 2021-01-15 02:47

Consider the following example:

input group day month year number treatment NUM
1 1 2 2000 1 1 2
1 1 6 2000 2 0 .
1 1 9 2000 3 0 .
1 1 5 2001 4 0 .
1 1 1 201         


        
2条回答
  •  广开言路
    2021-01-15 03:11

    I am assuming that treatment can't occur within 1 year of the previous treatment (in the group). This is true in your example data, but may not be true in general. But, assuming that it is the case, then this should work. I'm using carryforward which is on SSC (ssc install carryforward). Like your latestDate thought, I determine one year after the most recent treatment and count the number of observations in that window.

    sort group date
    gen yrafter = (date + 365) if treatment == 1
    by group: carryforward yrafter, replace
    format yrafter %td
    gen in_window = date <= yrafter & treatment == 0
    egen answer = sum(in_window), by(group yrafter)
    replace answer = . if treatment == 0
    

    I can't promise this will be faster than a loop but I suspect that it will be.

提交回复
热议问题