Archivo

Archivo para la Categoría "Programming"

Títulos coloridos con bcolor y color

septiembre 15, 2009 Deja un comentario

Estas fastidiado de los títulos y pie de página en negro? Con los atributos bcolor (para cambiar el color de fondo) y color
puedes cambiar la apariencia de los mismos.

A continuacion un breve tip de como hacerlo

title h=9pt bcolor=yellow color=red ‘title h=9pt bcolor=yellow color=red’;
footnote h=5pt bcolor=blue color=white ‘footnote h=5pt bcolor=blue color=white’;

title2 h=7pt bcolor=red ‘title2 h=7pt bcolor=red ‘;
footnote2 h=7pt bcolor=green ‘footnote2 h=7pt bcolor=green’;
proc print data=sashelp.class(obs=1);run;


SASludos,
Alberto

Muestreo Sistemático con SAS

septiembre 4, 2009 Deja un comentario
El muestreo sistemático consiste en la elección de una muestra a partir de los elementos de una lista según un orden determinado, o recorriendo la lista a partir de un número aleatorio determinado. Esta es la definición más sencilla de muestreo sistemático sin tener que profundizar mucho.

Un pequeño ejemplo de como realizar un muestreo sistemático usando el Proc SurveySelect.


Vamos a suponer que deseamos crear una muestra sistemática del data set sashelp.class y que contenga el 50% de la información. El código sería:

PROC SURVEYSELECT data=sashelp.class out=_sys_ method=sys samprate=0.5 OUTSORT=class_sorted;
control age;
run;

Donde,

Method=sys indica que la selección será sistemática
Samprate=0.5 indica que el tamaño de la muestra será del 50%
Outsort= es el nombre del data set ordenado por la variable utilizada en la sentencia CONTROL
Control= Esta opción específica la variable que deseamos utilizar para crear la muestra, así el data set es ordenado por esta variable para posteriormente hacer la selección sistemática.

Sin la opción control, la muestra será seleccionada en el orden en el que aparecen en originalmente los datos.

SASludos,

Alberto

Categorías:Programming, Shorts, Stat

Macro %Obs: Utilidad para Enterprise Guide

septiembre 4, 2009 Deja un comentario
Para aquellos de ustedes que solían trabajar en SAS Base y que por alguna razón (obligado o por gusto) hoy en día están usando Enterprise Guide (mi caso!!!), se habrán dado cuenta que en las propiedades de data set ya no es posible chequear el número de observaciones o registros.

Si bien es verdad que haciendo click en la barra lateral te dice cuantos registros tiene cuando el data set esta abierto, también es verdad que esto es un fastidio especialemente cuando en data mining necesitamos dividir el data set en pequeños data sets y constatar que la suma de todos ellos es igual al data set original (al menos en número de registros).


Es por ello que escribí una macro muy sencilla que imprimi en el log el nro de registros de un data set especifíco.

%macro Obs(dsn);
%if %sysfunc(exist(&dsn)) %then
%do;
data _null_;
if 0 then set &dsn nobs=nobs;
dsn=”&dsn”;
put dsn = nobs;
stop;
run;
%end;
%else
%put ERROR: Data set &dsn does not exist.;
%mend;

Para los que no tienen noción de macros, ejecutan el código anterior primeramente para cargar la macro en memoria (bueno realmente se carga en work.sasmacr pero no nos enredemos con eso ahora) y posteriormente la invocan así:

%obs(sashelp.class);

sashelp.class es solo un ejemplo, puede sustituir este data set por cualquier otro.

Espero le sea de tanta utilidad como lo es para mí.

SASludos,

Alberto

Categorías:Programming, Shorts

ODS Trace On: Más características del ODS

agosto 17, 2009 Deja un comentario
Para todos es un hecho que el ODS posee una versatilidad casi inigualable en cuanto a su habilidad para adaptarse a cualquier formato de salida.

No obstante, esta no es su única habilidad. También podemos crear data sets automáticamente a partir de procedmientos SAS. A continuación les dio una breve explicación.

Cuando ejecutamos cualquier procedimiento SAS como por ejemplo el Proc Freq, este nos devuelve una salida (en SAS Foundation sería el Output Windows), un reporte (en Enterprise Guide sería un html). Esta salida contiene información acerca de la frecuencia de cada valor contenido en la variable(s) específicada(s) en la sentencia TABLE. Esta información que SAS nos presenta en formato de reporte es adicionalmente almacenada en data set al que podemos tener acceso utilizando los ODS Output Tables.

