Paquete sas7bdat de R. Me pongo con ello

R, SAS, WPS

En su día en esta bitácora se habló de la función sas7bdat de R. Ahora han realizado un paquete de R a partir de esa base. Lo tenéis en el blog SAS and R. De momento es experimental en el CRAN.

No solo me gustaría divulgar la noticia, en breve espero tener preparado un repaso al tema a ver si podemos «consolidar» este paquete tan interesante para los usuarios de SAS. También haré nuevas versiones de entradas anteriores para ilustrar el funcionamiento.

I concurso de análisis de datos con R

A pesar de tener la primicia (estoy de vacaciones y no leo habitualmente el correo de mi trabajo) soy el último en hacerse eco de la gran noticia de las III jornadas de R: El primer concurso de análisis de datos con R. Hay en total 1.500 € en premios que reparte el patrocinador del evento Nestoria. Nestoria es un motor de búsqueda de inmuebles que está presente en múltiples países.

Mi punto de vista sobre el concurso:

What about newer competition from free, open-source alternatives like R?

El tito Goodnight está más pendiente de IBM y Oracle que de R. Está mayor el hombre, pero sigue siendo un genio y un figura. Nunca ha sido mi jefe (no porque yo no quisiera) y no comparto ni una sola de las opiniones que tiene en la entrevista que le hacen pero hay que reconocer que no se ha equivocado mucho en 40 años porque es una de las fortunas más importantes del mundo. Así que le tendré en cuenta, al fin y al cabo llevo 10 años diciento que el futuro pasa por R y empiezo a cansarme, me estoy haciendo más dinosaurio día a día.

Trucos SAS. Más usos de INFILE y PIPE directorios en tablas SAS

Puede interesarnos tener directorios y subdirectorios en tablas SAS. Es decir, tabular el resultado de un lm en Unix o poner en una tabla el resultado de un dir de MS DOS / Windows. Ya tengo ejemplos publicados a este respecto:

Pero no está mal volver a poner un truco para analizar las posibilidades del INFILE + PIPE. Vamos a hacer un DIR de todo nuestro C:\ y sacar los archivos de mayor tamaño.

Árboles de decisión con SAS Base (con R por supuesto)

Con SAS Base podemos hacer árboles de decisión porque tenemos R. Así de sencillo. Vamos a utilizar SAS para gestionar nuestros datos y R será la herramienta que utilicemos para la realización del modelo de árbol de decisión. Posteriormente emplearemos las reglas generadas por el modelo para etiquetar a nuestros clientes en SAS. Con esta entrada pretendo ilustrar una serie de ejemplos en los que comunico SAS con R. Una herramienta nos sirve para el tratamiento de datos y la otra la utilizaremos para realizar modelos que no están al alcance de SAS. Para realizar esta comunicación SAS-R os planteo la creación en SAS de ficheros de texto con las instrucciones en R y la ejecución en modo batch de R con ese código creado en SAS. Aquí tenéis punto por punto el ejemplo:

Trucos Excel. Mapa de España por provincias (mejores versiones)

Nuestro lector Jose Antonio tiene una nueva versión del mapa de España por provincias con Excel. Mejores y más comprensibles macros, el problema de León y las Canarias solventados y aparecen Ceuta y Melilla.

mapa_espana_excelv3.png

En palabras del autor tenemos:

El libro contiene varios botones: uno para agrupartodas las formas en una sola y poder ampliar el mapa y otros tres para cambiar los colores, dos de ello en función de tramos de una variable (población de las provincias y población por provincias de edad de 0 a 4 años, datos obtenidos del INE padrón 2010), el último para poner todas las provincias en blanco). He creado un mapa nuevo porque el que tienes en la página presenta el problema de León que está en dos formas y es mejor una forma para manejarla con código. No me he preocupado mucho por el tema de la estética, la idea de este libro es presentar varias formas de manejar un mapa por código. Aparecen representadas las ciudades autónomas de Ceuta y Melilla pero si se mantienen las escalas apenas se ven los colores de relleno. Baleares, Las Palmas y Santa Cruz de Tenerife aparecen como grupos porque en la estadística del INE vienen con esta agrupación pero si se dispone de datos a nivel de cada isla se pueden deshacer los grupos.

