SAS

Trucos SAS. Primer y último elemento de un array

Breve entrada sobre el uso de arrays en SAS. Dada una tabla SAS como esta con una variable mes1, mes2, … mesN:

arrays_sas.PNG

Necesitamos identificar el primer y el último elemento no nulo de un array y el número de elementos no nulos de ese array. Veamos el ejemplo:

data datos;

input id mes1 mes2 mes3 mes4 mes5 mes6;

datalines;

1 . . . . . .

2 162.18 88.41 919.62 891.25 837.73 163.14

3 . 790.52 160.03 . 60.31 343.30

4 . . 482.45 755.39 . .

5 265.17 963.53 . . 392.06 .

6 . 214.95 616.17 183.01 778.48 57.42

7 191.52 . 208.50 50.55 705.72 .

8 711.76 . . . 193.20 658.45

9 782.67 172.49 539.42 663.28 4.53 358.51

10 695.12 367.74 . 573.47 366.30 951.98

;

run;

Para este proceso creamos un array que recorreremos 2 veces, una hacia delante para identificar el primer elemento y otra a hacia atrás para identificar el último elemento:

Test de Levene con SAS

El Test de Levene se aplica para la igualdad de varianzas. Es un análisis de la varianza de las desviaciones de los valores muestrales respecto a una medida de tenedencia central. Parte de la hipótesis nula de igualdad de varianzas. Para realizar este test en SAS emplearemos el PROC GLM en combinación con la opción HOVtest. En la línea habitual vemos un ejemplo:

data datos;

 input presion @@;

 if _n_<=5 then grupo=1;

 else if _n_<=10 then grupo=2;

 else if _n_<=15 then grupo=3;

 else if _n_<=20 then grupo=4;

 else grupo=5;

cards;

180 172 163 158 147 173 158 170

146 152 175 167 158 160 143 182

160 162 171 155 181 175 170 155 160

;

run;

 Proc GLM Data=datos ;

  Class grupo;

  Model presion = grupo;

  Means grupo/HOVTest;

  ODS select HOVFTest;

 Quit;

Vemos que se trata de un código sencillo donde modelizamos con GLM la variable dependiente con la variable grupo y en MEANS indicamos con HOVtest que deseamos que se realice el test de Levene, con ODS seleccionamos sólo esa salida. Este código podemos parametrizarlo y crear una macro que nos permita replicar el código:

Sentencia del Tribunal de Justicia de la UE sobre el caso WPS y SAS

El caso de WPS y SAS por fin tiene un final. World Programing Software ha vencido (por fin) al todo poderoso SAS Institute Inc. La sentencia establece que:

De este modo, procede señalar que no puede haber infracción del derecho de autor sobre el programa de ordenador cuando, como sucede en el caso de autos, el adquirente legítimo de la licencia no ha tenido acceso al código fuente del programa de ordenador correspondiente a esa licencia, sino que se limitó a estudiar, observar y verificar ese programa con el fin de reproducir su funcionalidad en un segundo programa.

Trucos SAS. Errores y formatos

Un truco SAS que puede ayudar a todos aquellos que estén empezando a programar en SAS. Hay ocasiones que trabajamos con datasets que tienen formatos y nos encontramos con el error: « formato FMT no se ha encontrado o no se ha podido cargar». ¿Qué hacer? Lo primero es jugar con la opción FMTERR:

options nofmterr;

Esta opción de SAS nos permite trabajar con conjuntos de datos SAS con formatos aunque no estén cargados porque no se tienen en cuenta los errores. Por otro lado podemos emplear PROC DATASETS para eliminar todos los formatos (entrada y/o salida) de un conjunto de datos SAS, el código es el siguiente:

Trucos SAS. Pasar fecha a caracter en SAS

Pasar números a carácter en SAS es un tema reiterativo tanto en entradas al blog como en búsquedas. Pero que se le puede dar otra vuelta de tuerca. Se trata de transformar fechas a variables alfanuméricas, pero en este caso vamos a poner las fechas en formato español. Ejecutad este ejemplo en SAS:

data uno;

y = '30jan11'd;

c0 = put(y,ddmmyy10.);

c1 = upcase(put(y,ESPDFDD.));

