1

我正在尝试在面板集数据中线性插值。因此,如果变量的当前值为“。”,我将在变量中找到下一个非零值。

例如,如果 X = { 1, 2, . , . , . ,7),我想将 7 存储为变量“Y”,并将 X 的滞后值作为斜率的分子。任何人都可以帮助完成这一步吗?

4

3 回答 3

1

如果您无法转置您的数据,这里有一种适用于您给定示例的方法:

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 变量,这将使所有新的插值数据与缺失点对齐。

于 2013-11-27T19:40:04.413 回答
0

有没有办法可以转置所有数据?当您需要的所有数据都在一次观察中时,这样的插值会容易得多。像这样:

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 个不同的缺失范围,尽管您可以通过创建更大的数组来调整代码以处理更多。

于 2013-11-27T18:30:49.240 回答
0

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 具有很多值,转置可能会有点混乱,所以我推荐这种方法。我希望它有帮助!

于 2013-11-27T18:47:20.733 回答