Lectura para el fin de semana
Cada vez me caen mejor estos de Minequest y llevo un tiempo siguiendo el blog de Adventures in Consulting.
Me voy a dar de comer a mi león.
Cada vez me caen mejor estos de Minequest y llevo un tiempo siguiendo el blog de Adventures in Consulting.
Me voy a dar de comer a mi león.
Sigo con una hipotética migración de SAS a WPS. Fundamental, ¿qué sucede cuando leo tablas SAS? ¿Puedo leerlas, al fin y al cabo son propietarias? Ningún problema, podemos leer perfectamente tablas SAS. Si trabajamos en una librería con tablas SAS los ficheros generados serán .sas7bdat sin embargo si trabajamos en una librería sin tablas SAS los archivos generados serán .wpd; esto nos facilita trabajar conjuntamente con WPS y SAS, esto nos facilita una hipotética migración de aplicaciones. Curiosamente una tabla .wpd es ligeramente más pequeña. Por supuesto compress=yes no es problema y WPS nos permite comprimir tablas.
Poco a poco comienzo a trabajar con el clónico de SAS WPS. Estoy trabajando con la versión 2.3.5. De momento las impresiones no pueden ser mejores. El interfaz me recuerda a Enterprise Guide, trabajamos con proyectos que pueden estar compuestos de scripts (códigos de SAS) o ficheros. En cuanto al interfaz tenemos un navegador de proyectos para explorar los elementos que añadimos. Acompaña a este explorador una ventana de propiedades del proyecto. En la parte central podemos ver los scripts o los ficheros que añadimos. Me ha gustado el poder linkar los ficheros añadidos al proyecto a la aplicación del sistema asociada al fichero, me explico, si añades una hoja de cálculo ésta se abre en el proyecto de WPS con el programa asociado a ella. Otra de las ventanas está organizada en pestañas, una de ellas dispone del log y los resultados, otra un «server explorer» similar al explorador de SAS Base y una pestaña de progreso. Por último disponemos de otro navegador de procedimientos, resultados o log de ejecuciones al que particularmente no le encuentro mucho interés.
Tocada de narices a SAS por parte de WPS:
A BLIGHTY BASED software outfit that is being sued by a big US company in a bid to shut it down has just scored a win with IBM.World Programming’s WPS software has been approved as ready for IBM’s Linux on its system z mainframes.
World Programming (WP) is being sued because its software supports the American software giant SAS Institute’s Statistical Analysis System (SAS) programming language. The nod from IBM means that users’ programs written using the SAS language can be run under Linux on IBM system z mainframes.
Vamos a estudiar como funciona CASE en un PROC SQL. Son palabras que aparecen en las búsquedas de Google y también he observado que el número de visitas al blog ha descendido en los últimos días y no sólo es debido a las vacaciones navideñas. El 60% de los clicks a AyD vienen por temas de SAS y en los últimos días tengo muy olvidados los mensajes de esta categoría. Además en el plazo de 2 días voy a dejar de trabajar con esta herramienta por lo que, es posible, que se reduzcan aun más. En fin, a lo que voy, CASE en el PROC SQL. Case nos permite crear campos condicionales dentro del bloque SELECT de una query de PROC SQL:
Estoy ayudando a unos colegas a migrar de SAS a R. Están lejos, en un país de vino y carne al que alguna vez he de ir. Hemos quedado en que si alguna vez borran el último de sus SAS del disco duro, los ayudo gratis. Si no, cuando vaya, me tendrán que pagar hasta el último peso en lifaras y libaciones.
Tienen procesos que ejecutaban en SAS. Algunos los iban reescribiendo en R. Se sienten más cómodos en SAS pero cuando éste se queda corto, recurren a R. Es una aproximación «todo o nada».
Hace unos meses padecí (eso sí, brevemente) un proyecto que consistía en la migración de cierto código en SAS (¡nos lo pasaron como un documento de 20 hojas de Word!) a otro lenguaje de programación.
Esencialmente, desde la nueva plataforma habrían de lanzarse consultas a cierta base de datos (cuando el código SAS permitiese resolver los cálculos como una consulta de SQL) y procesarse los resultados procedimentalmente desde el nuevo lenguaje de programación cuando SQL ,declarativo, no fuese suficiente. Surgió el problema de que el lenguaje procedimental era incapaz de procesar bloques tan grandes de información. Pero ésa es otra historia.
Muy rápido, para identificar registros duplicados existen múltiples formas. Seguramente haré un monográfico sobre este tema pero de momento dejo una píldora:
data aleatorio;
do i=1 to 100000;
id=ranpoi(23456,56781);
if ranuni(5)>=0.3 then output;
end;
run;
proc sql;
create table repes (where=(rep>1)) as select
id, count(id) as rep
from aleatorio
group by 1;
quit;
proc sql;
create table repes (where=(rep=1)) as select
id, count(id) as rep
from aleatorio
group by 1;
quit;
Contamos registros y empleamos where como opción de escritura. Muy fácil y perfectamente entendible. No puedo entretenerme más que mi hija me reclama…
Hacía mucho tiempo que no me daba una vuelta por TIOBE para conocer los lenguajes de programación más populares. Este estudio se realiza mensualmente y la verdad es que he encontrado pocos cambios con respecto a 2008. De los lenguajes que se tratan en este blog tenemos en el puesto 15 a SAS y en el puesto 30 a R. Vemos pocas cosas de Visual Basic y hemos rozado el PL/SQL. Debería de empezar a trabajar con MATLAB y Python.
Un truco SAS muy rápido y que a algún compañero le ha venido muy bien y por eso lo pongo. La macro variable & sysjobid nos idenfica el job de Unix que está corriendo en ese momento. Es una macro del sistema y se haya en el diccionario de macros de SAS. Tenemos una vista en SASHELP VMACRO de cuales son estas macros AUTOMATIC. Curiosead SASHELP, tiene algunas vistas muy interesantes, creo que ya he comentado algo sonbre ellas.
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.
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.
A continuación os planteo como truco SAS una duda que nos mandaba LILIANA. Ella necesitaba estudiar los valores perdidos de las tablas de una librería determinada. En este caso vamos a estudiar los missing de las variables numéricas de una librería, de forma análoga se puede hacer con las alfanuméricas. Como siempre vamos a trabajar con un ejemplo que parte de tablas generadas aleatoriamente. Comenzamos generando estas tablas:
libname datos "c:\temp\datos";
%macro aleatorios;
%do i=1 %to 5;
data datos.proyecto_&i.;
do id=1 to 200;
if int(ranuni(0)*10) = 2 then importe1=.;
else importe1=round(rand("uniform")*1000,.1);
if int(ranuni(0)*10) > 0.3 then importe2=.;
else importe2=round(rand("uniform")*130,.1);
length zona $15.;
if ranuni(0) <=.32 then zona=“España”;
else if ranuni(1) <= 0.32 then zona=“Cataluña”;
else zona=“Resto”;