Archivo

Archivo para la Categoría "Programming"

Eliminando todos los data sets de una Librería SAS

noviembre 16, 2011 2 comentarios

La siguiente macro les permite eliminar todos los data set de una Librería:

%macro del_all_ds(lib=);
Proc datasets library = &lib kill memtype=data nodetails nolist;
quit;
%mend;
Ejemplo: %dell_all_ds(lib=Work);


Espero les sirva!
SASludos,
Alberto

Categorías:Programming

Calificando nuevas observaciones usando Proc FASTCLUS

noviembre 15, 2011 Deja un comentario

PROC FASTCLUS  se utilza para aplicar el algoritmo k-means para agrupamiento (cluster) de observaciones. Todas las observaciones en el data set de entrenamiento son asignadas a grupos basado en las variables incluidas en el data set. Calificar o puntuar nuevas observaciones puede ser todo un reto ya que las reglas de asignación dependen de los valores de las nuevas observaciones.

Lo anterior se puede lograr usando la opcion SEED en Proc FASTCLUS.

/*Grupos o clusters en el data set de entrenamiento */

%let indsn = input;  *data set the entrada (entrenamiento);
%let nclus = maxclus; *número de cluster-grupos a calcular usando k-means;
%let indvars = varlist; *lista de variables a utlizar en el proceso de agrupamiento;
%let valid = val_data; *data set que queremos califcar o puntuar;

proc fastclus data=&indsn maxclusters = &nclus outseed= clusterSeeds;
var &indvars;
run;

/*Puntuando el nuevo data set*/
proc fastclus data=&valid  out=&valid._scored seed = clusterSeeds maxclusters = &nclus maxiter = 0;
var &indvars;
run;

Referencia:
Data Preparation for Analytics Using SAS” By Gerhard Svolba, Gerhard Svolba, Ph.D.

SASludos,

Alberto

Categorías:Programming, Stat

Crear fecha con formato YYYYMM

noviembre 30, 2010 Deja un comentario

Existen muchas maneras de crear una fecha con un formato de año-mes o YYYYMM, la forma mas conocida es usar un formato para fechas predefinido por SAS junto con la función PUT y crear una nueva variable tipo caracter.

En algunos casos se desea mantener el formato númerico esta nueva variable. Aquí les dejo un ejemplo sencillo usando el data set sashelp.air:

 

data newair;

set sashelp.air;

newdate=year(date)*100 + month(date);

run;

 

SASludos,

Alberto

Categorías:Programming, Shorts

SAS y XML

marzo 24, 2010 Deja un comentario

Luego de un largo y merecido receso vuelvo con algunos tips que espero les facilite su día a día con SAS.En esta ocasión les voy a hablar sobre archivos XML y como SAS puede interactuar con ellos.

No pretendo dictar una cátedra sobre XML, para aquellos que quieran saber más sobre ellos pueden encontrarar en internet toda la información que necesitan y NO necesitan sobre este tema ;-)

Segun Wikipedia XML, siglas en inglés de Extensible Markup Language (lenguaje de marcas extensible) es hoy en dia el medio mas popular para intercambio de data. XML no es realmente un lenguaje en particular, sino una manera de definir lenguajes para diferentes necesidades. Algunos de estos lenguajes que usan XML para su definición son XHTML, SVG, MathML.
XML no ha nacido sólo para su aplicación en Internet, sino que se propone como un estándar para el intercambio de información estructurada entre diferentes plataformas. Se puede usar en bases de datos, editores de texto,hojas de cálculo, etc.

SAS ha provisto distinto metodos de lectura/escritura de archivos XML desde la version 8.2. Vamos a darle un vistazo a los mas populares:
-Libname XML

SAS posee su propio para motor lectura/escritura para XML. La gran diferencia entre este tipo de libreria y las demás (Base, Oracle, ODBC, etc) es que a punta a un solo archivo XML, es decir, cada archivo XML que desees crear debe tener asociado un Libname XML distinto (puedes usar el mismo Libname si deseas reemplazar el archivo).
Para que todos (los lectores de este post y mi persona) utilizemos el mismo archivo XML, vamos a empezar por crear uno y posteriormente vamos a leerlo desde SAS. Para nuestros ejemplos vamos a usar SASHELP.Class

