Archivo de la categoría: SAS

Trucos SAS. Calcular una edad

No penséis que restar dos fechas y obtener una diferencia en años entre ellas es un tema baladí. Ejecutad el siguiente código SAS para calcular la diferencia en años:


data uno;
format fecha1 ddmmyy10.;
do fecha1= 9000 to today();
output;
end;
run;

data uno;
set uno;
format fecha2 ddmmyy10.;
fecha2="15MAY2014"d;

edad = int((fecha2-fecha1)/365.25);

run;

data uno;
set uno;
if month(fecha1)=5 and day(fecha1)=15;
run;

Visualizad el conjunto de datos uno, la serie de edad asusta 28,28,27,25,24,24,… Está claro que algo falla. Hace ya tiempo que hablamos de ello en este mismo blog. Los ceros y los unos con los que guardan estas máquinas las cosas a veces nos juegan estas malas pasadas. Para evitar este problema os sugiero que empleéis la función de SAS YRDIF con la base ‘AGE’. Replicamos el ejemplo:

data uno;
format fecha1 ddmmyy10.;
do fecha1= 9000 to today();
output;
end;
run;

data uno;
set uno;
format fecha2 ddmmyy10.;
fecha2="15MAY2014"d;

edad = int(yrdif(fecha1,fecha2,'AGE'));

run;

data uno;
set uno;
if month(fecha1)=5 and day(fecha1)=15;
run;

Ahora nuestra serie si es 29,28,27,26,25,… Ya sabéis tened cuidado a la hora de calcular edades porque SAS parece que trabaja hasta con la hora del nacimiento para calcular edades. Saludos.

Truco SAS. Gráfico de correlaciones

Un truco SAS interesante para representar matrices de correlaciones. El ejemplo es muy sencillo, pero previamente tenéis que crear el conjunto de datos SAS para ilustrar el ejemplo. Así que lo primero que hay que hacer es ir a este enlace y copiar el código necesario para crear el conjunto de datos SAS auto. Una vez tenemos ese conjunto de datos de 74 observaciones y 12 variables sólo tenemos que emplear el PROC CORR con una sintaxis muy sencilla:


ods graphics on;
title 'Correlaciones datos Auto';
proc corr data=auto nomiss plots=matrix(histogram);
var price mpg rep78 hdroom trunk weight length turn
displ gratio foreign;
run;
ods graphics off;

Como vemos solo hay que hacer ODS GRAPHICS y la opción plot=matrix(histogram) SAS nos presenta un análisis gráfico muy completo de las correlaciones:

 

Os recomiendo jugar también con plot=scater para intervalos de confianza elipsoidales. Podréis encontrar literatura y ejemplos en la web. Saludos.

Un nuevo blog sobre SAS en español

Buenas noticias. Tenemos un nuevo blog sobre SAS en español:

Utilidades, recursos, ejemplos y documentación sobre la herramienta de B.I. SAS.

Esta buena iniciativa parte de Juan Vidal. Se agradece que la comunidad de programadores de SAS compartan sus conocimientos. Algo que no es muy habitual, al contrario pasa con otras herramientas para la gestión de la información y la estadística. Por supuesto esta iniciativa tiene su correspondiente link en esta web.

El blog me gusta porque tiene ejemplos perfectamente reproducibles. Seguro que será interesante para un buen número de lectores. Saludos.

Espacios en SAS

 

Las funciones SAS más habituales para eliminar blancos son las que tenéis en la figura de arriba. Para llegar a ese conjunto de datos SAS hemos ejecutado el siguiente paso data:

 data ejemplo;

st = "  Cuando  brilla   el sol    ";
l_st=length(st); output;

funcion="COMPRESS     "; st1 = compress(st); 
l_st1=length(st1); output;

funcion="COMPBL";  st1 = compbl(st); 
l_st1=length(st1); output;

funcion="TRIM";    st1 = trim(st); 
l_st1=length(st1); output;

funcion="TRIMN";   st1 = trimn(st); 
l_st1=length(st1); output;

funcion="STRIP";    st1 = strip(st); 
l_st1=length(st1); output;

funcion="SRTIP+COMBBL"; st1 = strip(compbl(st)); 
l_st1=length(st1); output;

run;

Distintas formas de eliminar espacios dentro de una cadena de caracteres en SAS. Partimos de la variable string ” Cuando brilla el sol ” y empleamos las siguientes funciones:

  • COMPRESS: Elimina todos los espacios en blanco de la variable
  • COMPBL: Elimina aquellos espacios en blanco que considera innecesarios, ejemplo ‘  ‘ -> ‘ ‘
  • TRIM y TRIMN: En este caso no hacen nada, así lo recordamos
  • STRIP: Elmina los espacios en blanco innecesarios por la izquierda
  • STRIP + COMPL: Es un combo de funciones pero el mejor para nuestro caso

Espero que entendáis mejor estas funciones. En breve veremos porque existen TRIM y TRIMN. Saludos.

Cuidado con el p-valor. Depende del tamaño de la muestra

