Macros SAS. Hacer 0 los valores missing de un dataset

La siguiente macro de SAS nos permite transformar los valores perdidos (missing) en valor 0 para todas las variables de un dataset. Para todas, para todas las numéricas. Esto es muy importante porque en ocasiones es necesario distinguir el valor 0 del valor missing(.). Pero puede ser muy práctica si vamos a emplear procedimientos que han de distinguir valores perdidos o, simplemente, si deseamos que nuestra tabla tenga otro aspecto.

La metodología del ejemplo que copiáis y pegáis en SAS para examinar los resultados y el log es la más apropiada, o así me lo han trasmitido algunos. Como siempre, planteemos un ejemplo. Lo primero es crear un dataset con valores missing:


*EJEMPLO DE DATASET CON VALORES PERDIDOS;
data uno;
 do i=1 to 100;
  x=ranpoi(8,45)/(rand("uniform")>0.25)*100;
  y=ranbin(5,5,.7)/(rand("uniform")>0.60)/10;
  output;
 end;
run;

Generamos un dataset aleatorio con 100 observaciones y 3 variables numéricas donde dos de ellas pueden tener valores perdidos. La macro que modifica estos valores para transformarlos a 0 crea un array con todas las variables numéricas, se lo recorre y si encuentra un missing lo cambia a 0:


%macro hazceros;
drop _i_;
array _c_(*) _numeric_;
do _i_=1 to dim(_c_);
 if _c_(_i_)=. then _c_(_i_)=0;
end;
%mend;
*EJEMPLO DE USO;
data uno;
 set uno;
 %hazceros;
run;

Vemos que nuestra macro no necesita parámetros y es sólo un array con todas las variables numéricas del dataset. Esta macro es muy práctica y seguro que os ahorra gran cantidad de código, pero insisto, transforma todas las variables numéricas y un valor perdido no es lo mismo que un valor 0.

Por supuesto, dudas, sugerencias, un trabajo excelentemente retribuido,… rvaquerizo@analisisydecision.es

12 comentarios en “Macros SAS. Hacer 0 los valores missing de un dataset

  1. Yo tambíen suelo utilizar la opcion missing, que es muy útil si lo que vas a hacer es volcar la tabla a un txt:
    options missing=0; /* elegimos el valor que representa el missing */
    %volcado(tabla);
    options missing=.; /* Lo dejamos como estaba */
    Lo único que hace es cambiar la representación del missing y no sustituye el valor real por cero.

  2. Mucho cuidadito con la opción missing:

    data uno;
    do i=1 to 100;
    x=ranpoi(8,45)/(rand(“uniform”)>0.25)*100;
    y=ranbin(5,5,.7)/(rand(“uniform”)>0.60)/10;
    output;
    end;
    run;

    options missing=0;

    ods listing;
    proc means data=uno sum n;
    var x;
    quit;

    Te hará la media sobre todos los valores que no son perdidos. No recomiendo utilizar missing=0. Aunque tú veas un 0 SAS interpreta que es un valor perdido.

  3. Si, si, lo se, es lo que decía al final de que solo cambia la representación y no sustituye el valor real. El caso en el que me está siendo útil a mi es para volcar una tabla a txt que sirve de input para un proceso en C++, la estructura es una matriz de cajas que se construye “pegando” tablas con distintas variables en sas, al hacer esto las partes de la matriz que estamos construyendo que van a ser cero se construyen como missing, sin embargo con esta opción las volcamos directamente a txt como ceros consiguiendo la estructura deseada. No se si me explico…
    Está claro que hay que manejarla con mucho cuidado, los que hemos manejado variables del tipo “Ha ocurrido el evento n veces en los últimos x meses” sabemos la importancia de distinguir entre 0 y missing… ;)

  4. Hola.
    Y si solo quisiera que los valores missing se transformasen en 0 en una columna especifica y no en toda la tabla?

    gracias.

  5. Pues tan fácil como coger solo lo que genera una iteración de esa macro… También puedes usar la función missing:
    if missing(variable) then do;
    variable=0;
    end;

  6. Rvaquerizo, mil millones de gracias. la he usado justo al reves, para sustituir todos los 0 por . y me ha salvado de escribir codigo de 160 ifn…

    Gracias.

  7. Muchas gracias por todos estos trucos, son bastante útilies.

    Una pregunta, si en mi conjunto de variables tengo un grupo de ellas que son categóricas y deseo convertir los missing a cero en las variables que no son categóricas, teniendo en cuenta que mi grupo total de variables es mayor a 1000. Como hago esto sin modificar las variables categóricas?

  8. Hice una pequeña adecuación, para cambiar únicamente algunas variables, sin embargo antes de ejecutarlo se tiene que preparar la base poniendo un prefijo a todas las variables seleccionadas ejem. LOG_VARIABLE_1, LOG_VARIABLE_2, etc.

    y se sustituye “_numeric_” por “LOG_: ”

    %macro hazceros;
    drop _i_;
    array _c_(*) LOG: ;
    do _i_=1 to dim(_c_);
    if _c_(_i_)=. then _c_(_i_)=0;
    end;
    %mend;
    data DAMAS_5_SEG_V3_4;
    set DAMAS_5_SEG_V3_4;
    %hazceros;
    run;

  9. Hice una pequeña adecuación, para cambiar únicamente algunas variables, sin embargo antes de ejecutarlo se tiene que preparar la base poniendo un prefijo a todas las variables seleccionadas ejem. LOG_VARIABLE_1, LOG_VARIABLE_2, etc.

    y se sustituye “_numeric_” por “LOG_: ”

    %macro hazceros;
    drop _i_;
    array _c_(*) LOG_: ;
    do _i_=1 to dim(_c_);
    if _c_(_i_)=. then _c_(_i_)=0;
    end;
    %mend;*EJEMPLO DE USO;
    data uno;
    set uno;
    %hazceros;
    run;

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *