4

SASで、それ自体に依存する列を計算しようとしています。たとえば、次の初期値のリストがあります

    ID Var_X Var_Y Var_Z
     1     2     3     .   
     2     .     2     .
     3     .     .     .
     4     .     .     .
     5     .     .     .
     6     .     .     .
     7     .     .     .

空白を埋める必要があります。式は次のとおりです。

    Var_Z = 0.1 + 4*Var_x + 5*Var_Y
    Var_X = lag1(Var_Z)
    Var_Y = lag2(Var_Z)

ご覧のとおり、Var_X、Var_Y、Var_Zの値は相互に依存しています。したがって、計算は特定の順序に従う必要があります。

First we compute when ID = 1, Var_Z = 0.1 + 4*2 + 5*3 = 23.1
Next, when ID = 2,  Var_X = lag1(Var_Z) = 23.1

ここにはすでに初期値があるため、Var_YはID=2で計算する必要はありません。だから、私たちは持っています

    ID Var_X Var_Y Var_Z
     1     2     3  23.1   
     2   23.1    2  102.5 (= 0.1 + 4*23.1 +5*2)
     3     .     .     .
     4     .     .     .
     5     .     .     .
     6     .     .     .
     7     .     .     .

すべての値が計算されるまで、この手順を繰り返します。

SASがこれを処理できる方法はありますか?DOループを試しましたが、正しくコーディングできなかったと思います。ID=2の後で停止します。

私はSASを初めて使用するので、SASがこれを簡単に処理できる方法があるかどうかはわかりません。あなたの提案を待ちます。

4

2 に答える 2

5

単一のデータステップでこれを行う場合は、LAGまたはRETAINを使用する必要はありません。DOループ自体は物事をうまく処理します。RETAINが必要になるのは、既存のデータセットを含む何かをしている場合だけですが、実際にそれを使用する理由はありません。

ここではショートカットを使用しています-VAR_YをVAR_Zで説明している間、実際には、1回の反復の後、VAR_ZがVAR_Xに移動し、VAR_XがVAR_Yに移動することを意味します。したがって、これを行います(混乱しないように適切な順序で) 。

data test_data;
if _n_ = 1 then do;
var_x=2;
var_y=3;
end;
do _iter = 1 to 7;
  var_z = 0.1+4*var_x+5*var_y;
  output;
  var_y=var_x;
  var_x=var_z;
end;
run;
proc print data=test_data;
run;
于 2012-09-08T02:24:32.030 に答える
2

これはDOループ内で実行できると思います。重要なのは、SASに変数の最後の値を記憶させることです。私の提案は、疑似SASコードでは、次のような単純な「カウンター」プログラムを少し調べてみることです。

Do i = 1 to 100;
   i = i + 1;
run;

そして、SASでの実際の構文を確認してください。あなたの問題は、DOループ内でretainステートメントを使用していないことだと思います。SASのドキュメントでそのことを確認し、問題が解決するかどうかを確認してください。

于 2012-09-07T22:00:08.910 に答える