パネル セット データ内の値を線形補間しようとしています。したがって、変数の現在の値が「。」の場合、変数内の次のゼロ以外の値を見つけます。
たとえば、X = { 1, 2, . 、 。、 。,7), 変数 "Y" として 7 を格納し、そこから X のラグ値を勾配の分子として適用したいと考えています。誰でもこのステップを手伝ってもらえますか?
パネル セット データ内の値を線形補間しようとしています。したがって、変数の現在の値が「。」の場合、変数内の次のゼロ以外の値を見つけます。
たとえば、X = { 1, 2, . 、 。、 。,7), 変数 "Y" として 7 を格納し、そこから 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 変数なしで元のデータセットに再マージします。これにより、すべての新しい補間データが欠落しているポイントと整列します。
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 が多くの値を取ると転置が面倒になるので、この方法をお勧めします。それが役立つことを願っています!
すべてのデータを転置する方法はありますか? 必要なすべてのデータが 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 個の異なる範囲を処理できますが、より大きな配列を作成することにより、コードを微調整してそれよりもはるかに多くの範囲を処理できます。