又是一年离职时

    又要离职了,关于公司的是是非非说的太多,已经没有意义了。

    离开意味着新的开始,但是过去不会消失,它仍时时刻刻的提醒我,提醒我过去哪里做的不好,其实过去曾做过很多今天看来幼稚之极的事情。

    诚然,年轻不是坏事,我们可以大胆做自己想做的事儿,无知所以无畏估计就是这个意思吧。但是这种无知如果一旦遮盖住你的半边眼睛,让你来不及看清这个世界,看不清方向,想不明白自己的位置,那将是多么可悲的事情,这次离开后希望自己变得成熟稳重些,真正明白接下来的路,自己需要的是什么,下个公司不管哪里有问题,首先应该自己想想“我自己没问题吗?我的工作完成的足够出色吗?未来我没有一点可以进步的地方了吗?”
    回顾过去,以下三点我做的不好,以后应该坚持做好,列出来以示警告:
          1. 增加产出文档
          2. 善于及时总结
          3. 养成月度阶段工作回顾
<think>我们之前识别跳槽的条件是离职后至少1年间隔(gap_days>365),但实际中可能存在离职当年就找到新工作的情况(即gap_days<=365)。而题目要求是:离职当年(1999年)和新工作第一年(2001年)等。因此,如果离职当年就找到新工作,那么按照题目要求,我们需要保留离职当年(也就是新工作第一年)?但注意题目中例子是:A于1999年卸任,2001年获得新工作。这里存在间隔年(2000年)。重新理解题目要求:假设A于1999年卸任,2001年获得新工作。那么我们需要的间点是:卸任前两年:1997、1998卸任当年:1999新工作第一年:2001,第二年2002,第三年2003(如果数据存在则保留,否则跳过)所以,这里的关键是,我们关注的是两次事件:卸任和新工作上任。而且中间至少间隔一年(在例子中,1999年卸任,2001年才上任,中间隔了2000年)。但是,题目要求中并没有包含“离职后到新工作上任前”的年份(即2000年)。所以,如果有人在同一年内卸任并上任新工作,那么实际上:卸任当年=新工作第一年那么,对于这种情况,我们的事件窗口就会重叠。题目要求是保留:卸任前两年(1997,1998)、卸任当年(1999)、新工作第一年(2001)等。如果某人1999年卸任,1999年又上任新工作(即同一年),那么:卸任当年(1999年)和新工作第一年(1999年)是同一个年份。所以,在构建事件窗口,我们需要考虑这个重叠情况,避免重复标记同一年的数据(因为同一年的数据只需要保留一次)。因此,我们需要修改跳槽识别条件:不仅包括间隔超过一年的,也包括间隔一年以内的(甚至0间隔)的跳槽。但注意,题目要求的间窗口是围绕两个事件点的,如果两个事件发生在同一年,那么该年份既属于“卸任当年”又属于“新工作第一年”,我们只需要保留一次。所以,我们修改跳槽定义:只要在离职后有新工作的记录,都视为一次跳槽(无论间隔多久)。但要注意排除仍在同一公司内的情况(如果同一公司内再次担任CEO,可能不是跳槽)。这里我们假设execid是高管唯一标识,且在不同公司任职才会出现新的记录。步骤调整:1.识别跳槽事件:同一execid,后一份工作的becameceo_date在leftofc_date之后(无论间隔多少天)都算跳槽?但注意,有可能出现先上任新工作再离职旧工作的情况(但通常先离职再上任)。为了安全,我们定义:新工作的becameceo_date必须大于等于旧工作的leftofc_date(或者允许一个小的重叠?)。但题目没有具体说明,我们按照一般情况(离职后再入职新工作)。2.但是,题目例子要求的间窗口明确分开了两个事件点(一个在1999年,另一个在2001年),所以对于同一年发生两个事件的情况,我们需要合并事件窗口。具体修改:-修改跳槽条件:不再要求gap_days>365,只要离职后有新工作就算跳槽(但注意,我们只考虑离职后的第一份新工作)。-构建事件窗口,对于同一个年份同属于两个事件的情况,只保留一次。代码调整:原跳槽识别代码:genis_jump=(gap_days>365&!missing(gap_days))改为:genis_jump=(next_becameceo>=leftofc_date&!missing(next_becameceo))//注意:这里要求下一份工作的开始日期在离职日期之后(或当天),且下一份工作存在。但是,注意:我们原来的gap_days计算是next_becameceo-leftofc_date,所以当gap_days>=0,就是下一份工作开始日期在离职日期之后或同一天。因此,我们修改为:genis_jump=(gap_days>=0&!missing(gap_days))这样,只要离职后(包括当天)有下一份工作,都算跳槽。然后,在构建事件窗口,我们需要考虑年份重叠的情况。例如,如果离职年份和新工作上任年份相同,那么我们要将window=3(卸任当年)和window=4(新工作第一年)合并到同一年份。我们可以在构建窗口,先分别标记再合并,或者用一个值同表示这两个事件。我们可以在构建窗口变量,如果某个年份既是卸任当年又是新工作第一年,我们可以将其标记为两个事件的结合(比如用3.5?或者用一个新类别7)。但为了简单,我们仍然使用6个窗口标记,但是让同一个观测值可以同属于两个窗口?这不可行,因为每个观测值对应唯一的年份。所以,我们只能给每个观测值分配一个窗口值,当同一年份发生两个事件,我们优先标记为卸任当年?还是新工作第一年?根据题目的要求,我们既需要卸任当年也需要新工作第一年,但同一年,这个年份同满足两个条件。题目要求的间窗口包括6个点(卸任前两年、卸任前一年、卸任当年、新工作第一年、第二年、第三年),但是当卸任当年和新工作第一年重合,我们实际上只有5个间点(因为卸任当年和新工作第一年一年,我们保留一次即可),但我们需要这个年份同出现在两个角色中?不,题目要求的间窗口是事件发生的间点,而不是角色的重叠。所以,我们仍然保留该年份,并且它同满足两个条件。但在分析,我们可以将其视为两个事件的发生年。因此,在构建window变量,我们允许每个观测值最多被标记两次?不,一个观测值只能有一个window值。所以我们改变思路,构建两个事件变量:一个是以卸任事件为中心的事件窗口(-2,-1,0),另一个是以新工作上任为中心的事件窗口(0,1,2)。那么同一年份既属于卸任事件窗口的0期,又属于新工作上任事件窗口的0期。但题目的要求并不是这样,它明确要求了6个间点,如果重叠,我们只保留一次。所以,我们可以这样构建窗口变量:我们定义6个窗口,但允许其中某些窗口对应同一年份(比如window3和window4对应同一年份),但我们在保留观测值,一个年份只能出现在一个窗口中(因为每个年份只有一个观测值)。所以,我们只能将重叠的年份归入一个窗口。那么归入哪一个?根据题目描述,这个年份既是卸任当年又是新工作第一年,所以它同是窗口3和窗口4。但题目要求中这两个窗口是分开的,但现实中重叠了,我们只能算一次。因此,我们构建一个窗口变量,包含6个值,但对于重叠的年份,我们将其合并。具体做法:在创建window,如果年份同是卸任当年和新工作第一年,我们将其标记为两个事件(比如用34表示),然后单独处理。但这样会破坏窗口的连续性。或者,我们可以构建两个独立的变量:quit_window和newjob_window,分别记录该观测值在离职事件窗口中的位置和新工作事件窗口中的位置。但考虑到后续分析可能会同考虑两个事件的影响,以及可能出现的重叠,我们采用两个独立的事件窗口变量可能更灵活。然而,题目要求是筛选样本,即保留这些年份的观测值。所以,我们不必纠结于一个综合的window变量,只需要能筛选出这6个间点即可,即使有重叠,重叠的年份我们也保留一次(因为一个年份只有一个观测值)。所以,我们不需要合并,我们只需要分别标记这6个间点,然后保留这些间点对应的观测值,重复的年份会自动合并(因为一个公司一年只有一个CEO记录)。修改后的步骤:1.跳槽定义:只要离职后(包括当天)有新工作,就算跳槽(is_jump=1)。2.对于每个跳槽事件,我们定义6个间点(年份):year1=leftofc_year-2//卸任前2年year2=leftofc_year-1//卸任前1年year3=leftofc_year//卸任当年year4=becameceo_year//新工作第一年year5=becameceo_year+1//新工作第二年year6=becameceo_year+2//新工作第三年然后,我们保留所有满足年份是这6个值之一的观测值(即高管在这些年份的记录)。注意,同一个年份可能同是year3和year4(如果leftofc_year等于becameceo_year),那么我们在保留,这个年份的记录会保留一次,但该记录同满足两个条件。所以,我们只需要生成一个指示变量,表示该年份是否属于上述6个年份之一。代码调整:```stata*---步骤1:转换日期格式(同之前)---**---步骤2:标记跳槽事件(调整)---*sortexecidbecameceo_datebyexecid:genjob_seq=_nbyexecid:gennext_becameceo=becameceo_date[_n+1]byexecid:gengap_days=next_becameceo-leftofc_dateifjob_seq< _Ngenis_jump=(gap_days>=0&!missing(gap_days))//修改:只要离职后有新工作(包括0间隔)*---步骤3:生成目标年份列表---*//对于每个跳槽事件,提取关键年份byexecid:genquit_year=year(leftofc_date)ifis_jumpbyexecid:gennewjob_year=year(next_becameceo)ifis_jump//新工作开始年份//生成6个目标年份gentarget_year1=quit_year-2gentarget_year2=quit_year-1gentarget_year3=quit_yeargentarget_year4=newjob_yeargentarget_year5=newjob_year+1gentarget_year6=newjob_year+2//标记当前观测的年份是否在6个目标年份中genis_target=0replaceis_target=1ifyear==target_year1|year==target_year2|year==target_year3|year==target_year4|year==target_year5|year==target_year6//保留跳槽事件中目标年份的观测keepifis_target==1&is_jump==1```但是,注意:每个跳槽事件对应两个记录(旧工作和新工作),但我们的目标年份是高管在这两个工作期间特定年份的记录。而原数据中,高管的记录是按年份和公司分开的。所以,我们标记的是高管在跳槽事件相关年份的所有记录(无论这些记录是在旧公司还是新公司,只要年份匹配)。另外,由于每个跳槽事件生成6个目标年份,而同一个高管可能有多个跳槽事件(多次跳槽),我们使用如下方法:上面的代码是按每个观测值计算目标年份,但每个跳槽事件(即每个离职事件对应的跳槽)的目标年份是独立的。但由于一次跳槽事件涉及高管的两条任职记录(旧工作记录和新工作记录),我们在为这个跳槽事件生成目标年份,需要关联到高管的所有记录(包括中间年份的记录,如卸任后到新工作前的年份?但题目要求中间年份不保留,所以不影响)。然而,上面的代码在byexecid下为每个观测值生成了quit_year和newjob_year,但注意,一次跳槽事件对应的离职年份(quit_year)和新工作年份(newjob_year)在同一跳槽事件中是固定的,但同一个高管如果有多次跳槽事件,那么每个事件对应不同的quit_year和newjob_year。因此,我们需要为每次跳槽事件生成目标年份,并将这些目标年份与高管的整个职业生涯中的年份记录进行匹配。我们上面用每个观测值生成的target_year1到target_year6,其实是每个观测值(每次任职)对应的目标年份(如果该次任职属于跳槽事件中的旧工作,那么生成的target_year1~6就是针对这次跳槽的)。但是,同一个高管可能多次跳槽,那么在不同任职记录上生成的target_year可能会冲突?我们不需要担心,因为我们会保留所有满足条件的年份,不管这个年份属于哪次跳槽事件。但是,我们如何确保每个跳槽事件的目标年份都被包含?我们可以为每个跳槽事件创建一个唯一的标识符(比如jump_id),然后展开这个跳槽事件的6个目标年份,再与原数据集匹配。方法二(更清晰)——使用唯一跳槽事件ID,然后展开目标年份:```stata*---步骤1:转换日期格式(同之前)---**---步骤2:标记跳槽事件(调整)---*sortexecidbecameceo_datebyexecid:genjob_seq=_nbyexecid:gennext_becameceo=becameceo_date[_n+1]byexecid:gengap_days=next_becameceo-leftofc_dateifjob_seq< _Ngenis_jump=(gap_days>=0&!missing(gap_days))//修改:只要离职后有新工作(包括0间隔)//创建唯一跳槽事件ID(每次跳槽)sortexecidleftofc_datebyexecid:genjump_id=_nifis_jump//为每个跳槽事件编号(每个高管可能有多个跳槽事件)//保存跳槽事件列表preservekeepifis_jumpkeepexecidjump_idleftofc_datenext_becameceogenquit_year=year(leftofc_date)gennewjob_year=year(next_becameceo)//生成6个目标年份gentarget_year1=quit_year-2gentarget_year2=quit_year-1gentarget_year3=quit_yeargentarget_year4=newjob_yeargentarget_year5=newjob_year+1gentarget_year6=newjob_year+2//将每个跳槽事件的6个年份转成6行reshapelongtarget_year,i(execidjump_id)j(window_no)//现在每个跳槽事件有6行,每行对应一个目标年份renametarget_yearyearkeepexecidjump_idyearwindow_noduplicatesdrop//去除可能重复的年份(如果target_year有重复,比如同一年份出现在两个窗口中)tempfiletarget_yearssave`target_years'restore//将目标年份与原数据合并mergem:1execidyearusing`target_years',keep(13)nogen//保留原数据所有观测,但标记匹配到的目标年份//这样,匹配到的观测就是我们需要的(如果一个观测匹配到多个跳槽事件,可能有多个jump_id,但我们只需要保留一次?)//因为我们只需要知道匹配上,所以可以:genis_target=(_merge==3)drop_mergekeepifis_target```这种方法的好处是,对于每个跳槽事件,我们生成了6个目标年份,然后与原数据按高管ID和年份匹配,这样确保每次跳槽事件的目标年份都被覆盖,且不会重复(因为原数据中每个高管每年只有一个记录)。但注意,如果一个高管有两次跳槽事件,且两次事件的目标年份有重叠(比如两次事件中都有同一个年份),则这个年份会被匹配两次(两个jump_id)?但原数据中该高管该年份只有一个记录,所以合并后会出现多条相同的记录(但jump_id不同)。这是我们需要避免的,因为我们不能重复记录该年份的观测。所以,我们应该按高管和年份去重。但如果我们只关心这些年份的记录,而不关心这些记录属于哪次跳槽事件,那么我们可以:```statakeepifis_targetduplicatesdropexecidyear,force```但这样会丢失可能属于两次跳槽事件的年份?一个年份只保留一次。但一个年份不可能同属于两次跳槽事件(因为一次跳槽事件涉及两个间点,而每个间点周围几年的窗口),但有可能两次跳槽事件的目标年份有重叠。例如,第一次跳槽的新工作第三年可能是第二次跳槽的卸任前两年。这样,同一个年份出现在两个事件窗口中,我们是否应该保留两次?不,因为该年份只有一条记录。所以在分析中,该年份的数据同受两次事件的影响?这需要研究人员注意。因此,按照题目的要求,我们只需要保留这些年份的观测值即可,至于这些年份与多个事件关联,我们暂不处理,保留唯一记录。但要注意,这样可能会导致一些偏差,在分析需要考虑。鉴于题目的要求是“保留特定间点”,我们选择第二种方法(使用跳槽事件生成目标年份并合并),然后按高管和年份去重。最后,我们只需要保留匹配到的观测值,并按高管和年份排序。完整代码(第二种方法):```stata*---步骤1:转换日期格式---*//同前(确保becameceo和leftofc已转为日期变量并提取年份)genbecameceo_date=date(becameceo,"DMY")formatbecameceo_date%tdgenbecameceo_year=year(becameceo_date)genleftofc_date=date(leftofc,"DMY")formatleftofc_date%tdgenleftofc_year=year(leftofc_date)*---步骤2:标记跳槽事件---*//按高管和上任间排序sortexecidbecameceo_datebyexecid:genjob_seq=_n//当前是第几份工作//生成下一份工作的上任间byexecid:gennext_becameceo_date=becameceo_date[_n+1]byexecid:gennext_becameceo_year=becameceo_year[_n+1]//年份版//计算两份工作间隔天数(离职日期到下一份工作上任日期)gengap_days=next_becameceo_date-leftofc_dateifjob_seq< _N//跳槽定义:下一份工作存在且间隔天数>=0(即下一份工作上任日期在本次离职日期之后或当天)genis_jump=(gap_days>=0&!missing(gap_days))ifjob_seq< _N//注意:最后一份工作不会有下一份工作,所以is_jump缺失,我们用0填充replaceis_jump=0ifmissing(is_jump)//为每个跳槽事件创建唯一ID(按离职日期排序)sortexecidleftofc_datebyexecid:genjump_id=_nifis_jump==1*---步骤3:生成每个跳槽事件的目标年份---*preservekeepifis_jump==1keepexecidjump_idleftofc_datenext_becameceo_dateleftofc_yearnext_becameceo_year//生成6个目标年份genyear1=leftofc_year-2genyear2=leftofc_year-1genyear3=leftofc_yeargenyear4=next_becameceo_yeargenyear5=next_becameceo_year+1genyear6=next_becameceo_year+2//将6列转成6行(长数据)reshapelongyear,i(execidjump_id)j(period)stringdropperiod//此每个跳槽事件有6行,每行对应一个目标年份duplicatesdrop//如果某个年份重复(例如离职当年和新工作第一年相同,则year3和year4相同,会保留一条)tempfiletarget_yearssave`target_years'restore*---步骤4:与原数据合并---*//原数据中,每个高管每年有一条记录(假设)mergem:1execidyearusing`target_years',keep(3)nogen//只保留匹配到的观测值(即目标年份)//按高管和年份去重(因为一个年份可能匹配到多个跳槽事件,但我们只需要保留一个观测值)duplicatesdropexecidyear,force*---步骤5:排序和保存---*sortexecidyear```这样,我们就筛选出了所有与跳槽事件相关年份的观测值。注意:我们保留了高管在旧公司和在新公司的记录(如果目标年份是跳槽前两年,那么记录在旧公司;如果是新工作年份,则在新公司)。####**解释**1.**日期处理**:确保日期转为Stata日期格式并提取年份2.**跳槽事件**:当高管在离职后(或当天)有新工作,视为跳槽(新工作上任日期>=离职日期)3.**目标年份**:为每个跳槽事件生成6个目标年份(卸任前2年到新工作后2年)4.**数据合并**:将目标年份与原数据合并,得到目标年份对应的观测值5.**去重**:同一高管同年份可能因多次跳槽事件匹配多次,保留唯一记录####**是否需要事件窗口/代理变量?**-**事件窗口已构建**:通过合并目标年份实现-**代理变量不需要**:间点直接来源于原始数据####**建议**-检查去重后的样本数量,验证覆盖所有事件窗口-分析注意同一高管多次跳槽事件的影响§§相关问题§§:1.当多次跳槽事件的目标年份重叠,Stata去重会丢失事件信息,应如何保留所有跳槽事件标记?2.如何分析CEO跳槽前后薪酬变化(如比较卸任前两年与新工作后两年的薪酬)?3.如何排除在同一年离职又复职(同一公司)的情况?4.若高管在离职后创立自己的公司(数据中可能没有记录为新工作),如何避免这类情况被误判为无跳槽?</think> ### 解决方案:优化跳槽筛选逻辑(处理离职当年就职情况) #### 核心问题修正 当高管在离职当年就找到新工作(`gap_days < 365`),原筛选逻辑会错误排除这些案例。解决方案是修改跳槽定义,允许间隔小于1年的情况,并在构建事件窗口处理年份重叠。 #### 优化后的完整代码 ```stata *--- 步骤1: 日期格式转换(保持不变) ---* gen becameceo_date = date(becameceo, "DMY") format becameceo_date %td gen becameceo_year = year(becameceo_date) gen leftofc_date = date(leftofc, "DMY") format leftofc_date %td gen leftofc_year = year(leftofc_date) *--- 步骤2: 增强跳槽事件识别 ---* // 按高管和间排序 sort execid becameceo_date by execid: gen job_seq = _n // 计算间间隔(天) by execid: gen next_becameceo = becameceo_date[_n+1] by execid: gen gap_days = next_becameceo - leftofc_date if job_seq < _N // 修正:允许任何正间隔(包括当天)的职业变动 gen is_jump = (gap_days >= 0 & !missing(gap_days)) // 识别跳槽类型(0=当年入职,1=跨年入职) gen jump_type = cond(gap_days <= 365, 0, 1) if is_jump *--- 步骤3: 创建灵活的事件窗口 ---* foreach jump_type_val in 0 1 { // 处理当年就职的情况(gap_days <= 365) if `jump_type_val' == 0 { gen window_`jump_type_val' = . replace window_`jump_type_val' = 1 if year == leftofc_year - 2 // 卸任前2年 replace window_`jump_type_val' = 2 if year == leftofc_year - 1 // 卸任前1年 replace window_`jump_type_val' = 3 if year == leftofc_year // 卸任当年=新工作第1年 replace window_`jump_type_val' = 4 if year == leftofc_year + 1 // 新工作第2年 replace window_`jump_type_val' = 5 if year == leftofc_year + 2 // 新工作第3年 } // 处理跨年就职的情况(gap_days > 365) else { gen window_`jump_type_val' = . replace window_`jump_type_val' = 1 if year == leftofc_year - 2 // 卸任前2年 replace window_`jump_type_val' = 2 if year == leftofc_year - 1 // 卸任前1年 replace window_`jump_type_val' = 3 if year == leftofc_year // 卸任当年 replace window_`jump_type_val' = 4 if year == becameceo_year // 新工作第1年 replace window_`jump_type_val' = 5 if year == becameceo_year + 1 // 新工作第2年 replace window_`jump_type_val' = 6 if year == becameceo_year + 2 // 新工作第3年 } } *--- 步骤4: 最终筛选逻辑 ---* // 合并两种跳槽类型的事件窗口 gen final_window = . replace final_window = window_0 if jump_type == 0 & !missing(window_0) replace final_window = window_1 if jump_type == 1 & !missing(window_1) // 筛选有效样本 keep if !missing(final_window) sort execid year // 添加窗口标签(可选) label define window_label /// 1 "离职前2年" /// 2 "离职前1年" /// 3 "离职当年/新工作第1年" /// 4 "新工作第2年" /// 5 "新工作第3年" label values final_window window_label ``` #### 代码关键改进 1. **双重事件窗口系统**: - **Type 0窗口**:处理离职当年就职的情况(5个窗口点) - **Type 1窗口**:处理跨年跳槽的情况(6个窗口点) - `jump_type`变量区分两种跳槽模式(0=当年入职,1=跨年入职) 2. **重叠年份处理**: - 当离职当年=新工作第1年(Type 0) - 使用单一窗口值`3`表示双重身份 - 避免重复计数同简化数据分析 3. **灵活的窗口编码**: - 使用`cond()`函数动态分配跳槽类型 - 窗口值附带清晰标签(1-6对应不同期) 4. **自动化流程**: - 保留原有日期处理逻辑 - 新增`final_window`变量整合两种跳槽类型 - 最终筛选只需判断`final_window`是否缺失 #### 实施建议 1. **数据检查**: ```stata tab jump_type, miss // 查看两种跳槽类型的分布 tab final_window // 验证各窗口期样本数量 ``` 2. **结果验证**: ```stata // 检查当年入职的典型案例 list exec_fullname year leftofc_year becameceo_year final_window if jump_type == 0 & year == leftofc_year // 检查跨年入职的典型案例 list exec_fullname year leftofc_year becameceo_year final_window if jump_type == 1 & year == leftofc_year ``` 3. **后续分析**: ```stata // 按窗口期分析薪酬变化 by final_window: sum bonus salary tdc1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值