Para saber que tipo salidas produce cada procedimiento debemos usar el ODS Trace ON. Aquí un ejemplo sencillo:

ods trace on;
proc freq data=sashelp.class;
table sex;
run;
ods trace off;

El ODS Trace on produce el siguiente resultado en el Log:

Output Added:
————-
Name: OneWayFreqs
Label: One-Way Frequencies
Template: Base.Freq.OneWayFreqs
Path: Freq.Table1.OneWayFreqs
————-

El mensaje anterior nos dice que el Proc freq creo el data set OneWayFreqs para generar el reporte que vimos cuando ejecutamos el procedmiento.

A medida que nuestro Proc se hace más complejo, es decir agregamos más variables, cruces, opciones o estadísticas el procedimiento genera data set adicionales.

Como accesamos esta información? como la guardamos en un data set “nuestro”? Para esto usamos la opción ODS OUTPUT de la siguiente manera:

ods output OneWayFreqs=Myfreqs;
proc freq data=sashelp.class;
table sex;
run;

Con el código anterior hemos creado el data set Myfreqs con la información contenida en el data set OneWayFreqs. Podemos crear tantos data sets como outputs sean creados con las opciones de procedmiento que vamos a ejecutar.

Ahora bien, para saber a que tipo de información tenemos acceso en cada procedimiento, debemos ir al HELP de SAS/EG, buscar el procedimiento y buscar bajo la opción de ODS TABLE NAMES que tenemos disponible.

Esta tarea se puede volver algo tediosa cuando sabemos lo que necesitamos pero no sabemos cual es el Proc más adecuado (distintos Proc pueden crear la misma información).

Para ello he creado una lista pública donde puede obtener los tipos de objetos de salida por Producto y Procedimiento SAS.

Aquí tienen el link: http://tinyurl.com/olabu3

Espero le sea de utilidad!

SASludos,

Alberto

ODS Statistical graphics: Análisis de Correlación

agosto 13, 2009 Deja un comentario

Esta característica de SAS ODS (ya no tan nueva) nos permite crear gráficos automáticamente utilizando los procedimientos estadísticos más comunes.

Algunos de ellos son experimentales mientras que otros ya están en producción.

Aquí tienen un pequeño ejemplo de un análisis de correlación lineal que utiliza este tipo de ODS.


ods html;
ods graphics on;

title ‘Analysis de correlacion para SASHELP.class’;
proc corr data=sashelp.class pearson spearman plots;
var Weight height age;
run;

ods graphics off;
ods html close;

SASludos,

Alberto

Categorías:Programming, Shorts, Stat

Leer múltiples archivos externos en SAS

julio 17, 2009 1 Comentario
En un post previo Pablink hizo la siguiente pregunta:

“¿existe alguna forma de leer varios archivos en un paso DATA sin la necesidad de llamar uno a uno con el INFILE?, es decir quiero leer 25 archivos que contienen un vector clumna cada uno (éstos se encuentran en una carpeta), y luego unirlos para crear un dataset que contenga los 25 vectores columna de los archivos”

Aquí les expongo un pequeño ejemplo de como hacerlo.

Ya que no mencionaste que tipo de archivo es, vamos a asumir que es un csv, la lógica sería la misma para cualquier archivo aunque el código puede cambiar a la hora de leer los archivos en SAS.

Paso 1: Localizar donde están nuestros archivos. Para ello utilizamos la sentencia filename, en el caso de Pablo son 25 archivos externos que si bien son fastidiosos de transcribir en nuestro código también es verdad que no es una tarea imposible. Pero imaginen por un segundo que fueran 500 archivos externos….

filename mfiles pipe ‘dir “C:\Mis Proyectos\*.csv” /b/a’;

Nota: para los que no lo sepan las opciones /b/a son del sistema DOS. No olviden colocar la ruta de sus archivos en lugar de C:\Mis Proyectos\ ;-)

Paso 2: Colocar toda la información contenida en mfiles en un SAS data set.

