0

我正在尝试使用两个循环进行计算。但我对循环元素不是很熟悉。

这是我的数据:

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 放置方程的结果。之后,我创建 CS 来汇总 v 的所有元素。

所以我的结果数据集将如下所示:

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;

例如,v1 将像 v[1,1] =0 一样计算,因为 ab c 没有值。

对于 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 的所有元素相加,例如 v1{1,1] +v1[1,2]+ v1{1,3] ....v1[1,6] 以生成 cs[1,1] .

4

1 回答 1

4

SAS 语言不擅长做这些事情,这些事情本质上是矩阵计算。DATA 步骤通常一次处理一个观察结果,但您可以使用 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 步的前半部分构造数组,从输入数据集中读取值。我们读取所有记录,然后进行所有计算,因为我们在矩阵中拥有内存中的所有值。对 RENAMES 进行了一些修改,以便您可以保留数组名称 t、a、b、c 等,但在输出数据集中仍有名为 a、b、c 等的变量。

所以希望这可能会对你有所帮助。要么这样,要么让你感到困惑,因为我误解了你想要做什么!

于 2012-04-12T13:45:10.557 回答