2017-11-17 560 views
0

假設我們僅限於使用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

回答

0

我有一個解決方案,但它是折磨。必須有一個更好的方法來做到這一點,這在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。由於冗長而不是完全令人滿意的解決方案,但它確實有效。