Paso a Paso:

*1) Definimos nuestra liberia XML
- El nombre de la liberia es: xmlout
- Definimos el motor de la liberia que es: xml- El archivo a ser creado es class.xml en el directorio C:\ ;
Libname xmlout xml ‘C:\class.xml’;
*2) Simplemente usamos un Paso de Datos para crear nuestro primer XML. No pensaste que fuera tan fácil!!!;

data xmlout.class;
set sashelp.class;run;

Ahora hagamos doble click en nuestro recién creado archivo y podrán notar que es muy similar a HTML. Como les comente anteriormente, no voy a ir en detalle sobre la estructura del archivo, esa info la encuentran facilmente en la super autopista de la información.

Ahora vamos a leer nuestro archivo nuevamente en SAS. Me imagino que ya tienen idea de como es el proceso. En este particular podemos hacerlo de 2 maneras, ya que solo vamos a leer el archivo podemos utilizar el libname anterior o creamos uno nuevo.

data MyXMLClass;set xmlout.class;
run;

otra forma

Libname xmlin xml ‘C:\class.xml’;
data MyXMLClass;
set xmlin.class;
run;
Para determinar que hemos leído el archivo correctamente podemos usar el siguiente código:

proc print data=MyXMLClass;
run;
proc contents data=MyXMLClass;
run;

-ODSOtra manera de crear archivos XML sin necesidad de usar librerías es usando ODS. Abajo un ejemplo bastante sencillo

ods xml file=’C:\odsclass.xml’;
Data myxml;
set sashelp.class;
run;
ods xml close;

Al abrir este archivo podrán notar que el cuerpo del archivo es mas complejo,la estructura es jerárquica, posee información relacionada con el proc print y otra serie de datos que hacen que estan opción sea poco apropiada. Como ejercicio intente leer el archivo odsclass.xml usando una librería XML. Vieron los resultados?

Nota: si de verdad le quieren hacer la vida imposible a alguien que necesite leer un XML generado por ustedes, entonces utilicen la opcion del ODS, de lo contrario nunca la utilizen.

-XML mapper: Leyendo complejos archivos de XML.

En la vida real no siempre nos topamos con archivos rectangulares (del tipo usado para crear tablas) sino que a menudo nos encontramos con archivos que poseen estructuras con jerarquías muy complejas y debemos idearnos una forma de extraer la data que realmente necesitamos.

A partir de la versión 9.1, SAS provee una herramienta llamada XML mapper que nos ayuda a seleccionar sólo la data que necesitamos del el archivo XML. Para los que poseen SAS 9.1 o superior Si hacen click en Inicio -> Programas -> SAS deberían poder encontrar el SAS XML Mapper. Para la 8.2 creo que hay la opción de descargalo de SAS support.

El XML mapper los ayudara a crear un mapa del archivo con la data que necesitan, seguidamente deberan salvar dicho mapa en algun directorio para poder ser invocado desde SAS asi como sigue:


filename class ‘C:\class.xml’;
filename SXLEMAP ‘.map’;
libname MyClass xml xmlmap=SXLEMAP access=READONLY;

SASludos,

Alberto

Tip publicado en SAScommunity

enero 22, 2010 Deja un comentario
Tip sobre como leer eficientemente el nro de observaciones de un data set.

Categorías:Programming

Proc Sort nodup vs Proc sort Nodupkey

octubre 16, 2009 Deja un comentario
Una pregunta que es my frecuente entre usuarios de SAS y especialmente en entrevistas de trabajos es:Cuál es la diferencia entre Proc Sort nodup y Proc Sort nodupkey?

La respuesta esperada sería decir que Nodup (Noduprecs) elimina las observaciones o filas duplicadas comparando todas la variables en el data set mientras que Nodupkey las elimina basada en las variables utilizadas en la sentencia BY.

