使用SAS插值不平衡面板数据中的值

时间:2017-11-17 21:36:46

标签: sas panel-data linear-interpolation longitudinal

假设我们仅限于使用SAS并拥有面板/纵向数据集。我们有队列和时间的指标,以及一些测量变量y

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,而对于群组3在时间5,它将是0.33*104 + 0.67*110。基本上你只有2/3用于更接近的面板单元与实际值,而1/3用于另外的面板单元。你当然会有缺失值,但对于这个玩具示例来说这不是问题。

我在想象解决方案涉及滞后和使用first.运算符和循环,但我的SAS太差了,我甚至不愿提供我破坏的代码示例。

1 个答案:

答案 0 :(得分:0)

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

首先我们使用Function as function pointer: 1 Functor as function pointer: 0 Functor as functor: 1 制作两个填充的面板单元的表格,即“三明治的面包”

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