楼主: vincent829
5541 29

[其他] 怎么标记event month? [推广有奖]

11
sungmoo 发表于 2009-8-9 23:49:58
voodoo 发表于 2009-8-9 19:58 你再试试,肯定可行的。

用merge id using sheet1,sheet2将就每一id生成eventmonth变量(来自sheet1),然后用gen deltat = time - eventmonth即可。前提上必须将time和eventmonth转化为Stata认得的%tm格式。
可否把你的操作步骤详细写出?

仅就楼主数据而言,

use sheet2,clear
merge id using sheet1,sort

将显示出错信息"variable id does not uniquely identify observations in the master data"

12
rayality 发表于 2009-8-10 00:05:39
sungmoo 发表于 2009-8-9 23:39

di %tm monthly("1983-10", "YM")
谢谢。
这中间是什么问题呢,一定要分界符吗?
di %td date("19831010","YMD")不是就可以吗。。,
谢谢!

13
sungmoo 发表于 2009-8-10 00:06:11
voodoo 发表于 2009-8-9 20:18 sungmoo确实“结合你数据的特点”(如你在sheet2中已将早于eventmonth的obs删除了),但这导致其程序不够通用,如不小心可能导致错误结果
*若担心sheet2中存在before event-month的情况,只需

use sheet1,clear
ren eventmonth time
append using sheet2
sort id time year
g t=time if year==.
by id: egen x=min(t)
replace t=(time>x)
by id: g m=sum(t)
drop t x
keep if year<.

*以上也适合sheet2中不存在before event-month的情况

14
sungmoo 发表于 2009-8-10 00:15:58
*若想求出sheet2中各月与event-month相隔的自然月数(负数表示之前,正数表示之后,0表示同月),只需

use sheet1,clear
ren eventmonth time
append using sheet2
sort id time year
g t=time if year==.
by id: egen x=min(t)
g m=(int(time/100)-int(x/100))*12+mod(time,100)-mod(x,100)
drop t x
keep if year<.

*以上兼容(但不限于)上面两组程序。

15
sungmoo 发表于 2009-8-10 00:18:18
上面的程序还可以说成是“特殊的”,比如,sheet2中的year必须没有缺失值……

16
vincent829 发表于 2009-8-10 10:54:24
发现新问题,当sheet 2对应id的开始时间,也就是每个id 的第一个观测值, 比sheet 1相同id对应的时间还要早的话,程序也保留在开始时间之前的月份,这样会使id m==1的情况发生2次或是更多

17
sungmoo 发表于 2009-8-10 11:04:39
vincent829 发表于 2009-8-10 10:54 当sheet 2对应id的开始时间,也就是每个id 的第一个观测值,比sheet 1相同id对应的时间还要早的话,程序也保留在开始时间之前的月份,这样会使id m==1的情况发生2次或是更多
“之前月份”对应的标识变量,如何取值?

18
vincent829 发表于 2009-8-10 11:10:07
按照程序运行,得出来的都是1

19
sungmoo 发表于 2009-8-10 11:12:41
vincent829 发表于 2009-8-10 11:10 按照程序运行,得出来的都是1
参见后面帖的两组程序。

另外,你最终要的是什么结果?

是相隔自然月数(可为负数)吗?

20
vincent829 发表于 2009-8-10 11:32:22
不是相隔,是想标记event month,从1开始,1之前的都想删除

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-8 20:29