Learning SAS

Learning SAS

Statistical Analysis System

Environment Menu

  • Server Files and Folders

  • Task and Utilities

  • Snippets

  • Libraries

  • File shortcuts

Server Files and Folders Normalmente se deben guardar los archivos en Archivos(Inicio).

Libraries Es un repositorio de Datos donde podemos asignar permisos basados en roles. Para acceder a los datos indicamos el nombre de la libreria y el nombre del tada set.

/*Nombre del dataset*/
data test;
/*Ruta del dataset en libraries*/
    set sashelp.airline;
/*Cada linea finaliza con `;` y los errores de sintaxis no se muestran como tal*/
run;

Para ejecutar el codigo tenemos que seleccionarlo y luego ejecutarlo, ademas es importante guardarlo en una carpeta en Archivos(Inicio).

Gettin Start

La columnas las llamamos Variables Las filas las llamamos Observations

  • Origin Datasets

    • SAS Data Set are stored in SAS Libraries. Your temp Data Sets are always stored in the WORK Library.

  • Valores nulos de tipo caracter y numericos

    • Los caracteres faltantes se identifican con un y los datos numericos faltantes con ..

  • Tipos de Bloques en SAS

    • data step Crea o modifica datos

/*Creamos variable o DataFrame*/
data airline_create;
    set sashelp.airline;
/*Creamos la columna Month la cual es igual al mes de la columna date*/
    Month = month(date);
run;
/*Procedure step que imprime data que es igual a airline create*/
proc print data=airline_create;
run;

Datalines

data demografic_cols;
/*Ademas de $ para indicar que es tipo caracter podemos usar 1-5 rangos para
indicar los espacios que pueden ocupar los datos de las filas es como
un limitante de carateres y numeros, es util cuando tenemos archivos de
texto alineados pero sin limitadores como ; o ,*/
	input Name $ 1-5 Age 6-8 State $ 9-11 Weight 12-15;
	datalines;
Marie 25 WV 132
Danie 188 ST 188
;
run;

proc print data=demografic_cols;
run;
  • Datalines Archivos separados por espacios

data demografic_cols;
/*Donde infile recibe la ruta del archivo no delimitado por ; sino por espacios*/
	infile 'path/file.txt';
/*+1 salta una colmna e inicia a partir de la siguiente
@18 Indica que iniciara en la columna 18*/
	input Gender $ 1-2 Index +1 Age $ 5-6 Ethnicity $ @18;
run;

proc print data=demografic_cols;
run;
  • Datalines en Fechas

data date_sample;
/*El 10. indica el total de caracteres incluyendo `-`
si no usamos format obtendremos el valor numerico de la fecha*/
	format Date_Birth MMDDYY10.;
	input Name $ Date_Birth MMDDYY10.;
	Datalines;
Oliver 03-16-1972
Natalie 12-11-1965
;
run;
proc print data=date_sample;
run;
  • Informats Son usados para leer datos no estandar como:

  • Hyphens

  • Slashes

  • Dollar Sign

  • Percent Sign

  • Commas

  • Data Step Data Statement: Name of the new dataset you want to create and the library you are storing it in Set Statement: Name of the old dateset

  • Create a library that already contains SAS datasets

data bweight_kg;
	set sashelp.bweight;
/*Creamos la variable Weight_Kg y Domestic_Status*/
	Weight_Kg = Weight/1000; * division;
	Domestic_Status =  "International";*character asignment;
run;

proc print data=bweight_kg;
run;
  • Crecion de una Libreria

/*Creacion de una libreria de nombre 'mydata'
donde la libreria es una instancia de una
de carperta en esta caso 'bpo2b'*/
libname mydata '/home/u61609774/bpo2b';
run;
  • Proc Means Provee estadistica basica para varibles numericas. Si ejecutamos este codigo obtenemos la siguiente tabla.

/*Proc means*/
data baseball_data;
	set sashelp.baseball;
run;

proc print data=baseball_data;
run;

image Si queremos calcular los estadisticos de nHits y nRuns podemos usar el siguiente codigo:

/*Proc means*/
data baseball_data;
	set sashelp.baseball;
run;

proc means data=baseball_data;
/*Indicamos las variables a calcular sus estadisticos*/
	var nHits nRuns;
run;

image

A continuacion especificamos que estadisticos necesitamos e incluso crear un nuevo archivo de salida con output out

/*Proc means*/
data baseball_data;
	set sashelp.baseball;
run;

/*Indicamos algunos estadisticos
q1: es el quantil minimo
maxdec: Decimales maximos
nmiss: total nulos
n: total datos
mean: media
median: mediana
*/
proc means data=baseball_data median q1 maxdec=2 nmiss n mean;
	var nHits nRuns;
/*output out: Crea un nuevo archivo 'baseball_stats' */
	output out = baseball_stats;
run;

A continuacion usamos Class el cual es funciona como un groupby donde podemos calcular estadisticos a partir de la agrupacion de datos categoricos.

/*Proc means*/
data baseball_data;
	set sashelp.baseball;
run;

proc means data=baseball_data;
/*Calculamos stats a partir de la agurpacion por `League`*/
	class League;
	var nHits nRuns;
run;

image

Una alternativa a class es by sin embargo primero debemos hacer un sort como se muestra acontinuacion

/*Realizamos un sort de League*/
proc sort data=baseball_data out=baseball_sorted;
	by League;
run;

/*Ahora si podemos aplicar un by. Al final es lo mismo que class
pero class es mas facil y claro*/
proc means data=baseball_sorted;
	by League;
	var nHits nRuns;
run;
  • Uso de Where

proc means data=sashelp.baseball;
/*Basic stats de la variable nOuts
filtrando los datos diferentes a Houston*/
	var nOuts;
	where team not = 'Houston';
