我正在尝试在面板集数据中线性插值。因此,如果变量的当前值为“。”,我将在变量中找到下一个非零值。
例如,如果 X = { 1, 2, . , . , . ,7),我想将 7 存储为变量“Y”,并将 X 的滞后值作为斜率的分子。任何人都可以帮助完成这一步吗?
我正在尝试在面板集数据中线性插值。因此,如果变量的当前值为“。”,我将在变量中找到下一个非零值。
例如,如果 X = { 1, 2, . , . , . ,7),我想将 7 存储为变量“Y”,并将 X 的滞后值作为斜率的分子。任何人都可以帮助完成这一步吗?
如果您无法转置您的数据,这里有一种适用于您给定示例的方法:
data test;
input id $3. x best12.;
datalines;
AAA 1
BBB 2
CCC .
DDD .
EEE .
FFF 7
;
run;
data test2;
set test;
n = _n_;
if x ne .;
run;
data test3;
set test2;
lagx = lag(x);
lagn = lag(n);
if _n_ > 1 and n ne lagn + 1 then do;
postiondiff = n - lagn;
valuediff = x - lagx;
do i = (lagx + ((x-lagx)/(n-lagn))) to x by ((x-lagx)/(n-lagn));
x = i;
output;
end;
end;
else output;
keep x;
run;
data test4;
merge test test3 (rename = (x=newx));
run;
所以我们基本上是用插值重建变量,然后将其重新合并到原始数据集中,而不使用 by 变量,这将使所有新的插值数据与缺失点对齐。
有没有办法可以转置所有数据?当您需要的所有数据都在一次观察中时,这样的插值会容易得多。像这样:
data test;
input x best12.;
datalines;
1
2
.
.
.
7
;
run;
proc transpose data = test
out = test2;
run;
data test3;
set test2;
array xvalues {*} COL1-COL6;
array interpol {4,10} begin1-begin10 end1-end10 begposition1-begposition10 endposition1-endposition10;
rangenum = 1;
* Find the endpoints of the missing ranges;
do i = 1 to dim(xvalues);
if xvalues{i} ne . then lastknownx = xvalues{i};
else do;
interpol{1,rangenum} = lastknownx;
if interpol{3,rangenum} = . then interpol{3,rangenum} = i - 1;
end;
if i > 1 and xvalues{i} ne . then do;
if xvalues{i-1} = . then do;
interpol{2,rangenum} = xvalues{i};
interpol{4,rangenum} = i;
rangenum = rangenum + 1;
end;
end;
end;
* Interpolate;
rangenum = 1;
do j = 1 to dim(xvalues);
if xvalues{j} = . then do;
xvalues{j} = interpol{1,rangenum} + (j-interpol{3,rangenum})*((interpol{2,rangenum}-interpol{1,rangenum})/(interpol{4,rangenum}-interpol{3,rangenum}));
end;
else if j > 1 and xvalues{j} ne . then do;
if xvalues{j-1} = . then rangenum = rangenum + 1;
end;
end;
keep col1-col6;
run;
每次观察最多可以处理 10 个不同的缺失范围,尽管您可以通过创建更大的数组来调整代码以处理更多。
SAS 数据步骤从上到下一次读取一条记录的数据集。所以在记录 i 处,它不能访问 i+1 因为它还没有读取它;它只能访问 i-1。假设您有一个带有变量 x 的数据集。
data intrpl;
retain _x;
set yourdata;
by x notsorted;
if not missing(x) then do;
_x = x;
if last.x then do;
slope = _x - lag(_x);
output;
end;
end;
run;
如果 x 具有很多值,转置可能会有点混乱,所以我推荐这种方法。我希望它有帮助!