SAS

En MERGE, ¿mejor IF o WHERE?

Cuando programo en SAS algún paso data como unión con MERGE a modo de filtro empleo habitualmente IF en vez de WHERE. ¿El motivo? Mejor lo vemos en ejemplos. Voy a generar dos datasets aleatorios de 2 millones de registros cada uno. Tendrán un campo autonumérico y un campo aleatorio que toma valores entre 0 y 1:

options fullstimer;

data uno;

do i = 1 to 2000000;

aleatorio1=ranuni(9);

output;

end;

run;

data dos;

do i = 1 to 2000000;

aleatorio2=ranuni(2);

output;

end;

run;

Empleamos la opción fullstimer de SAS que nos ofrece unas estadísticas más detalladas de cada ejecución en el log, fundamentalmente nos interesa el tiempo real de ejecución. Los datasets aleatorios tienen las mismas observaciones y una estructura muy parecida. La idea es comparar el uso de IF frente a WHERE en un MERGE. Realizamos uniones horizontales entre ambas tablas y filtraremos sólo las observaciones con un valor del autonumérico i par, lo haremos de 3 formas pofibles y analizaremos el log:

Truco SAS. Transformación EBCDIC (Mainframe)

Hay ocasiones en las que tenemos que leer directamente de entornos Mainframe ficheros DB2, conocemos la estructura de esos ficheros y necesitamos leerlos vía FTP. Para ello tenemos que tener en cuenta la transformación EBCDIC (Extended Binary Coded Decimal Interchange Code ) a ASCII (American Standard Code for Information Interchange), esta transformación requiere las siguientes equivalencias entre formatos:

  • Decimales empaquetados: PD5. -> S370FPD5.
  • Enteros binarios: IB5. -> S370FIB5.
  • Caracter: 5. ->EBCDIC5.
  • Numérico con 0: Z5. -> S370FZDU5.

De modo que para leer el fichero del Mainframe haremos:

Subconjuntos de variables con DROP/KEEP

Me han llegado algunas cuestiones sobre el uso de DROP/KEEP y a raiz de ello me he decidido a hacer un mensaje sencillo para que los usuarios menos avanzados de SAS puedan entender su funcionamiento. Sé que muchos lectores son expertos programadores pero también es necesario tener un rincón con código SAS menos avanzado para aquellos que se estén acercando a esta programación. En este caso partimos de una tabla de datos aleatorios con 102 variables y 10.000 observaciones que generamos mediante el siguiente programa SAS:

Trucos SAS. Muestreo con PROC SURVEYSELECT

Hace varios días planteamos algún truco SAS para la realización de muestras aleatorias. Hoy planteo otro truco para lo mismo pero empleando el procedimiento de SAS SURVEYSELECT. Este procedimiento lo tenemos en el módulo STAT y tiene una sintaxis muy sencilla. Además nos permite realizar muestreos estratificados de forma muy sencilla, mediante pasos data el muestreo estratificado se complica. Como es habitual vemos varios ejemplos partiendo de una tabla SAS aleatoria:

Oracle y SAS vía SQL pass trough

Para trabajar directamente con el motor de BBDD SAS cuenta con «Pass trougth». SAS crea una conexión al gestor de BBDD y desde ese momento podemos ejecutar sentencias de SQL directamente. Para seguir con la línea de trabajo habitual emplearemos ejemplos para conocer su funcionamiento. Los ejemplos que vamos a emplear serán sobre una BBDD Oracle ya que es muy común trabajar en entornos SAS con acceso a algún datamart de Oracle. Evidentemente la utilidad pass trough o pas thru convive perfectamente con

Integración de R con SAS, SPSS y otros

R, SAS

Recientemente se publicó en este blog una entrada haciendo mención a la futura integración de R en SAS. Existe, de hecho, un procedimiento artesanal de lanzar procesos de R desde SAS basado en la posibilidad de realizar llamadas al sistema operativo desde SAS. No obstante, SAS ha decidido ahondar en dicha integración y proporcionale un marchamo corporativo.

Sin embargo, esta iniciativa dista mucho de ser la pionera y merce la pena lanzar una mirada panorámica al mercado. Por ejemplo:

Trucos SAS. Pasar de caracter a numérico y viceversa

Llega un gran número de visitas a AyD buscando como transformar en SAS variables caracter a numéricas y viceversa. Pero estas visitas están muy poco tiempo y me he planteado que los mensajes que hay dedicados al uso de PUT e INPUT no son claros. Por este motivo planteo un truco SAS de transformación de variables muy corto y concreto. Como es habitual lo vemos con ejemplos:

