我想先遍历列,然后遍历行。
data test ;
input cat $ cat3 cat4 cat5 cat6 cat7 cat8 num_rat ;
cards;
cat3 0 -1.78 -2.68 -3.06 -3.4 -3.83 1885
cat4 0 2.12 -2.15 -2.63 -2.94 -3.34 3151
cat5 0 2.45 1.16 -1.39 -1.99 -2.54 246
cat6 0 2.48 1.92 1.19 -1.13 -2.39 80
cat7 0 2.68 2.32 1.82 1.52 -1.56 89
;
run;
DATA TEST1;
SET test;
Array Cat_C(6) cat3-cat8;
Array Cat_g(5) catg3-catg7;
do i= 1to 5;
cat_g(i)= num_rat * ((((CDF('Normal', Cat_C(i+1))-CDF('NORMAL',Cat_C(i))-
((CDF('NORMAL', ((Cat_C(i+1) - (sqrt(&rho)*&z))/sqrt(1-&rho))))-(CDF
('NORMAL', ((Cat_C(i) - (sqrt(&rho)*&z))/sqrt(1-&rho))))))**2))/
(((CDF('NORMAL', ((Cat_C(i+1) - (sqrt(&rho)*&z))/sqrt(1-&rho))))-(CDF
('NORMAL', ((Cat_C(i) - (sqrt(&rho)*&z))/sqrt(1-&rho)))))*(1- /**/((CDF('NORMAL', ((Cat_C(i+1) - (sqrt(&rho)*&z))/sqrt(1-&rho))))-(CDF
('NORMAL', ((Cat_C(i) - (sqrt(&rho)*&z))/sqrt(1-&rho))))))));
end;
run;
我需要通过第一个减法(0 + -1.78)* 1885 +(-1.78 + -2.68)* 1885 +(-2.68 + -3.06)* 1885 +(-3.06 + -3.4)对cat3(行)求和)* 1885 +(-3.4 + -3.83)* 1885
然后为所有行(cat4,cat5,cat6,cat7)计算,然后将所有行加在一起,并像(min(sum_rows))那样将它们最小化。
在本文中可以找到最小化方程: https://www.frontiersin.org/articles/10.3389/fpsyg.2013.00328/full
其中x(g + 1)是从cat3到cat4的运动。并且rho必须为任何固定数字(例如0.8),并且z必须使用任何初始数字(例如0.89)最小化。
答案 0 :(得分:0)
根据数据,您可以尝试使用2D阵列。
{...}
其他选择是在'...': '...'
中进行行计算,并在data test ;
input cat $ cat3 cat4 cat5 cat6 cat7 cat8 num_rat ;
cards;
cat3 0 -1.78 -2.68 -3.06 -3.4 -3.83 1885
cat4 0 2.12 -2.15 -2.63 -2.94 -3.34 3151
cat5 0 2.45 1.16 -1.39 -1.99 -2.54 246
cat6 0 2.48 1.92 1.19 -1.13 -2.39 80
cat7 0 2.68 2.32 1.82 1.52 -1.56 89
;
data _null_;
array X (3:7,3:9); * column index 9 is num_rat;
* load 2D array;
do row = 3 to 7;
set test;
array cols cat3-cat8 num_rat;
do col = 3 to 9;
X(row,col) = cols(col-2);
end;
end;
do index1 = 3 to 7;
do index2 = 3 to 9;
putlog @(8*(index2-3)+1) X(index1,index2) @;
end;
putlog;
end;
run;
中进行列计算
您还可以查看DATA Step
,Proc MEANS
,Proc IML
和SAS/OR
函数,或者Proc FCMP
及其矩阵函数。