/*Nombre de la tabla*/
	Title 'All outs Except Houston';
run;
  • Uso de Table Muestra la lista de variables que queremos ver. A continuacion generacion de Tabla de Frecuencias

proc freq data=sashelp.baseball;
/*Creamos dos tablas de frecuencias
Una para Position y Otra para League*/
	tables Position League;	
run;

image image

En caso de querer mover o sacar alguna de las columnas de la tabla de frecuencias solo lo podemos hacer para una tabla de freq no para dos como en el caso anterior.

proc freq data=sashelp.baseball;
/*Mover la columna de valores acumulados*/
	tables Position/NOCUM;	
run;
  • **Tabulacion de frecuencias transversal a variables categoricas.

proc freq data=sashelp.baseball;
/*Tabulacion transversal a dos variable categoricas*/
	tables Position * League;	
run;

image

  • Formats A continuacion daremos formato a la columna date donde pasaremos de JAN49 a DD-MM-YYYY format.

data airline_data;
/*El numero 10. sirve para indicar el total de carateres
y DATE es el nombre de la columna*/
	format DATE MMDDYY10.;
	set sashelp.airline;
run;

A continuacion podemos ver como convertir una variable numerica en una categorica o viceversa.

data airline_data;
	set sashelp.airline;
/*put(column_name,format) es importante recordar que los numeros normalemte
estan identados a la derecha y los caracteres a la izquierda.
$: Indica que es de tipo caracter
4:El numero de carateres

Asi ahora tenemos una nueva columna New_Air con el mismo valor de AIR pero categorico*/
	New_Air = put(AIR, $4.);
run;
  • Proc Format Esta opcion permite reemplazar valores en nuestro dataset.

proc format;
/*Creamos una variable gender y agegrp internamente 
cada una almacena un formato que luego sera asignado a determinada tabla
LOW y HIGH son variable internas de SAS*/
	VALUE $gender 'M' = 'Male'
				  'F' = 'Female';
	VALUE agegrp  LOW - 13 = 'Youth Teen'
				  14 - HIGH = 'Mid Teen';
run;

proc print data=sashelp.class;
/*Asignamos ageqpr a age y $gender a sex*/
	format age agegrp. sex $gender.;
run;

image

  • Proc Tabulate Sirve para cruzar variables categoricas y evaluar diferentes paramentros.

  • Class Columns and Table Columns

/*Por defecto el estadistico es N*/
proc tabulate data=sashelp.baseball;
	class Division;
	table Division;
run;

image

  • Class Rows,Columns and Table Rows,Columns

proc tabulate data=sashelp.baseball;
/*Indicamos Rows and Columsn
No olvidar `,` en tables*/
	class Division League;
	table Division, League;
run;

image

  • Class Page,Rows,Columns and Table Page,Rows,Columns

proc tabulate data=sashelp.baseball;
/*Indicamos Page, Rows and Columsn
No olvidar `,` en tables
Page es el cantida de tablas data una categoria
en este caso division solo tiene 2 categorias*/
	class Division League Team;
	table Division, League, Team;
run;

image

  • Otros estadistico que pueden ser usados en el ejemplo anterior. image

A continuacion se muestra como se pueden agregar estos estadisticos.

proc tabulate data=sashelp.baseball;
	class Division League;
	var nOuts;
/*Agrega ALL: Subtotales
MEAN: La media de nOuts pero ademas la media de los subtotales de League
Importante si table no tiene `,` no se van a separa por filas y columnas*/
	table Division ALL, MEAN*nOuts*(League ALL);
run;

image

  • Proc Report

  • Ordenar Ascendentemente

proc report data=sashelp.baseball;
/*Utiliza la Columna CrHits para ordenar toda la table ascendentemente*/
	define CrHits / Order 'Career Hits Order';
run;
  • Agrupar tablas acotadas

proc report data=sashelp.baseball MISSING;
/*Indica las columnas que queremos tomar a traves de column*/
	column League Salary;
/*Agrupa Salary en funcion de League una variable categorica
y suma el total de salario para cada grupo de League*/
	define League / GROUP;
run;
  • Agupar tablas acotadas e indicar el estaditico

/*MISSING indica que tendremos en cuenta los valores nulos*/
proc report data=sashelp.baseball MISSING;
/*Indica las columnas que queremos tomar a traves de column*/
	column League Salary;
/*Agrupa Salary en funcion de League una variable categorica
y suma el total de salario para cada grupo de League*/
	define League / GROUP;
/*Si queremos indicar otro estadistico diferente a `Sum` entonces 
debemos definir la variable numerica para un estadistico dado*/
	define Salary / Analysis Mean;
/*Ahora es stat sera Mean en vez de Sum*/
run;
  • If/Then/Else Statement

  • Condicional Simple

data class_data;
/*Cantidad maxima de caracteres*/
	length _Sex $10;
	set sashelp.class;
/*Crea una nueva columna con un nuevo nombre*/
	if Sex = 'M' then _Sex = 'Male';
	else _Sex = 'Female';
run;

proc print data=class_data;
run;
  • Condicional compuesto

data class_data;
	length Fish_Size $10;
	set sashelp.fish;
	if Length1 < 15 then Fish_Size = 'Small';
	else if Lenght >15 and Length < 25 then Fish_Size = 'Medium';
	else Fish_Size = 'Large';
run;
  • Condicional con mas de una accion

data class_data;
	length Fish_Size $10;
	set sashelp.fish;
	if Length1 < 15 then Do;
/*Crear dos columnas en base a un condicional*/
	Fish_Size = 'Small';
	Fish_Location = 'SaltWater';
	end;
run;