Trucos SAS. La ventana LOG vacía o limpia

Duda que me trasmitieron hace tiempo. Necesito que no se genere salida en el log porque se llena y mi proceso da problemas. Con el PROC PRINTTO podemos hacer que nuestros procesos no generen salida en la ventana log. Para ello sólo tenemos que utilizar el siguiente código:

proc printto log='null'; quit;

Si deseamos volver a tener resultados en la ventana log sólo tenemos que hacer:

proc printto log=log; quit;

Con el PROC PRINTTO no sólo podemos dirigir el log a un fichero, también podemos dirigir el OUTPUT con la opción PRINT. Tenéis muchos ejemplos en la red acerca de este tema. Para limpiar el log también podemos emplear la instrucción DM:

UbiData

Ha nacido el portal UbiData, un portal para intercambiar datos entre la comunidad hispano hablante. En este enlace tenéis más información al respecto. Seguramente sea la principal fuente de datos de esta bitácora.

¿A qué esperas para darte de alta en la comunidad?

Trucos R. Llevar a SAS las reglas de un árbol de decisión

Vuelvo hoy con el uso de rpart para la creación de árboles de decisión con R. Pero hoy, además de realizar un modelo de árbol con R quiero presentaros una función que nos permite guardar las reglas generadas con nuestro modelo en un fichero de texto para su posterior utilización con SAS. Retomamos un ejemplo visto con anterioridad en la bitácora con ligeras modificaciones:

#Inventamos un objeto para realizar el modelo

#En una cartera de clientes nuestro modelo tiene que identificar

#cuales contratan un PVI

#

clientes=20000

saldo_vista=runif(clientes,0,1)*10000

saldo_ppi=(runif(clientes,0.1,0.2)*rpois(clientes,1))*100000

saldo_fondos=(runif(clientes,0.1,0.9)*(rpois(clientes,1)-1>0))*100000

edad=rpois(clientes,60)

datos_ini<-data.frame(cbind(saldo_vista,saldo_ppi,saldo_fondos,edad))

datos_inisaldo_ppi=(edad<=68)*datos_inisaldo_ppi

#Creamos la variable objetivo a partir de un potencial

datos_inipotencial=runif(1,0,1)+

(log(edad)/(log(68))/100) +

runif(1,0,0.001)*(saldo_vista>5000)+

runif(1,0,0.001)*(saldo_fondos>10000)+

runif(1,0,0.007)*(saldo_ppi>10000)-

runif(1,0,0.2)

datos_inipvi=as.factor((datos_inipotencial>=quantile(datos_inipotencial,

0.90))*1)

#

#Empleamos rpart para la realización del modelo

#

library(rpart)

arbol=rpart(as.factor(pvi)~edad+saldo_ppi+saldo_fondos,

data=datos_ini,method="anova",

control=rpart.control(minsplit=30, cp=0.0008) )

Tenemos un objeto rpart llamado arbol. En este punto necesitamos disponer de las reglas generadas por el modelo para SAS, donde el módulo específico para poder realizar determinados modelos tiene un precio muy alto. Buscando en Google encontraremos este link. En él tenemos una genial función de R list.rules.rpart que nos permite identificar las reglas que ha generado el modelo. Modificamos ligeramente esta función para que nos sirva en nuestros propósitos:

Trucos Excel. Mapa de España por provincias (mejorado)

mapa_espana_excelv2.png
Un nuevo mapa de España mejorado para Excel. Sobre la base del mapa ya publicado en esta bitácora un lector ha realizado una espectacular mejora. El compañero Daniel resume sus mejoras como:

  • Cambio en la provincia de León
  • Ponerle mar
  • Añadir la posibilidad de que se pueda rellenar por provincias (ahora se rellena vía la pestaña adjunta, no directamente sobre la primera)
  • Le he quitado también la cabecera y cambiado Canarias de puesto (por temas estéticos de la presentación que estoy preparando)

