SAS-Как подсчитать количество наблюдений за 10 лет до определенного месяца - PullRequest
0 голосов
/ 10 июля 2020

У меня есть образец, который включает две переменные: ID и ym. ID id относится к определенному c ID для каждого трейдера, а ym относится к переменной год-месяц. И я хочу создать переменную, которая показывает количество лет за 10-летний период предыдущего месяца t , как показано на следующем рисунке.

ID  ym  Want
1   200101  0
1   200301  1
1   200401  2
1   200501  3
1   200601  4
1   200801  5
1   201201  5
1   201501  4
2   200001  0
2   200203  1
2   200401  2
2   200506  3

Я пытаюсь использовать by функция и fisrt.id для подсчета числа.

data want;
set have;
want+1;
by id;
if first.id then want=1;
run;

Однако год в ym не является непрерывным. Когда временной разрыв превышает 10 лет, этот метод не работает. Хотя я предполагаю, что мне нужно подсчитать количество лет в скользящем окне (10 лет), я не уверен, как этого добиться. Пожалуйста, дайте мне несколько предложений. Спасибо.

Ответы [ 2 ]

5 голосов
/ 11 июля 2020

Просто подключитесь к SQL. С вашим кодированием YM легко сделать интервал, кратный году, но сложнее сделать другие интервалы.

proc sql;
create table want as 
  select a.id,a.ym,count(b.ym) as want 
  from have a 
   left join have b
   on a.id = b.id
   and (a.ym - 1000) <= b.ym < a.ym
  group by a.id,a.ym
  order by a.id,a.ym
;
quit;
1 голос
/ 11 июля 2020

Этот метод сохраняет предыдущие значения для каждого идентификатора и напрямую проверяет, сколько из них находится в пределах 120 месяцев от текущего значения. Он не оптимизирован, но работает. Вы можете установить в массиве m () максимальное количество значений, которые у вас есть для каждого идентификатора, если вы заботитесь об эффективности.

Переменная d - это краткое сокращение, которое я часто использую, который преобразует годы / месяцы в целое число так что

200012 -> (2000*12) + 12 = 24012
200101 -> (2001*12) + 1 = 24013
time from 200012 to 200101 = 24013 - 24012 = 1 month
data have;
   input id ym;
datalines;
1   200101  
1   200301  
1   200401  
1   200501  
1   200601  
1   200801  
1   201201  
1   201501  
2   200001  
2   200203  
2   200401  
2   200506  
;

proc sort data=have;
   by id ym;

data want (keep=id ym want);
   set have;
   by id;
   
   retain seq m1-m100;
   
   array m(100) m1-m100;
   
   ** Convert date to comparable value **;
   d = 12 * floor(ym/100) + mod(ym,10);
   
   ** Initialize number of previous records **;
   want = 0;
   
   ** If first record, set retained values to missing and leave want=0 **;
   if first.id then call missing(seq,of m1-m100);
   ** Otherwise loop through previous months and count how many were within 120 months **;
   else do;
      do i = 1 to seq;
         if d <= (m(i) + 120) then want = want + 1;
      end;
   end;
   
   ** Increment variables for next iteration **;
   seq + 1;
   m(seq) = d;
 
 run;
 
 proc print data=want noobs;
...