#sas #append #missing-data #sas-iml
#sas #добавить #отсутствует-данные #sas-iml
Вопрос:
Я пытаюсь сохранить вектор с именем ez
product некоторых матричных вычислений на основе групповой переменной с именем ID_bloque
. Для каждого ID_bloque
значения мой код вычисляет вызываемый вектор ez
и добавляет его в матрицу с тем же именем. Однако, если zk
отсутствует вектор данных (что не является ошибкой), код останавливается и не выполняет никаких других вычислений, что является проблемой для других групп, поскольку для них вычисления не выполняются. Есть ли какой-либо способ принудительно сохранить эти данные и данные, полученные для других групп? append
Большое вам спасибо
proc iml;
/*Maximo= maximum ID_bloque value*/
do i=1 to %EVAL(amp;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:
Чтобы проверить, отсутствует ли вектор, вы должны использовать if all(zk = .) then …
Лучший способ обработки добавления к набору данных в цикле — это открыть набор данных ПЕРЕД циклом, добавить в цикле, а затем закрыть после цикла. 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(amp;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;
Комментарии:
1. Спасибо за ваш ответ. Знаете ли вы, возможно ли добавить вектор отсутствующих значений в
ez
?2. ДА. Оператор APPEND добавит любые значения, включая отсутствующие. Я подозреваю, что ваша предыдущая проблема была связана с оператором ALL.