El resultado lo tenéis en este link. Y la verdad es que mejora mucho la primera versión. Ahora necesitamos que alguien nos plantee una combinación de 4 o 5 colores para este tipo de mapas, algo así como una escala de azules, escala de grises,…

Macros (fáciles) de SAS. Días de un mes en una fecha

Macro de SAS fácil y rápida que nos permite saber el número de días que tiene el mes de una fecha de SAS. La tenía para la automatización de un código que con una media y daba guerra cuando se trataba de un año bisiesto. 3 líneas de código:

%macro dias(fec);

((&fec-day(&fec)+1)+31-day((&fec-day(&fec)+1)+31))-(&fec-day(&fec))

%mend;

El razonamiento es sencillo. Se trata de poner a día 1 la fecha que le pasamos, irnos un mes después y hacer la diferencia. Por supuesto copiáis y pegáis el ejemplo en el editor:

Un repaso a los paquetes de R solaR, chron, directlabels y gráficos de densidades con lattice

Y además vamos a analizar si de verdad llueve más los fines de semana en Madrid. Hace tiempo que me gustaría estudiar la influencia de la contaminación en algunos fenómenos atmosféricos. Por supuesto no tengo tiempo para elaborar un estudio de ese tipo. La base de este estudio iba a ser el paquete solaR. Por otro lado quería elaborar un monográfico sobre el paquete chron que contiene funciones muy interesantes para el manejo de fechas. Sin tiempo es imposible, por ello nos vamos a acercar a estos dos paquetes con un ejemplo y de propina os presento directlabels otro paquete muy interesante para añadir etiquetas a nuestros gráficos.

Macros (fáciles) de SAS. Eliminar outliers en una variable

Hace tiempo ya os propuse una chapuza para eliminar outliers de forma multivariante. Por supuesto quedabaeliminar outliers en una variable. Recortar los valores extremos en aquellas variables cuantitativas que deseemos. Para ello os propongo una macro que no considero muy compleja y que os analizaré con mayor detalle, pero lo primero la macro al completo:

%macro elimina_outliers(

varib,  /*VARIABLE PARA ELIMINAR EL OUTLIER*/

entrada,/*DATASET DE ENTRADA*/

salida, /*DATASET DE SALIDA, PUEDE SER EL MISMO DE ENTRADA*/

corte_inferior, /*% DE CORTE INFERIOR*/

corte_superior);/*% DE CORTE SUPERIOR*/

*******************************************************************;

*CREAMOS LOS PERCENTILES;

data _null_;

call symput ("lim1",compress(0+&corte_inferior.));

call symput ("lim2",compress(100-&corte_superior.));

run;

*PREPARAMOS MV CON LOS NOMBRES QUE OBTENDREMOS DEL PROC UNIVARIATE;

data _null_;

call symput ('nom_lim1',compress("P_"||tranwrd("&lim1.",'.','_')));

call symput ('nom_lim2',compress("P_"||tranwrd("&lim2.",'.','_')));

run;

*EL UNIVARIATE GENERA UNA SALIDA SOLO CON LOS PERCENTILES DESEADOS;

proc univariate data=&entrada. noprint;

var &varib.;

output out=sal pctlpre=P_ pctlpts=&lim1.,&lim2.;

quit;

*CREAMOS MV CON LOS CORTES DESEADOS;

data _null_;

set sal;

call symput("inf",&nom_lim1.);

call symput("sup",&nom_lim2.);

run;

*REALIZAMOS EL FILTRO;

data &salida.;

set &entrada.;

if &varib.>&inf. and &varib.<&sup.;

run;

proc delete data=sal;run;

%mend;

Su ejemplo de uso correspondiente: