Принудительно добавлять в SAS для сохранения отсутствующих данных - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь сохранить вектор с именем ez произведение некоторых матричных вычислений на основе групповой переменной с именем ID_bloque. Для каждого значения ID_bloque мой код вычисляет вектор с именем ez и добавляет его в матрицу с тем же именем. Однако, если zk является отсутствующим вектором данных (что не является ошибкой), код останавливается и не выполняет никаких других вычислений, что является проблемой для других групп, поскольку для них не производятся никакие вычисления. Есть ли способ заставить предложение append сохранить эти данные и результаты, полученные для других групп? Большое вам спасибо

proc iml;
/*Maximo= maximum ID_bloque value*/
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;
     /* ez values depending on missing information in zk*/
     if all(zk)=. then do;
          ez=zk;
     end;
     else do;
          Brz=(Ginv(MAT))*((XK`)*(dk#vk#zk));
          ez=zk-XK*Brz;
     end;
     /* Vectors appending (error source) */
     if i=1 then do;
          create ez var{ez}; APPEND;
     end;else do; APPEND var{ez} ;end;
end;
close ez;
quit;

1 Ответ

0 голосов
/ 13 апреля 2019

Чтобы проверить, отсутствует ли вектор, следует использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...