Чтобы проверить, отсутствует ли вектор, следует использовать if all (zk =.) Затем ...
Лучший способ обработать добавление к набору данных в цикле - открыть данныеустановить ДО цикла, добавить в цикл, а затем закрыть после цикла.SAS необходимо знать, какие типы данных и длины будут записаны, поэтому я обычно использую поддельные данные (например, пропущенные значения), когда открываю набор данных только для предоставления типов переменных.
И наконец, вычисление MAT для васВы делаете это умножение матриц, так что вы можете упростить это вычисление:
proc iml;
/*Maximo= maximum ID_bloque value*/
ez = .; /* tell IML that ez is a numeric vector */
create ez var {ez}; /* open the data set */
do i=1 to %EVAL(&MAXIMO);
use T6; /*Dataset*/
/*Variables*/
read all var{E1S1 E1S2 E2S1 E2S2 E3S1 E3S2 E4S1 E4S2}
into XK where (ID_bloque=i) ;
read all var{FEX_P} into dk where (ID_bloque=i) ;
read all var{VK} into vk where (ID_bloque=i) ;
read all var{z} into zk where (ID_bloque=i) ;
/* Matrix computations */
/*
MAT=J(NCOL(XK),NCOL(XK),0);
do j=1 to Nrow(XK);
MAT= MAT + dk[j]*vk[j]*((XK[j,]`)*XK[j,]);
end;
*/
MAT = (dk#vk#XK)` * XK;
/* ez values depending on missing information in zk*/
if all(zk=.) then do;
ez=repeat(1, Nrow(XK));
end;
else do;
Brz=(Ginv(MAT))*((XK`)*(dk#vk#zk));
ez=zk-XK*Brz;
end;
/* Vectors appending (error source) */
append;
end;
close ez;
quit;