2017-11-15 5 views
0

SAS에 패널/종단 데이터 세트가 있습니다.SAS에서 성장률 변수로 변수를 반복적으로 전진

하나의 필드는 클래스 또는 유형을 나타내며, 다른 하나는 중단되지 않은 시점이고, 다른 하나는 관찰 된 기록이고 다른 하나는 상기 기록의 로그 차이 예측입니다. 새로운 필드를 추가하고 싶습니다 : 이력 필드는 예측 필드에 의해 진행됩니다.

그래서 시간 필드가 '미래'에 있다면, 로그 지연 예측 변수의 exp로 곱한 자체 지연 변수를 재귀 적으로 전진시키고 싶습니다. 사소한 일로 보입니다.

아래 장난감 데이터 세트로 문제를 재현하려고 시도했습니다.

data in; 
input class time hist forecast; 
datalines; 
1 1 100 . 
1 2 . .1 
1 3 . .15 
1 4 . .17 
2 1 100 . 
2 2 . .18 
2 3 . .12 
2 4 . .05 
run; 

proc sort data=work.in; 
by class time; 
run; 

data out; 
    set in; 
    by class time; 
retain goal hist; 
if time > 1 then goal= lag1(goal) * exp(forecast); 
run; 

답변

1

JP는 :

이 작업을 할 수 있습니다 :

data out; 
    set in; 
    by class time; 

    retain goal; 

    if first.class 
     then goal=hist; 
     else goal = goal * exp(forecast); 
run; 

을 주로 스택의 lag1 유형으로 간주 할 수있다 변수를 설정되지 않은 데이터를 유지. 초기 목표는 각 그룹의 시작에서 재설정해야합니다.

첫 번째 시도는 조건부로 보유 변수를 LAG1 '처리하는 반면 그룹 처리는 BY - 내 머리를 회전시킵니다. LAG-n은 처리 흐름이 통과 할 때만 암시 적 LAG 스택이 업데이트되기 때문에 까다로운 작업입니다. 조건부가 LAG 함수 호출을 바이 패스하면 LAG 스택을 업데이트 할 수 없습니다. 다른 SAS 코딩에서 LAG가 표시되면 ifs보다 먼저 무조건적인 위치에 나타날 수 있습니다.

참고 : 유지 데이터는 SET 문에 도달하면 그 값을 덮어 쓰기 때문에 변수 (예 : hist)이 비정형입니다 설정합니다. 비정형적인 경우는 SET 문 이전에 보유 된 데이터 세트 변수를 테스트 할 때 기능적 목적이있는 경우입니다.

+0

입력 데이터 세트에서 제공된 변수에 대해 RETAIN 문을 추가 할 필요가 없습니다. 이러한 변수는 이미 유지됩니다. 그것은 MERGE 문이 1 대 다수 병합을 수행하는 방법입니다. – Tom

관련 문제