【问题标题】:Interpolate values in unbalanced panel data using SAS使用 SAS 在不平衡面板数据中插入值
【发布时间】:2018-05-01 18:16:53
【问题描述】:

假设我们仅限于使用 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,而对于时间 5 的群组 3,它应该是 0.33*104 + 0.67*110。基本上,您只需为更近的面板单元加上实际值的 2/3 重量,为更远的面板单元重量 1/3。您当然会有缺失值,但对于这个玩具示例来说,这不是问题。

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

【问题讨论】:

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

标签: sas panel-data linear-interpolation longitudinal


【解决方案1】:

我有一个解决方案,但是它很受折磨。必须有更好的方法来做到这一点,这在 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。由于冗长,这不是一个完全令人满意的解决方案,但它确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 2014-10-30
    • 2020-01-13
    • 2019-06-18
    • 2021-06-01
    • 1970-01-01
    • 2021-08-25
    • 2014-12-02
    相关资源
    最近更新 更多