在一个区间内定义组

时间:2015-05-14 18:38:35

标签: stata

在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,为焦点IDs的三天(之前或之后)发生的所有ID提供一个唯一变量。

我首先想要识别给定ID的三天窗口内的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

1 个答案:

答案 0 :(得分: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 ...