在一个区间内定义组

Defining groups within an interval

在 Stata 中有以下数据

 ID      Date
 1      1/1/2010
 2      1/1/2010
 3      1/4/2010
 4      1/5/2010
 5      1/8/2010
 6      1/10/2010
 7      1/11/2010

我正在尝试创建一个变量 Dummyi,它为焦点 ID 三天内(之前或之后)发生的所有 IDs 提供唯一变量。

我首先想识别给定 ID 三天内 window 内的 ID,然后为所有这些 ID 分配一个唯一编号。

 qui forvalues i = 1/`=_N' {
     gen Dummy`i'
     replace Dummy`i' = `i' if Date <= (Date[`i']-3) & ID == `i' 
 }

这种方法是可行的,但缺少 ID 值,它们不是整齐有序的,并且没有考虑之前发生的 IDs。最后,多个 IDs 分为两组(例如 ID==5),我不确定如何在不创建单独的 Dummy 变量的情况下进行分离,这很好。

结果数据应如下所示。

 ID      Date      Dummy1   Dummy2  Dummy3  Dummy4   Dummy5  Dummy6  Dummy7
 1      1/1/2010     1        1       1        0       0       0       0
 2      1/1/2010     1        1       1        0       0       0       0
 3      1/4/2010     1        1       1        1       0       0       0
 4      1/5/2010     0        0       1        1       1       0       0
 5      1/8/2010     0        0       0        1       1       1       1
 6      1/10/2010    0        0       0        0       1       1       1
 7      1/11/2010    0        0       0        0       1       1       1
clear
set more off

*----- example data -----

input ///
 id str10 date
 1      "1/1/2010" 
 2      "1/1/2010"       
 3      "1/4/2010" 
 4      "1/5/2010"
 5      "1/8/2010"
 6      "1/10/2010"
 7      "1/11/2010"
end

gen date2 = date(date, "MDY")
format %td date2
drop date

list

*----- what you want -----

isid id
levelsof id, local(levid)

forvalues i = 1/`=_N' {
    local lid : word `i' of `levid'
    gen ind`lid' = inrange(date2[`i'], date2 - 3, date2 + 3)
}

list, sep(0)

levelsof 我使用的情况是 id 是一些不规则的序列。指标变量(你叫它dummy)根据对应的id.

命名

如果您没有使用 扩展宏函数的经验,请参阅 help extended_fcn (local lid : word ...)。