0

2つのループを使用して計算しようとしています。しかし、私はループ要素にあまり精通していません。

これが私のデータです:

data try;
 input rs t a b c;
 datalines;
 0    600    
 1    600       0.02514  667.53437  0.1638
 2    600       0.2766   724.60233  0.30162
 3    610       0.01592  792.34628  0.21354
 4    615.2869  0.03027  718.30377  0.22097
 5    636.0273  0.01967  705.45965  0.16847
 ;
run;

私が計算しようとしているのは、「T」値ごとに、a、b、およびcのすべての要素を方程式に使用する必要があるということです。次に、変数v1-v6を作成して、各T1-T6の方程式の結果を入力します。その後、vのすべての要素を合計するCSを作成します。

したがって、私の結果データセットは次のようになります。

rs    T           a          b          c        v1       v2        v3      v4  v5      v6    CS 
0    600                                                                                     sum of v1
1    600       0.02514   667.53437    0.1638                                                 sum of v2
2    600       0.2766    724.60233    0.30162                                                sum of v3
3    610       0.01592   792.34628    0.21354                                                sum of v4
4    615.2869  0.03027   718.30377    0.22097                                                sum of v5
5    636.0273  0.01967   705.45965    0.16847                                                sum of v6

これを行うために以下のコードを記述しましたが、エラーが発生しました。主に、変数のすべての要素をリンクするためにiとjを適切に使用する方法がわかりません。誰かが私が正しくないと思ったことを指摘できますか?myabeは、変数の要素を合計するためにsum関数を使用するべきではないことを認識していますが、どの関数を使用するかはわかりません。

data try3;
 set try;
 retain v1-v6;
 retain t a b c;
 array v(*) v1-v6;
 array var(*) t a b c;
 cs=0;
 do i=1 to 6;
  do j=1 to 6;
   v[i,j]=(2.89*(a[j]**2*(1-c[j]))/
    ((c[j]+exp(1.7*a[j]*(t[i]-b[j])))*
    ((1+exp(-1.7*a[j]*(t[i]-b[j])))**2));
   cs[i]=sum(of v[i,j]-v[i,j]);
  end;
 end;
run;

たとえば、ab cの値がないため、v1はv [1,1]=0のように計算されます。

v [1,2] =(2.89 * 0.02514 ** 2(1-0.1638))/((0.1638 + exp(1.7 * 0.02514 * 600-667.53437)))*((1 + exp(-1.7 * 0.02514 * (600-667.5347)))** 2))。

v [1,3]] =(2.89 * 0.2766 ** 2(1-0.30162))/((0.30162 + exp(1.7 * 0.2766 * 600-724.60233)))*((1 + exp(-1.7 * 0.2766 * (600-724.60233)))** 2))。

v [1,4]はabcの次の行の値を使用しますが、tはt[1]と同じになります。そして最後の行までこれを行います。そしてそれはv1になります。次に、v1 {1,1] + v1 [1,2] + v1 {1,3] .... v1 [1,6]のようなv1のすべての要素を合計して、cs[1,1]を作成する必要があります。 。

4

1 に答える 1

4

SAS言語は、本質的に行列計算であるこれらの種類のことを行うのにそれほど優れていません。DATAステップは通常、一度に1つの観測値を処理しますが、RETAINステートメントを使用して計算を引き継ぐことができます。PROC IML(行列計算をネイティブに実行する)にアクセスできれば、これよりもクリーンな結果が得られる可能性がありますが、IMLにアクセスできないと仮定すると、次のようなことを行う必要があります。それがあなたが必要としているものであると100%確信しているわけではありませんが、それは正しい方向に沿っていると思います。

    data try;
     infile cards missover;
     input rs t a b c;
     datalines;
     0    600    
     1    600       0.02514  667.53437  0.1638
     2    600       0.2766   724.60233  0.30162
     3    610       0.01592  792.34628  0.21354
     4    615.2869  0.03027  718.30377  0.22097
     5    636.0273  0.01967  705.45965  0.16847
     ;
    run;

    data try4(rename=(aa=a bb=b cc=c css=cs tt=t vv1=v1 vv2=v2 vv3=v3 vv4=v4 vv5=v5 vv6=v6));
    * Construct arrays into which we will read all of the records;
    array t(6);
    array a(6);
    array b(6);
    array c(6);
    array v(6,6);
    array cs(6);

    * Read all six records;
    do i=1 to 6;
      set try(rename=(t=tt a=aa b=bb c=cc));
      t[i] = tt;
      a[i] = aa;
      b[i] = bb;
      c[i] = cc;
    end;

    * Now do the calculation, which involves values from each
      row at each iteration;
    do i=1 to 6;
      cs[i]=0;
      do j=1 to 6;
        v[i,j]=(2.89*(a[j]**2*(1-c[j]))/
           ((c[j]+exp(1.7*a[j]*(t[i]-b[j])))*
           ((1+exp(-1.7*a[j]*(t[i]-b[j])))**2)));
        cs[i]+v[i,j];
      end;

      * Then output the values for this iteration;
      tt=t[i];
      aa=a[i];
      bb=b[i];
      cc=c[i];
      css=cs[i];
      vv1=v[i,1];
      vv2=v[i,2];
      vv3=v[i,3];
      vv4=v[i,4];
      vv5=v[i,5];
      vv6=v[i,6];
      keep tt aa bb cc vv1-vv6 css;
      output try4;
     end;

既知のサイズの配列を作成する必要があることに注意してください。つまり、入力レコードがいくつあるかを知っている必要があります。

DATAステップの前半は、入力データセットからの値が読み込まれる配列を作成します。行列のメモリにすべての値があるため、すべてのレコードを読み取り、次にすべての計算を実行します。配列名t、a、b、cなどを保持しながら、出力データセットにa、b、cなどの名前の変数を含めることができるように、RENAMESをいじる必要があります。

うまくいけば、それは少しあなたを助けるかもしれません。私はあなたがやろうとしていることを誤解したので、それかあなたを混乱させます!

于 2012-04-12T13:45:10.557 に答える