使用SAS对不平衡面板数据进行插值

问题描述:

假设我们仅限于使用SAS并具有面板/纵向数据集。我们有队列和时间指标,以及一些测量变量y使用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; 

注意,队列和时间的单位是相同的,所以,如果数据集出去时间单元6中,每个连续的面板单元将是一个周期比在时间之前它的一个更短。

我们在实际数据之间有两个面板单位的差距。我们的目标是从两个“夹心”它们的线性内插两个缺失的面板单元(第2组和第3组的值)。对于时间5处的群组2,内插值应该是0.67*104 + 0.33*110,而对于时间5处的群组3,它将是0.33*104 + 0.67*110。基本上你只是用实际的重量较轻的面板单元重量的2/3,而另一个面板单元的重量只有1/3。你当然会有缺失的值,但对于这个玩具的例子来说,这不是问题。

我想象的解决方案涉及滞后和使用first.运算符和循环,但我的SAS是如此之差,我犹豫提供甚至我破碎的代码示例。

+0

发布您到目前为止所尝试的内容。你有SAS/ETS吗? – Reeza

我有一个解决方案,但它是折磨。必须有一个更好的方法来做到这一点,这在Stata需要一条线。

首先,我们使用proc SQL,使两个填充面板单位,

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

quit; 

接下来我们遍历这个减少数据集的行“夹心面包”,以产生内插值,我不的表我完全遵循这里的操作,我修改了我找到的一个相关示例。

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。由于冗长而不是完全令人满意的解决方案,但它确实有效。