2017-11-17 37 views
0

SAS를 사용하는 데 국한되어 있고 패널/길이 데이터 세트가 있다고 가정 해보십시오. 우리는 코호트와 시간에 대한 지표와 일부 측정 변수 y을 가지고 있습니다. 데이터 집합은 시간 단위 (6)를 벗어나면, 각각의 연속 패널 부 시간에 앞서 하나 이상의 기간을 짧게되도록 코호트 시간 단위가 동일한 지SAS를 사용하여 불평형 패널 데이터의 보간 값

data in; 
input cohort time y; 
datalines; 
1 1 100 
1 2 101 
1 3 102 
1 4 103 
1 5 104 
1 6 105 
2 2 . 
2 3 . 
2 4 . 
2 5 . 
2 6 . 
3 3 . 
3 4 . 
3 5 . 
3 6 . 
4 4 108 
4 5 110 
4 6 112 
run; 

참고.

실제 데이터 사이에는 2 개의 패널 단위 간격이 있습니다. 목표는 2 개의 누락 된 패널 단위 (코호트 2와 3의 값)를 "샌드위치"한 두 개에서 선형 보간하는 것입니다. 시간 5의 코호트 2의 경우 보간 된 값은 0.67*104 + 0.33*110이어야하고, 시간 5의 코호트 3의 경우는 0.33*104 + 0.67*110이되어야합니다. 기본적으로 실제와 가까운 패널 단위의 경우 2/3, 추가 패널 단위의 경우 1/3의 무게를가집니다. 당연히 누락 된 가치가 있지만이 장난감 예제에는 문제가 없습니다.

나는 지연과 관련한 연산자와 루프를 사용한다고 상상하지만 내 SAS는 너무 열악하여 내 코드 예제를 제공하는 것을 주저합니다.

+0

당신이 지금까지 시도한 것을 게시하십시오. SAS/ETS가 있습니까? – Reeza

답변

0

나는 해결책을 얻었지만, 고문을 당한다. 그것을하는 더 좋은 방법이 있어야합니다, 이것은 Stata에서 한 줄을 필요로합니다.

먼저 우리는이 개 인구 패널 단위, 보간 값, I 돈을 생산하는

proc sql; 
create table haveY as 
select time, cohort, y 
from startingData 
where y is not missing 
order by time, cohort; 

quit; 

다음으로 루프이 감소 데이터 세트의 행을 통해 "샌드위치의 빵"의 테이블을 만들기 위해 proc SQL를 사용 여기에있는 작업을 완전히 따르지 않으면, 내가 발견 한 관련 예제를 수정했습니다.

data wantY; 
set haveY(rename=(y=thisY cohort=thisCohort)); 
by time; 

retain lastCohort lastY; 
lastcohort = lag(thisCohort); 
lastY = lag(thisY); 
if not first.time then do; 
    do cohort = lastCohort +1 to thisCohort-1; 
    y = ((thisCohort-cohort)*lastY + (cohort-lastCohort)*thisY)/(thisCohort-lastCohort); 
    output; 
    end; 
end; 
cohort=thisCohort; 
y=thisY; 
drop this: last:; 
run; 

proc sort data=work.wantY; 
by cohort time; 
run; 

이 필요한 것을 생산 않습니다, 그것은 시작 테이블에 proc sql를 사용하여 가입 할 수 있습니다 startingData. 자세한 표시로 인해 완전히 만족스러운 해결책은 아니지만 작동합니다.