我正在尝试使用两个循环进行计算。但我对循环元素不是很熟悉。
这是我的数据:
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一样计算,因为b 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]将使用b c的下一行值,但t将与t [1]相同。并执行此操作直到最后一行。这将是v1。然后我需要总结v1的所有元素,如v1 {1,1] + v1 [1,2] + v1 {1,3] .... v1 [1,6]来制作cs [1,1]
答案 0 :(得分: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步骤的前半部分构造数组,读取输入数据集中的值。我们读了所有的记录,然后我们做了所有的计算,因为我们在matricies的内存中有所有的值。 有一些摆弄RENAMES,以便您可以保留数组名称t,a,b,c等,但在输出数据集中仍然有变量名为a,b,c等。
所以希望这可能对你有所帮助。无论是那个还是让你感到困惑,因为我误解了你想要做的事情!