El otro martes, Teresa mi profesora de la Facultad de Estudios Estadísticos, dijo una frase que me dejó helado.“Ojo con el p-valor porque depende del tamaño muestral” Estábamos estudiando regresión logística y test de independencia. Ahora que uno mismo vuelve a estudiar que es lo que hay detrás de la salida de los programas estadísticos se plantea muchas dudas. Por definición el p-valor depende del tamaño muestral y es una medida que la tomamos como un axioma para todo: El p-valor nunca miente hasta que tenemos mucha exposición. Voy a utilizar un ejemplo que vi en clase con Teresa ligeramente retocado (no creo que se enfade, no creo ni que lea esto). Trabajo con SAS porque estoy más acostumbrado a la salida que ofrece. Se trata de realizar un test de independencia para una tabla 2×2. La H0 o hipótesis nula es que existe independencia entre el factor de nuestro estudio y la variable dependiente en nuestro caso H0 es no hay relación entre la utilización de un pesticida y la presencia de una enfermedad frente a H1 hay relación entre la utilización del pesticida y la presencia de la enfermedad. Simulamos los datos con SAS:

 data datos;
do i=1 to 85;
pesticida = 0; enfermedad = 0; output; end;
do i = 1 to 15;
pesticida = 0; enfermedad = 1; output; end;

do i = 1 to 168;
pesticida = 1; enfermedad = 0; output; end;

do i = 1 to 31;
pesticida = 1; enfermedad = 1; output; end;
run;

proc freq; tables pesticida*enfermedad; quit;

 

Si realizamos un modelo de regresión logística sobre esta tabla 2×2 y vemos la salida correspondiente al test de Wald Seguir leyendo Cuidado con el p-valor. Depende del tamaño de la muestra

Truco (muy fácil) de SAS. Leer un rango de una hoja Excel

Cuando tenemos rangos en nuestras hojas Excel y deseamos que se conviertan en tabla SAS podemos emplear la sentencia libname de este modo:

libname selec "C:\TEMP\rangos.xlsx";
data rango;
set selec.rango;
run;
libname selec clear;

Asisgnamos la librería al archivo Excel que deseamos leer y tan simple como referenciar al rango en nuestro paso data. Se interactúa fácil entre Excel y SAS. Saludos.

Truco SAS. Elminar retornos de carro o saltos de línea engorrosos

Cuando tenemos saltos de línea o retornos de carro que nos dificultan las lecturas de ficheros de texto podemos leer caracter a caracter con SAS y elminar esos caracteres incómodos.

data _null_;
length char $1.;
infile 'C:\fichero_de_entrada.TXT'  lrecl=1 recfm=F missover dsd;
file 'C:\fichero_de_entrada_depurado.TXT'  lrecl=1 recfm=F;
input char $ASCII.;
if rank(char) = 13 /*SI ES WIN PONER EL 13*/ then char= "";
put char;
run;

Recomiendo no sobreescribir el fichero de texto y crear otro “depurado”. Tendréis este problema cuando vuestro programa SAS os lea menos observaciones de las esperadas. Esto suele pasar cuando trabajamos con archivos de distintos sistemas operativos, como por ejemplo cuando leemos un archivo de texto unix con una máquina windows. Saludo.

Truco SAS. Unir todas las hojas de un Excel en una

Empleamos LIBNAME con SAS para acceder a Excel. Es un truco con limitaciones y que se tiene que ir mejorando a futuro. Se trata de leer todas las hojas de un libro Excel y pegarlas horizontalmente en otra hoja QUE NO DEBE EXISTIR PREVIAMENTE. La macro es la siguiente, no se acompaña de un ejemplo de uso debido a su sencillez:

 %macro une_excel(ubicacion, nombre_union);
libname selec &ubicacion.;

proc sql noprint;
select "SELEC.'"||memname||"'n" into:lista_excel separated by " " 
from dictionary.members 
where libname = "SELEC";
quit;

data SELEC.&nombre_union.;
set &lista_excel.;
run;

libname selec clear;
%mend;

%une_excel("C:\TEMP\unir_excel2\unidos.xlsx", todas);

Creamos una librería SAS a un libro Excel determinado. Leemos con DICTIONARY las hojas que tiene dicho libro y las unimos en una hoja de ese libro al que será la última. Como buena costumbre el desasignamos la librería con LIBNAME CLEAR. Como se ha indicado antes tiene limitaciones, por ejemplo no debe existir la hoja final con la unión. Pero es un buen ejemplo de uso de LIBNAME + EXCEL y DISTIONARY. Saludos.

Dividir en palabras un texto con SAS

Una duda que planteó una lectora del blog acerca de separar una cadena de caracteres separados por comas y crear observaciones en otra variable:
 Hola! he buscado por toda la página, necesito ayuda urgente. Mi problema es el siguiente.

Necesito separar una cadena de texto en una fila en varias filas, por ejemplo

cadena1,cadena2,cadena3

en

cadena1
cadena2
cadena3

para encontrar la ‘ , ‘ utilizo scan, aunque podría ocupar anypunct para que encuentre la primera ‘ , ‘ luego la segunda ‘ , ‘ etc y cortar con substr, longth … pero bueno, ya que tengo un metodo de separar el texto de la fila como hago para que cada palabra este en una nueva fila? ojala me hayan entendido y me den una idea de como hacer eso en un proc sql, con una macro o como sea, solo una pequeña orientación me serviria mucho, gracias!!!!!

En realidad teníamos una entrada que podía haberte servido de referencia:

https://analisisydecision.es/el-debate-politico-o-como-analizar-textos-con-wps/

Con esta idea podemos proponer hacer:

data frase;
frase = "cadena1,cadena2,cadena3";
run;

data palabras;
set frase end=fin;
drop i letra;
length palabra $50;
palabra="";
do i = 1 to length(frase);
letra=substr(frase,i,1);
if letra not in (",") then palabra=compress(palabra||letra);
else do;
output;
palabra="";
end;end;
if fin then output;
run;

Se trata de ir caracter a caracter y volcarlo a una nueva variable en el momento que encuentra la coma y realizar un output en ese momento. Saludos.