Trucos SAS. Trasponer con SQL para torpes

Trasponer datos con SAS es un tema que genera un gran número de consultas en Google, por lo tanto genera un gran número de visitas a este blog. Ya hay un monográfico al respecto pero hoy quería volver a contar la trasposición de datos con SQL y SAS pero a un nivel más bajo para que sea lo más sencillo posible. En el ejemplo partimos de una tabla con 3 variables, un id_cliente, un campo tipo y un campo precio. Cada tipo tiene un precio y necesitamos que nuestro dataset tenga un registro por id_cliente y 3 precios, uno por cada tipo. El ejemplo en código SAS: ...

21 de noviembre de 2011 · rvaquerizo

Trucos SAS. Operaciones con tablas de dimensiones con SAS

Algunos llaman a las tablas de dimensiones tablas de lookup, yo me niego. Con SAS ya hemos visto como crear cruces de tablas de dimensiones con tablas de hechos a través de formatos, bajo mi punto de vista el método más eficiente. Pero hoy quería traeros un ejemplo de cruce de tabla pequeña con tabla grande a través de arrays multidimensionales con SAS. Se trata de guardar los valores de la tabla pequeña en un array temporal multidimensional cuando leemos la tabla grande. Para ilustrar esta tarea he preparado un ejemplo: ...

25 de octubre de 2011 · rvaquerizo

Números aleatorios con SAS

En un sólo paso DATA quiero mostraros las funciones más habituales para generar números aleatorios con SAS. Una entrada para que os copiéis el código y lo analicéis con SAS. Quiero que sirva de guía para que recordéis las funciones más empleadas, además será muy útil para los que se estén iniciando en el uso de SAS: ```sas data aleatorios; drop a b raiz n p; raiz=20; do i=1 to 2000; * DISTRIBUCIÓN UNIFORME; uniforme = ranuni(raiz); * ALEATORIO ENTRE 2 NUMEROS; a=2; b=10; aleatorio_entre = a+(b-a)*ranuni(raiz); * NORMAL(0,1); normal = rannor(raiz); * NORMAL(a,b); normal_a_b = b*rannor(raiz)+a; * POISSON MEDIA a; poisson = ranpoi(raiz,a); *BINOMIAL TAMAÑO n Y PROBABILIDAD p; n=10; p=0.5; binomial_n_p = ranbin(raiz,n,p); * EXPONENCIAL 1; exponencial_1 = ranexp(raiz); * GAMMA(a); gamma_l = rangam(raiz,a); * VALORES ALEATORIOS ENTRE 1 Y 5 CON PROBABILIDADES p1 p2 ...; valores = rantbl(raiz,0.3,0.1,0.2,0.2,0.6); output; end;run;

27 de agosto de 2011 · rvaquerizo

Paquete sas7bdat de R. Me pongo con ello

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. ...

26 de julio de 2011 · rvaquerizo

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.

16 de julio de 2011 · rvaquerizo

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: Truco SAS. Uso de FILENAME y PIPE Macros SAS: Asignar permisos en Unix 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. ...

15 de julio de 2011 · rvaquerizo

Á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: ...

12 de julio de 2011 · rvaquerizo

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: ...

28 de junio de 2011 · rvaquerizo

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 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: ...

10 de junio de 2011 · rvaquerizo

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: ...

29 de mayo de 2011 · rvaquerizo