【问题标题】:Force append in SAS to save missing data在 SAS 中强制追加以保存丢失的数据
【发布时间】:2025-12-07 01:45:01
【问题描述】:

我正在尝试保存一个名为 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;

【问题讨论】:

    标签: sas append missing-data sas-iml


    【解决方案1】:

    要检查一个向量是否全部丢失,你应该使用 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;
    

    【讨论】:

    • 感谢您的回答。你知道是否可以将缺失值向量附加到ez
    • 是的。 APPEND 语句将附加任何值,包括缺失值。我怀疑您之前的问题与 ALL 语句有关。