SAS

Truco SAS. Retrasar una ejecución con SLEEP

El método más sencillo para ejecutar SAS a una hora determinada es el empleo de la función SLEEP:

data _null_;
    momento = "03OCT2013:10:07"dt;
    duerme_hasta = sleep(momento - datetime(), 1);
run;

Un truco muy sencillo que da respuesta a una duda planteada en el blog. Pensé que ya existía esta entrada. Saludos.

Truco SAS. Elminar retornos de carro o saltos de línea engorrosos

Cuando tenemos saltos de línea o retornos de carro que nos dificultan las lecturas de ficheros de texto podemos leer caracter a caracter con SAS y elminar esos caracteres incómodos.

data _null_;
length char 1.;
infile 'C:\fichero_de_entrada.TXT'  lrecl=1 recfm=F missover dsd;
file 'C:\fichero_de_entrada_depurado.TXT'  lrecl=1 recfm=F;
input charASCII.;
if rank(char) = 13 /*SI ES WIN PONER EL 13*/ then char= "";
put char;
run;

Recomiendo no sobreescribir el fichero de texto y crear otro «depurado». Tendréis este problema cuando vuestro programa SAS os lea menos observaciones de las esperadas. Esto suele pasar cuando trabajamos con archivos de distintos sistemas operativos, como por ejemplo cuando leemos un archivo de texto unix con una máquina windows. Saludo.

Truco SAS. Unir todas las hojas de un Excel en una

Empleamos LIBNAME con SAS para acceder a Excel. Es un truco con limitaciones y que se tiene que ir mejorando a futuro. Se trata de leer todas las hojas de un libro Excel y pegarlas horizontalmente en otra hoja QUE NO DEBE EXISTIR PREVIAMENTE. La macro es la siguiente, no se acompaña de un ejemplo de uso debido a su sencillez:

%macro une_excel(ubicacion, nombre_union);
libname selec &ubicacion.

proc sql noprint;
select "SELEC.'"||memname||"'n" into:lista_excel separated by " "
from dictionary.members
where libname = "SELEC";
quit;

data SELEC.&nombre_union.;
set &lista_excel.;
run;

libname selec clear;
%mend;

%une_excel("C:\TEMP\unir_excel2\unidos.xlsx", todas);

Creamos una librería SAS a un libro Excel determinado. Leemos con DICTIONARY las hojas que tiene dicho libro y las unimos en una hoja de ese libro al que será la última. Como buena costumbre el desasignamos la librería con LIBNAME CLEAR. Como se ha indicado antes tiene limitaciones, por ejemplo no debe existir la hoja final con la unión. Pero es un buen ejemplo de uso de LIBNAME + EXCEL y DISTIONARY. Saludos.

Dividir en palabras un texto con SAS

Una duda que planteó una lectora del blog acerca de separar una cadena de caracteres separados por comas y crear observaciones en otra variable:
Hola! he buscado por toda la página, necesito ayuda urgente. Mi problema es el siguiente.

Necesito separar una cadena de texto en una fila en varias filas, por ejemplo

cadena1,cadena2,cadena3

en

cadena1
cadena2
cadena3

para encontrar la ‘ , ‘ utilizo scan, aunque podría ocupar anypunct para que encuentre la primera ‘ , ‘ luego la segunda ‘ , ‘ etc y cortar con substr, longth … pero bueno, ya que tengo un metodo de separar el texto de la fila como hago para que cada palabra este en una nueva fila? ojala me hayan entendido y me den una idea de como hacer eso en un proc sql, con una macro o como sea, solo una pequeña orientación me serviria mucho, gracias!!!!!

Truco SAS. SYSECHO para controlar las ejecuciones en Enterprise Guide

Un truco SAS que envió una lectora del blog. Se emplea en Enterprise Guide y nos permite conocer en que punto del código está nuestra ejecución. En Enterprise Guide si no somos muy ordenados con nuestros códigos podemos tener algún problema, en la pantalla de estado de las tareas tenemos un nombre de la tarea un estado, la posición en cola el servidor desde el que se ejecuta y el tipo de servidor para los momentos en los que trabajamos con múltiples servidores. Con _sysecho _lo que hacemos es ver el estado de la tarea. Ejemplo práctico a ejecutar:

Atentos a los intervalos de confianza

Un intervalo de confianza es la zona en la que me fío de lo que estimo. Cuanto más amplia es esa zona menos me fío de lo que estimo y cuanto más estrecha más me fío de lo que estimo. Lo que pasa es que un intervalo de confianza por definición empieza con la famosa expresión “ dada una población de media nu y desviación típica sigma…

¡¡¡FU FU FU FU FU FU!!!

Trucos SAS. Ordenar las variables de un dataset

Para cambiar el orden de las variables en un conjunto de datos SAS hemos de emplear RETAIN antes de SET. Este truco es la respuesta a una duda planteada en el blog. Un vistazo rápido al ejemplo entenderemos la sintaxis:

