-1

如果有一个包含月份的数据集,并且每个人都有不同的开始工作月份。例如:

person         date       date_started      date_count
  Tim        1/1/2000       3/1/2000           -2
  Tim        2/1/2000       3/1/2000           -1
  Tim        3/1/2000       3/1/2000            0
  John       1/1/2000       7/1/2000           -6
  John       2/1/2000       7/1/2000           -5
  John       3/1/2000       7/1/2000           -4
  John       4/1/2000       7/1/2000           -3
  John       5/1/2000       7/1/2000           -2
  John       6/1/2000       7/1/2000           -1
  John       7/1/2000       7/1/2000            0
  John       8/1/2000       7/1/2000            1
  John       9/1/2000       7/1/2000            2
  John      10/1/2000       7/1/2000            3
  Mary       3/1/2000       3/1/2000            0
  Mary       4/1/2000       3/1/2000            1

获取date_count列的最有效方法是什么?我还有一列在您的第一个月为 1,否则为 0。我宁愿用它来制作date_count

4

2 回答 2

1

我不明白这里有什么困难。这个问题对我来说似乎解释得不好。

  1. 您提到了月份,但您的示例显示了每日日期,因此月份在问题中的作用是一个谜。

  2. 您想要的变量只是两个每日日期之间的差异。只要您有两个每日日期变量(Dimitriy 解释了如何从字符串日期中获取这些变量),它只是一个减法。

(后来添加)我的不确定性表明,当一个人在国际列表上假设当地惯例是普遍的时会发生什么。有两种约定很容易混淆,将日期显示为日/月/年,将日期显示为月/日/年。显然您正在使用第二个约定。如果是这样,问题是使用mofd();从每日日期转换为每月日期 然后正如所说,这是一个减法。

于 2013-01-31T09:06:07.567 回答
1

我不知道这是否是最佳方式,但我认为它应该有效:

/* convert your dates to Stata's date format from strings */
gen date2=daily(date,"MDY");
gen date_started2=daily(date_started,"MDY");
format date2 date_started2 %td;

/* this is the main code */
gen before = date_started2>date2;
bys person before: egen date_count2 = rank(abs(date_started2 - date2));
replace date_count2 = date_count2 - 1 if before==0;
replace date_count2 = -date_count2 if before==1;
drop before;

编辑:

过失。我完全误解了你的问题,意思是你想要一个倒计时来开始每个人观察事件的开始日期。你实际上想要一些更简单的东西:

gen date_count2=mofd(daily(date,"MDY")) - mofd(daily(date_started,"MDY"));

这假设您正在使用作为字符串变量存储的 date 和 date_started。daily() 转换为 Stata 日期格式,mofd() 转换为日历月。那么这只是区别。

于 2013-01-31T04:42:02.757 回答