Lamentablemente debo decirles que esto no es 100% correcto.


Contrariamente a lo que se cree, cuando se usa la opción Nodup SAS no tiene manera de saber sobre estas observaciones o filas duplicadas a menos que éstas, por suerte, se encuentren en secuencia contigua en el data set.

Veamos el siguiente ejemplo de Nodup usando las fechas de las Ligas ganadas por el FC Barcelona, fíjense que el año 1993 esta repetido 2 veces pero no en secuencia contigua:

data Ej_nodup;
input liga $ equipo $ yyyy ;
cards;
LaLiga Barsa 1993
LaLiga Barsa 1991
LaLiga Barsa 1992
LaLiga Barsa 1993
;
Proc sort nodup data=Ej_nodup ;
by liga equipo;
run;
proc print;run;

Obs liga equipo yyyy
1 LaLiga Barsa 1993
2 LaLiga Barsa 1991
3 LaLiga Barsa 1992
4 LaLiga Barsa 1993

Como podrán haber detallado, la opción nodup no eliminó la observación repetida.

Veamos ahora este ejemplo con las observaciones repetidas en secuencia contigua:

data Ej_nodup;
input liga $ equipo $ yyyy ;
cards;
LaLiga Barsa 1993
LaLiga Barsa 1993
LaLiga Barsa 1991
LaLiga Barsa 1992
;

Proc sort nodup data=Ej_nodup ;
by liga equipo;
run;
proc print;run;

Obs liga equipo yyyy
1 LaLiga Barsa 1993
2 LaLiga Barsa 1991
3 LaLiga Barsa 1992

Ahora sí eliminó la observación duplicada debido a que se encontraban de forma contigua.

Si para el mismo ejemplo utilizamos la opción Nodupkey solo nos quedará una sola observación con la combinación de la sentencia BY

data Ej_nodupkey;
input liga $ equipo $ yyyy ;
cards;
LaLiga Barsa 1993
LaLiga Barsa 1993
LaLiga Barsa 1991
LaLiga Barsa 1992
;

Proc sort nodupkey data=Ej_nodupkey ;
by liga equipo;
run;
proc print;run;

Obs liga equipo yyyy
1 LaLiga Barsa 1993

Agregando la variable yyyy a lista BY estaríamos obteniendo el resultado deseado:

data Ej_nodupkey;
input liga $ equipo $ yyyy ;
cards;
LaLiga Barsa 1993
LaLiga Barsa 1993
LaLiga Barsa 1991
LaLiga Barsa 1992
;

Proc sort nodupkey data=Ej_nodupkey ;
by liga equipo yyyy;
run;
proc print;run;

Obs liga equipo yyyy
1 LaLiga Barsa 1991
2 LaLiga Barsa 1992
3 LaLiga Barsa 1993

Para finalizar este post, mi recomendación es siempre usar la opción Nodupkey.

SASludos,

Alberto

Categorías:Programming

Ejemplo: Diseño de Experimentos usando Proc Anova

octubre 13, 2009 Deja un comentario
Un pequeño ejemplo para algunos que me han preguntado como realizar un diseño de experimentos (DOE por sus siglas en inglés) usando SAS/STAT.

Para los que no lo saben SAS tiene su propio modulo de DOE con interfaz gráfica (Base SAS) que contiene una gran cantidad de diseños pre-establecidos. Para los humanos comunes como nosotros que solo tenemos el STAT exiten 2 procedimientos el ANOVA y GLM para llevar acabo este tipo de análisis.

En este ejemplo solo contiene el Proc ANOVA que solo debe ser usado cuando el diseño es balanceado.

Para aquellos que tienen el Montgomery de Diseño de Experimentos (la edición verde) es el ejemplo de la pág 219.

data montgomery_pag219;
do replica=1 to 3;
do catalizador=-1 to 1 by 2;
do reactivo=-1 to 1 by 2;
input y @; output;
end;
end;
end;
cards;
28 36 18 31
25 32 19 30
27 32 23 29
;

