1

パネル セット データ内の値を線形補間しようとしています。したがって、変数の現在の値が「。」の場合、変数内の次のゼロ以外の値を見つけます。

たとえば、X = { 1, 2, . 、 。、 。,7), 変数 "Y" として 7 を格納し、そこから 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

SAS データ ステップでは、データセットを一度に 1 レコードずつ上から下に読み取ります。したがって、レコード 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 に答える
0

すべてのデータを転置する方法はありますか? 必要なすべてのデータが 1 つの観測にある場合、そのような補間ははるかに簡単です。このような:

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 に答える