Data infolder;
infile mfiles truncover;
input string $20.;
path=cats(“C:\Mis Proyectos\”,string);
filename=strip(scan(string,1,’.'));
run;

Si abren el data set Infolder notaran que tenemos 3 campos:
- String: Contiene la información del archivo leído directamente de la sentencia filename.
- Path:Contiene concatenado la ruta + el nombre del archivo. ej. C:\Mis Proyectos\miarchivo.csv Esta variable será utilizada mas adelante con input para crear nuestros data sets.
- Filename: contiene exactamente la misma información que la variable string pero hemos eliminado el .csv, la idea fundamental aquí es usar esta variable para asignar el nombre a cada data set para que concuerde con el nombre del archivo externo en de realizar cualquier proceso de DQ.

Paso 3: Crear una macro para importar automáticamente todos nuestros archivos externos

%macro ReadIn(input=,output=);
PROC IMPORT OUT= WORK.&output
DATAFILE= “&input”
DBMS=CSV REPLACE;
GETNAMES=YES;
DATAROW=2;
RUN;
%mend;

Como el ejemplo es usando csv, podemos utilizar el proc import sin mayor dificultad. En el caso de ser un arhivo txt o dat podemos utilizar la macro de la siguiente manera:

%macro ReadIn(input=,output=);
Data &output
infile “&input” missover;
Input /*Aqui tus variables*/
run;
%mend;

La macro variable &output contiene la info de la variable filename y &input contiene la info referente a la variable path.

Paso 4: Invocamos la macro para generar nuestros archivos.

Data _null_;
set infolder;
call execute(‘%ReadIn(input=’!!path!!’,output=’!!filename!!’)');
run;

Una vez alcanzado este punto, el método que se eliga para unir todos los data sets y crear un solo data set es a juicio del facultativo.

Para descargar el programa completo haz click aquí

Espero les sirva!

SASludos,

Alberto

Categorías:Programming

Proc Datasets: Nuevos Tips

julio 15, 2009 Deja un comentario

Nuevos tips de como usar Proc Datasets.


Usaremos para algunos ejemplos una copia en work de sashelp.shoes

Data shoes;
set sashelp.shoes;
run;

*Eliminar todas las etiquetas de un data set;
proc datasets library = work nolist;
modify shoes;
attrib _all_ label=”;
quit;

*Renombrar work.shoes a work.shoes1;
proc datasets library = work nolist;
change shoes = shoes1;
quit;

*Eliminar todo el contenido de una liberia;
proc datasets library = work kill nolist;
quit;

*Eliminar un data set especifico en una libreria;
proc datasets library = work nolist;
delete shoes;
quit;

*Copiar todo el contenido de sasuser a work;
proc datasets nolist;
copy out=sasuser in=sashelp;
quit;
*Copiar un archivo especifico de una libreria a otra;
proc datasets nolist;
copy out=work in = sasuser;
select profileU;
quit;

SASludos,

Alberto

Categorías:Programming

Como eliminar un archivo externo desde SAS

julio 15, 2009 2 comentarios

Un short que muestra como eliminar archivos externos desde un programa SAS.


FILENAME Myextfile “C:\testpanel.xls” ;

DATA _NULL_ ;
rc = FDELETE(‘Myextfile’) ;
RUN ;

FILENAME Myextfile CLEAR ;

Como pueden observar este enfoque es bastante sencillo, existen otros métodos para realizar la misma operación como por ejemplo el comando X.

SASludos,

Alberto

Categorías:Programming, Shorts

Eliminando macro variables creadas por un usuario

julio 9, 2009 Deja un comentario
Vean el siguiente ejemplo que muestra como eliminar macro variables usando la macro %SYMDEL macro-variables(s);

%let nombre1=Lasug;
%let nombre2=SAS.com;

%put &nombre1;
%put &nombre2;

%SYMDEL nombre1 nombre2;

%put &nombre1;
%put &nombre2;

SASludos,

Alberto

Categorías:Programming, Shorts

Convertir valores tipo caracter a númerico y viceversa

julio 9, 2009 Deja un comentario
Pequeño ejemplo de como convertir variables usando las funciones INPUT y PUT.


DE CARACTER A NUMERICO

Data caracter_a_numerico;
input cadena :$10. fecha $8.;
numerico=input(cadena,8.);
sasfecha=input(fecha,mmddyy8.);
format sasfecha date9.;
cards;
9784165 07232009
125.3 10221980
;
run;

proc print data=caracter_a_numerico;
run;

DE NUMERICO A CARACTER

data numerico_a_caracter;
input numerico sasfecha :mmddyy8.;
caracter=put(numerico,$8.);
fechacaracter=put(sasfecha,date9.);
cards;
9784165 07232009
125.3 10221980
;
run;

proc print; run;

SASLudos,

Alberto

Categorías:Programming, Shorts
Seguir

Get every new post delivered to your Inbox.