c2 = upcase(put(y,ESPDFDE.));

c3 = upcase(put(y,ESPDFDN.));

c4 = upcase(put(y,ESPDFDT.));

c5 = upcase(put(y,ESPDFDWN.));

c6 = upcase(put(y,ESPDFMN.));

c7 = upcase(put(y,ESPDFMY.));

c8 = upcase(put(y,ESPDFWDX.));

c9 = upcase(put(y,ESPDFWKX.));

run;

Imagino que todos tenéis el NLS de SAS instalado y no tenéis problemas con estos formatos. Resumamos que nos ofrece cada una de estas transformaciones:

En la regresión logística ¿el sobremuestreo es lo mismo que asignar pesos a las observaciones?

Hoy vamos a volver sobre el tema del sobremuestreo. Respondemos a un lector, Roberto, que hace mucho tiempo planteó una duda al respecto. La duda se puede resumir: En un modelo logístico, ¿equivale entrenar un modelo con las observaciones sobremuestreadas a entrenar el modelo poniendo un peso a cada observación? Esta cuestión nunca me la había planteado. Siempre había realizado un sobremuestreo de las observaciones adecuando la población de casos negativos a la población de casos positivos. Si estás habituado a trabajar con Enterprise Miner de SAS es habitual asignar pesos a las observaciones para realizar el proceso de sobremuestreo. ¿Obtendremos distintos resultados?

Trucos SAS. Eliminación de espacios en blanco

Truco SAS práctico para aquellos que os estáis iniciando en el uso de las funciones de texto con SAS. Se trata de eliminar aquellos espacios en blanco que no son necesarios en una variable. Quería plantearos las posibles soluciones que se me han ido ocurriendo. Algunas de ellas no son eficientes pero es necesario que dispongáis de todas. En la línea habitual planteo un ejemplo para que lo ejecutéis y así podáis analizar los resultados:

Truco Excel y SAS. Ejecutar SAS desde macro en Excel

Un truco muy malo hoy. Se trata de crear una macro de Excel que llame a un programa SAS y que además podamos pasar un parámetro. Es un código en Visual Basic que no tiene complejidad pero que puede ser útil. El código es:

Sub ejecuta_SAS()

'

'Ponemos la ubicación del ejecutable de SAS

ubicacion_SAS = "C:\SAS\sas.exe"

'

'Programa que deseamos ejecutar de SAS

programa_SAS = "'C:\ejecucion_excel.sas'"

'

'Podemos pasar parámetros como macros por ejemplo que aparecen en una celda de Excel

'Podemos poner todo el código SAS que queramos

parametro = "'%let nobs = " & Cells(1, 1) & " ;'"

'

'En una cadena ponemos toda la ejecución

ejecucion = ubicacion_SAS & " " & programa_SAS & " -initstmt " & parametro

'

'Shell ejecuta la cadena anterior

ejecuta = Shell(ejecucion, 1)

'

End Sub

Poca cosa y poco talento y bastante claro. Pero si me gustaría destacar el uso de la opción de SAS -initstmt que nos permite ejecutar SAS poniendo un código previamente (init statement). Esta opción nos permite pasar una macro como parámetro que es leída en una celda de Excel. Es una opción habitual cuando hacemos archivos ejecutables para SAS. Espero que sea de utilidad. Saludos.

Trucos Excel (y SAS). Complemento para cambiar la configuración regional

Pasar salidas de SAS a Excel trae de cabeza a muchos usuarios de SAS. A este blog llegan un gran número de entradas desde Google con términos del tipo importar datos de sas a Excel, conectar SAS a excel, cambiar la configuración regional con macros,… Hoy quería ayudaros un poco con esta problemática. Bueno, en realidad os va a ayudar el compañero Salva que hace unos meses me pasó un complemento de Excel tremendamente útil para aquellos que movemos datos entre SAS y Excel. Para trabajar con este complemento sólo tenéis que descargarlo en este enlace y activar el complemento en Opciones de Excel Administrar complementos. Una vez hayamos hecho esto tendremos en nuestra pestaña complementos lo siguiente:

Trucos SAS. Trasponer con SQL para torpes

trasponer_sql1.png

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:

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:

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:

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;

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.