Transformar de caracter a numérico:

SAS comienza a fijarse en R

Interesante nocicia leída en ComputerWorld:

SAS amplía las opciones de análisis avanzado para sus clientes con la nueva interfaz de software estadístico de código abierto R. La integración inicial de R en SAS estará incluida en SAS/IML Studio 3.2 (antes SAS Stat Studio) este verano.

Fiel a su filosofía de escuchar a los clientes y dar respuesta a sus necesidades cambiantes, política que le han proporcionado a la compañía 33 años de crecimiento ininterrumpido, SAS da un paso más y anuncia la introducción del código R dentro del entorno de SAS. De esta forma, los desarrolladores de modelos estadísticos tendrán más opciones para extraer valor de los datos, usando la gran variedad de métodos ofrecidos por SAS a la vez que experimentan con nuevos métodos todavía no implementados en SAS con la interfaz R.

Trucos SAS. Muestras aleatorias con y sin reemplazamiento

Un ejemplo típico de SAS pero que creo que puede ayudar a conocer algunas funciones de SAS. Los ejemplos que planteo a continuación crean un dataset con 10.000 observaciones y sobre él vamos a crear dos subconjuntos de datos, dos muestras aleatorias del dataset de partida, una muestra sin reemplazamiento y otra muestra con reemplazamiento. Son dos ejemplos muy sencillos. Como siempre creo un dataset de forma aleatoria que me sirve de base para plantearos el truco:

Entrevista a Jim Goodnight fundador de SAS

Interesante entrevista a Jim Goodnight CEO y co-fundador de de SAS. A SAS no parece afectarle la crisis que están sufriendo los más importantes bancos del mundo. Se están adaptando a la nueva demanda de software para el fraude y riesgos crediticios. También están haciendo un guiño a la optimización de precios. Con estas medidas SAS no se plantea despidos siempre y cuando la recesión no empeore…

SAS Global Forum 2009

Ya tenéis disponibles los «paper» del SAS Global Forum 2009. Echadle un vistazo porque siempre merecen la pena.

Por otro lado se creó un blog donde tenéis algunas entrevistas todo muy típico y tópico, al fin y al cabo se trata de vender las excelencias de esta herramienta tan cara. Pero creo que la entrevista a Mike Thomas sobre plataformas móviles de información me ha despertado mucha curiosidad. Hay que reinventar el BI, es un concepto bastante obsoleto y las comunicaciones móviles pueden ser una buena base.

Macros SAS. Tramificar en función de una variable respuesta

Sobre la idea de “dumificar” variables he ideado un proceso para agrupar variables cuantitativas en función de una variable respuesta. Los que disponéis de herramientas de análisis más complejas tipo Enterprise Miner o Clementine ya disponéis de algoritmos y funciones que realizan esta útil tarea, además los árboles pueden trabajar con variables continuas. Pero un modelo es bueno si las variables de entrada están bien elegidas y bien construidas y como paso previo al análisis multivariante el análisis univariable es imprescindible. Tramificar una variable continua en función de una variable respuesta no va más allá de un análisis univariante, igualmente podemos tener dependencia lineal entre variables, algo que sólo detectaremos con análisis multivariables. Pero este sencillo algoritmo puede ayudarnos a conocer mejor algunas variables que deseamos introducir en nuestro modelo.

Trucos SAS. Variables dummy de una variable continua

Dumificar es crear variables dummy. Un verbo completamente inventado pero que todos los que os habéis enfrentado a la creación de una tabla de entrada para realizar modelos estadísticos vais a entender perfectamente en que consiste. Dumificar es transformar una variable continua en N variables dicotómicas. Lo entenderemos mejor con un ejemplo gráfico:

dumificar.JPG

En el ejemplo partimos de 8 registros y creamos 4 variables dicotómicas en función de una variable importe. Hemos dumificado la variable importe en 4. Parece fácil de entender el concepto. Bien, pues esto es lo que planteo hacer con SAS. La metodología que voy a emplear es la de siempre, parto de un dataset aleatorio con un identificador y un campo importe que pretendemos transformar en 5 variables (0,1). Para realizar este proceso necesitamos una macro que cuenta las observaciones de un dataset, ya la planteé con anterioridad en otro artículo del blog. De todos modos os dejo completo el código que empieza: