Обрезка моего набора данных панели - фильтрация наблюдений, соответствующих критерию, если предыдущий идентификатор соответствует дополнительному критерию

Я работаю с набором данных, который включает 118 979 наблюдений по 9 широким переменным в Stata 16.0. Наиболее важной переменной является то, сообщает ли компания, наблюдающая за несколькими датами, «GPS» или «EPS». Эти компании могут сообщать как наблюдение «GPS» в точке данных, так и наблюдение «EPS» в следующей точке данных. Пожалуйста, обратитесь к обзору данных ниже для дальнейшей визуализации.

Образец данных:

clear
input str8 cusip8 str16 cname str4 measure double actual long anndats_act float(fyear tanalyst meanforcast UE)
"87482X10" "TALMER BANCORP"   "EPS"   1.21 20118 2014  29   .8686207     .3930131
"87482X10" "TALMER BANCORP"   "GPS"   1.02 20479 2015  34   .8576471     .1893004

Мне нужно отказаться от наблюдений GPS (за несколько дат), как только идентификатор (являющийся cusip8 в таблице выше) сообщил о EPS за несколько дат. То есть, если компания сообщила GPS, а также EPS, например, в 1 января 2010 г., я хочу отказаться от наблюдения GPS, чтобы сохранить EPS. Если компания сообщает только о GPS и не сообщает о EPS в заданную дату, я хочу сохранить данные GPS-наблюдения в моем наборе данных.


person CasperVanBrink    schedule 20.05.2020    source источник


Ответы (1)


Для меня работает следующее (при необходимости измените имена переменных):

. clear

. input str10(company_id measure) month day year

     company_id measure month day year
  1. "Company A" "EPS" 1 1 2010
  2. "Company A" "GPS" 1 1 2010 
  3. "Company A" "GPS" 1 1 2010
  4. "Company A" "GPS" 1 2 2010
  5. "Company B" "EPS" 1 2 2010
  6. "Company B" "GPS" 1 1 2010
  7. "Company C" "GPS" 1 4 2010
  8. "Company C" "EPS" 1 4 2010
  9. end

. 
. gen date = mdy(month,day,year)

. format date %d

. drop month day year

. 
. sort company_id date measure

. 
. gen both = 0

. by company_id date: replace both = 1 if measure[1] == "EPS" & measure[2] == "GPS"
(5 real changes made)

. 
. list, sepby(company_id)

     +----------------------------------------+
     | company~d   measure        date   both |
     |----------------------------------------|
  1. | Company A       EPS   01jan2010      1 |
  2. | Company A       GPS   01jan2010      1 |
  3. | Company A       GPS   01jan2010      1 |
  4. | Company A       GPS   02jan2010      0 |
     |----------------------------------------|
  5. | Company B       GPS   01jan2010      0 |
  6. | Company B       EPS   02jan2010      0 |
     |----------------------------------------|
  7. | Company C       EPS   04jan2010      1 |
  8. | Company C       GPS   04jan2010      1 |
     +----------------------------------------+

. 
. drop if measure == "GPS" & both == 1
(3 observations deleted)

. 
. list, sepby(company_id)

     +----------------------------------------+
     | company~d   measure        date   both |
     |----------------------------------------|
  1. | Company A       EPS   01jan2010      1 |
  2. | Company A       GPS   02jan2010      0 |
     |----------------------------------------|
  3. | Company B       GPS   01jan2010      0 |
  4. | Company B       EPS   02jan2010      0 |
     |----------------------------------------|
  5. | Company C       EPS   04jan2010      1 |
     +----------------------------------------+
person Cybernike    schedule 21.05.2020