data datos;
do i=1 to 20;
importe1 = ranuni(8)*100;
importe2 = ranuni(3)*100;
importe3 = ranuni(1)*100;
id = put(i,z5.);
output;
end;
drop i;
run;

data datos_reordenados;
retain id importe3;
set datos;
run;

Como vemos RETAIN nos permite reordenar las variables del dataset independientemente del tipo de variable que estemos manejando. También podríamos emplear algún otro tipo de sentencia, pero es recomendable usar RETAIN, como vemos no es necesario poner el total de las variables. Saludos.

Analisis cluster con SAS. La importancia de las semillas en las k-medias

El PROC FASTCLUS en SAS nos permite realizar análisis de agrupamiento dirigido mediante el algoritmo de las k-medias. Este algoritmo tiene algunos problemas pero nos puede servir para agrupar de forma multivariante observaciones. Es rápido, sencillo de explicar y con algunas lagunas no funciona mal. Como aproximación a nuestras segmentaciones puede ser muy práctico. Hoy se va a utilizar para identificar a los clientes más complicados de segmentar, a aquellas observaciones que quedan en las zonas grises. (http://www.datanalytics.com/blog/2011/08/03/clustering-iii-sobresimplificacion/)
Estas zonas grises en muchos casos son más importantes que la segmentación en sí. Si estamos con un problema de taxonomía (clasificar especies) puede ser menos importante, pero si clasificamos inversiones, clientes,… ¿qué pasa con aquellos que no sabemos ubicar? Escribimos segmentar en un buscador y tenemos esta imagen:

Trucos SAS. Lista de variables missing

Duda que me plantearon ayer por la tarde. Dada una serie de variables determinar que registro tiene todas esas variables nulas. El truco que planteo puede servir para determinar incluso cuantos valores perdidos tiene esa lista de variables, ese truco me le reservo para otro día. El código lo acompaño con un ejemplo para que se pueda ejecutar y analizar su funcionamiento:

data aleatorio;
do i=1 to 20000;
aleat1=sqrt(rannor(45));
aleat2=sqrt(rannor(5));
aleat3=sqrt(rannor(4));
aleat4=sqrt(rannor(450));
aleat5=sqrt(rannor(40));
output;
end;
run;

data fila_nula;
set aleatorio;
nulo=0;
array varib(*) aleat1--aleat5;
do j=1 to dim(varib);
if not missing(varib(j)) then nulo=i;
end;
drop j;
if nulo=0;
run;

Muy sencillo el truco. Si se encuentra alguna variable que no es nula la variable nulo ya no toma valor 0. Espero que os sea de utilidad. Saludos.

Truco SAS. Limpiar un fichero de texto con SAS

El otro día me llegó al correo la siguiente cuestión acerca de caracteres extraños en un fichero de texto y la importación a SAS:

Tengo un problema a la hora de importar a SAS un fichero txt.
El caso es que tiene en algunos registros el carácter «flechita».
Ejemplo: Calle Paseo de la Castellana «flechita» 60.
Cuando lo importo como carácter para al llegar a la flechita.
No se sí podrás ayudarme.
Muchas gracias por adelantado.

Trucos SAS. Medir la importancia de las variables en nuestro modelo de regresión logística

Hoy quería proponeros una forma poco ortodoxa de medir la importancia de las variables en un modelo de regresión logística con SAS. La cuestión es: dado un modelo de regresión logística crear un ranking con las variables más importantes dentro del modelo. Para esta tarea recomiendo el uso de random forest, pero puede ser imposible disponer de un software que realice este tipo de modelos. Imaginemos un caso concreto, disponemos de SAS STAT y nos da reparo trabajar con R. Para este caso podemos emplear el siguiente truco. El AIC (criterio de información de Akaike) es un estadístico que relaciona el cociente de la verosimilitud con el número de parámetros del modelo que ajustamos. Cuanto menor sea este cociente mejor será nuestro modelo. Si eliminamos una variable del modelo ¿cuánto empeora este modelo? Esa será la filosofía que emplearemos para analizar la importancia de las variables presentes en nuestro modelo. En la línea habitual hacemos un ejemplo para que podáis copiar y pegar en vuestro SAS:

Truco SAS. Ver el contenido de un formato

Para ver los valores que toma un formato con SAS tenemos que emplear el PROC FORMAT. La sintaxis es muy sencilla:

proc format
library = work.formats fmtlib;
select &formato.
run;

Tenéis que poner el nombre del formato sin punto. Sintaxis sencilla, pero difícil de recordar (por lo menos a mi me ha pasado). Saludos.

Macros SAS. Macro split para partir un conjunto de datos

Debido a problemas con un servidor hace años descubrí la macro Split. Básicamente lo que hace es partir un conjunto de datos SAS en múltiples conjuntos de datos SAS con el mismo número de observaciones, además lo hace en un solo paso data. La forma de particionar el conjunto de datos es muy simple, si alguien tiene dudas con el código que lo comente y lo analizamos mejor. La macro (mejorada) es: