Trucos SAS. Eliminar etiquetas en los conjunto de datos SAS

Hoy planteo un ejemplo de uso de las vistas de SASHELP con los nombres de las columnas de una tabla SAS. Además, sirve para conocer mejor el PROC DATASETS y la creación de macrovariables con el PROC SQL. Una macro que no es de mucha utilidad, pero con la que podemos empezar a aproximarnos al lenguaje macro de SAS: %macro sinetiquetas(conj); data _null_; if index("&conj.", ".") = 0 then x = "WORK"; else x = scan("&conj.", 1, "."); call symput('libreria', upcase(x)); if index("&conj.", ".") = 0 then y = "&conj."; else y = scan("&conj.", 2, "."); call symput('tabla', upcase(y)); run; proc sql noprint; select compress(name || "=''") into :l1 separated by " " from sashelp.vcolumn where libname = "&libreria." and memname = "&tabla."; quit; proc datasets lib=&libreria. nolist; modify &tabla.; label &l1.; run; quit; %mend; Primero buscamos con un paso DATA si es una tabla temporal o permanente. Creamos una macrovariable con los nombres de las variables preparadas para eliminar etiquetas (var1=''). Las etiquetas las quitamos con DATASETS y MODIFY. La macro sólo necesita como parámetro la tabla sobre la que deseamos eliminar las etiquetas. A pesar de ser un truco fácil, seguro que más de uno se precompila esta macro en sus sesiones SAS. Saludos.

17 de agosto de 2009 · rvaquerizo

Lecciones de Economía de un ignorante. La crisis ha tocado fondo, luego escarbará

Inicio hoy una serie de pensamientos económicos de «botellín y amigos en la barra de un bar». Desde el punto de vista de un ignorante, todo parece más fácil. Resulta que en elconfidencial.com aparece esta noticia. Resulta que el BCE dice que la crisis ha tocado fondo. Éstos son los mismos que en 2001 bajaron los tipos, en 2007 los subieron de golpe y en 2008–2009 los bajaron a toda prisa. Y el ahora escribiente se va a fiar de lo que digan. Estamos metiendo pasta al sistema a base de dinero público para reflotar empresas deficitarias y sólo con esas medidas ya está todo apañado: tocamos el fondo de la crisis. A este paso, en realidad no hubo crisis. ...

13 de agosto de 2009 · rvaquerizo

Los objetivos del primer año de vida de Zurich Connect

Hace cosa de un año hice mención al nacimiento de Zurich Connect. Su Director General tenía claros los objetivos de esta nueva compañía: 80.000 pólizas in un año, ¡con un par! Buena campaña de comunicación, «call center» muy profesional y un buen equipo directivo. Pero, ¡¿80.000 pólizas?! Un poco demasiado optimista, sobre todo in un mercado donde tenemos a Clickseguros, Balumba, Línea Directa Aseguradora, Génesis, Direct… In fin, desconozco los resultados «reales» de Zurich Connect in este primer año, pero me he pasado por ICEA y me he descargado los datos del ramo de no vida de enero a junio de 2008 y enero a junio de 2009. El total de Zurich ha pasado de 777 mill in primas a 734. Con esto ya os digo que no han hecho 80.000 pólizas. ...

13 de agosto de 2009 · rvaquerizo

Equivalencias entre PROC SQL y DATA en las uniones de tablas SAS

Muchos de los que llegan a programar con SAS son grandes expertos en SQL. Cuando dominas perfectamente un lenguaje, es difícil acostumbrarse a otro. Por ello, quiero plantear un artículo que estudie los tipos de uniones mediante pasos DATA y su análogo con el PROC SQL. Con ello espero que los profesionales que manejan el lenguaje SQL entiendan mejor el paso DATA. En mi línea habitual, creo dos datasets y manejo ejemplos. ...

12 de agosto de 2009 · rvaquerizo

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 con ejemplos. Voy a generar dos datasets aleatorios de dos 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. ...

11 de agosto de 2009 · rvaquerizo

IBM compra SPSS

La noticia es de hoy. Los grandes vendedores de software y servicios quieren completar sus portafolios de productos. SPSS intentó extenderse a otras áreas del BI sin demasiado éxito. IBM hizo lo mismo en el área de la minería de datos. Incluso corrieron rumores de boda entre SAS y Teradata que quedaron en una propuesta de integración tecnológica. Quedan unos cuantos proveedores de soluciones de minería de datos independientes. Sus accionistas deben de estar frotándose las manos.

28 de julio de 2009 · cgbellosta

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. Carácter: $5. -> $EBCDIC5. Numérico con ceros: Z5. -> S370FZDU5. De modo que para leer el fichero del Mainframe haremos: ...

15 de julio de 2009 · rvaquerizo

I Jornadas de usuarios de R en España

Me es grato anunciar que van a realizarse las primeras jornadas de usuarios de R en España. Van a tener lugar los días 26 y 27 de noviembre en la Universidad de Murcia. Como uno de los organizadores de las mismas, me gustaría invitar a usuarios de R de todos los ámbitos (academia, banca, centros de investigación, hospitales, etc.) a compartir experiencias, establecer vínculos con otros grupos, conocer a otros usuarios, asistir a charlas y debatir finalmente la creación de una organización de usuarios de R. ...

13 de julio de 2009 · cgbellosta

Subconjuntos de variables con DROP/KEEP

Me han llegado algunas cuestiones sobre el uso de DROP/KEEP y, a raíz 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: ...

2 de julio de 2009 · rvaquerizo

Sobre la historia de CART y rpart

Hace unos días conversábamos Raúl y yo sobre árboles de clasificación. En particular, hablábamos de CART, el algoritmo propietario de Salford Systems. Me intrigó saber cuál sería la diferencia entre dicho algoritmo y la alternativa existente en R, rpart. El autor de dicho paquete, Terry Therneau, tuvo la gentileza de ofrecer una introducción histórica al particular de la que ofrezco algunos fragmentos que traduzco yo mismo a continuación: … Tanto el programa comercial CART como la función rpart() están basados en el libro Classification and Regression Trees. Como lector y revisor de alguno de sus primeros borradores, llegué a dominar la materia. CART comenzó como un enorme programa en Fortran que escribió Jerry Friedman y que sirvió para contrastar las ideas contenidas en el libro. Tuve el código durante un tiempo y realicé algunos cambios, pero me resultó demasiado frustrante el trabajar con él. Fortran no es el lenguaje adecuado para un algoritmo recursivo… Salford Systems adquirió los derechos de dicho código e ignoro si alguna de las líneas originales permanecen en él todavía. Mantuve muchas conversaciones con su principal programador (hace 15 o 20 años) sobre procedimientos para hacerlo más eficiente, esencialmente un problema interesante de indexación óptima. ...

25 de junio de 2009 · cgbellosta