proc anova data=montgomery_pag219;
class reactivo catalizador;
model y= reactivo catalizador reactivo*catalizador;
run;

SASludos,

Alberto

Categorías:Programming, Shorts, Stat

Como desahabilitar por código en EG la salida automática en HTML

octubre 7, 2009 Deja un comentario
Esta es una pregunta que muchos usuarios de Enterprise Guide se hacen todos los días. La forma oficial de hacerlo es a tráves de la barra de Tools\Options y desmarcar la opción que genera automáticamente los reportes.

En este post les muestro como hacerlo mediante código:

Para desahabilitarlo usen la siguiente sentencia:

ODS HTML(ID=EGHTML) close;

Y para restituir el ODS pueden reiniciar la sesión o usar la siguiente sentencia:

ODS HTML(ID=EGHTML) FILE=EGHTML;

SASludos,

Alberto

Exportando las Abreviaciones

octubre 1, 2009 Deja un comentario

Para los que no lo saben una abreviación en SAS es una palabra clave que tipeada en el Editor de SAS es substituida por una cadena de texto mucho más grande. Se podría ver como una especie de shortcut.

Ciertamente esto es beneficioso cuando necesitamos escribir procedimientos que son repetitivos o incluso procedimientos que son poco usuales y que tenemos que recurrir a la Ayuda para recordar las sentencias básicas.

Por ejemplo, todos mi projectos en Enterprise Guide son creados utilizando una estructura de archivos predenida en un directorio específico en la red de esta manera:

Z:\\Proyectos\SAS\Proj001

En cada programa que necesita una librería para referenciar ese directorio tengo que escribir:

Libname Proj001 “Z:\\Proyectos\SAS\Proj001″;

No sería más fácil escribir _Lib o #Lib y presionando la tecla Tab automáticamente obtuviera la siguiente línea de código:

Libname Projnnn “Z:\\Proyectos\SAS\Projnnn”;

donde sólo debo cambiar nnn por el número de proyecto en el que estoy trabajando?

Con las Abreviaciones de SAS puedes hacer esto! solo imagina guardar dentro de un shortcut o abreviación ese tedioso procedimiento (en mi caso lo son Proc Datasets y Proc SurveySelect)
que siempre tienes que recurrir a la Ayuda para recordar la síntaxis.

Aquí te explico brevemente como hacerlo:


Para los que usan SAS Base:

1) Seleccionen el menu Tools y hagan click en Add Abbreviation

2) La siguiente ventana debería aparecer:

3) En el campo Abbreviation coloque el nombre de la abreviación que desean asignar al código. Mi recomendación es que usen un character clave como # al inicio, p.e. #Print o #Lib etc…

4)En el campo inferior copien y peguen el texto que SAS va a pegar en el editor cuando llamen a esa abreviación.
Una vez creada la abreviación solo deben ir al editor y tipearla, una pequeña ventana debería aparecer y solo debe presionar la tecla TAB para que su código o txto aparezca en el editor.

Para los que usan Enterprise Guide es exactamente el mismo proceso, solo que deben buscar en el menu Code para EG4.1 o en el menu Program para EG4.2

Ahora bien, la finalidad de este post era explicarle como exportalas para poder compartirla con otros usuarios. Para esto deben ir al Menu correspondiente con su versión de SAS o EG y hacer click en Keyboard Macros o Macro Editor y posteriormente hacer click en Macros, allí se desplegará una ventana donde les permitira exportar sus abreviaciones.

No olviden seleccionarlas todas antes de exportarlas o tendrán que hacerlo una a una!

SASludos,

Alberto

Categorías:Programming, Shorts

Fundamentos de SAS

septiembre 17, 2009 2 comentarios
Conseguí una pequeña presentacion de 30 slides que escribí hace como 5 ó 6 años que contiene una introducción básica a SAS. Esta diseñada para Base SAS pero es 100% aplicable a EG.

La presentación está en el área de archivos del Google group.

SASludos,

Alberto

Categorías:Programming, Shorts
Seguir

Get every new post delivered to your Inbox.