为有重复的日期创建一个序列

Create a sequence for dates with repeats

我有一个天数列表(编号为 195-720),每天都有多个观测值。我最终想确定这些日子中哪些是工作日,哪些是周末。如果我可以将数字 1-7 分配给每一天,我就能做到这一点。目前,数据如下所示:

     Day    Household ID    Hour of Day
     195     1                  1
     195     1                  2
     195     1                  3
     195     1                  4
     196     1                  1
     196     1                  2
     196     1                  3
     197     1                  1
     197     1                  2

可能需要注意的是,每天的观察次数并不一致(例如,第 195 天有 4 次观察,第 196 天有 3 次观察,第 197 天有 2 次观察)。

我知道第 195 天是星期二,为简单起见,我想将其编码为等于“2”(星期三 = 3,星期四 = 4,等等)。

因此,我想得到以下输出:

     Day    Household ID    Hour of Day         DAY OF WEEK
     195     1                  1                  2 
     195     1                  2                  2
     195     1                  3                  2
     195     1                  4                  2
     196     1                  1                  3
     196     1                  2                  3
     196     1                  3                  3
     197     1                  1                  4
     197     1                  2                  4

在查看 Stata 文档后,我考虑使用 DYM/DMY。但是,这不起作用,因为我没有可以使用的原始 "date" 变量。相反,我只有一个数字“195”对应于 7 月 12 日星期二。

我想使用类似的东西:

     bysort day: egen Hour_of_Day = seq(2, 3, 4, 5, 6, 7, 1)

但是,Stata 告诉我这有语法错误。注意:我以“2”开头,因为我的第一天 (195) 是星期二。我还考虑了像 carryforwardmod(x,y)fill 这样的命令。

有谁知道如何设置每天填充相同的序列?我怎样才能修复此代码以获得所需的输出?

如果您知道 195 是星期二,那么逆向工程就很简单了。 193 一定是星期天,199 一定是星期六。

让我们看一下那个星期的沙箱,从 193 到 199。我们对我们自己的星期几函数的第一个猜测将使用 mod() 函数(不是 命令)。 This paper 是其在 Stata 中的应用程序的简短重复。

. clear

. set obs 7
number of observations (_N) was 0, now 7

. gen day = 192 + _n

. gen dow = mod(day, 7)

. list, sep(0)

     +-----------+
     | day   dow |
     |-----------|
  1. | 193     4 |
  2. | 194     5 |
  3. | 195     6 |
  4. | 196     0 |
  5. | 197     1 |
  6. | 198     2 |
  7. | 199     3 |
     +-----------+

Stata 的星期几约定是 0 是星期日,6 是星期六。那只是一个旋转距离。

. gen DOW = mod(day + 3, 7)

. list, sep(0) 

     +-----------------+
     | day   dow   DOW |
     |-----------------|
  1. | 193     4     0 |
  2. | 194     5     1 |
  3. | 195     6     2 |
  4. | 196     0     3 |
  5. | 197     1     4 |
  6. | 198     2     5 |
  7. | 199     3     6 |
     +-----------------+

您可以使用 Stata 自己的 dow() 函数检查另一种获取上述 DOW 的方法是

gen StataDOW = dow(day - 2)

所以工作日的指标是(例如)

gen weekday = !inlist(DOW, 0, 6) 

gen weekday = inrange(DOW, 1, 5) 

gen weekday = !inlist(dow, 4, 3) 

使用创建的第一个变量。

正好我原来写的是egen, seq()。您的语法确实不合法,因为 seq() 是语法,但括号内没有任何内容。我不会在这里使用 egen ,只是因为正确的答案基本上不可能多次出现(正如你所做的那样),而且如果你在数据中有差距也不太可能。这里的推理是,或者应该是,对重复和差距是稳健的。