You are on page 1of 54

Estudio y depuración de datos Tema 1

TEMA 1. TIPOS DE VARIABLES: TRANSFORMACIONES Y CODIFICACIÓN

1.1 Tipos de variables: Nominales. Ordinales y Continuas


1.2 Transformaciones de variables
1.3 Recuento de valores en los casos
1.4 Recodificación de variables.
1.5 Categorización de variables.
1.6 Asignación de rangos.
1.7 Recodificación automática.
1.8 Manipulación de fechas.
1.9 El procedimiento Format de SAS.
1.10 Chequeo y recodificación de variables pon SAS.
1.11 Categorización con SAS
1.12 Manipulación de fechas con SAS.

1.1 Tipos de variables: Nominales. Ordinales y Continuas

Las variables que pueden aparecer en un conjunto de datos pueden ser de varios
tipos:

Continuas: son aquellas cuyos valores pueden ser cualquier número real de
un intervalo dado. Lo único que limita el valor de estas variables, es la
capacidad de medirlas con exactitud. En SPSS se llaman Escalas.
Ordinales: son aquellas que sólo pueden tomar un número finito ó infinito
numerable de valores y entre ellos existe un orden.
Nominales, como el sexo, la raza, el color,... Pueden tomar un número finito de
valores y entre ellos, no se puede establecer ningún tipo de orden. También
las llamaremos cualitativas o categóricas y a los posibles valores que tomen les
daremos el nombre de categorías.
Destacamos además variables específicas que suelen aparecer en multitud de
conjuntos de datos:

Escalas de Likert es una declaración que se le hace a los sujetos para que éstos
evalúen en función de su criterio subjetivo; generalmente se pide a los sujetos que
manifiesten su grado de acuerdo o desacuerdo. Normalmente hay 5 posibles
respuestas o niveles de acuerdo o desacuerdo, aunque algunos evaluadores prefieren
utilizar 7 ó 9 niveles; un estudio empírico reciente demostró que la información
obtenida en escalas con 5, 7 y 10 niveles posibles de respuesta muestra las mismas

1
Estudio y depuración de datos Tema 1

características respecto a la media, varianza, asimetría y curtosis después de aplicar


transformaciones simples. El formato de un típico elemento de Likert con 5 niveles de
respuesta sería:

Me gusta el cine:

1. Totalmente en desacuerdo
2. En desacuerdo
3. Ni de acuerdo ni en desacuerdo
4. De acuerdo
5. Totalmente de acuerdo

Fechas: Muy importante sobre todo en el estudio de las series temporales. Por su
formato distinto suelen tener un tratamiento específico dentro de los programas.

En general un conjunto de datos se representará por una matriz en la que todos los
valores de una variable vendrán incluidos en una columna; cada una de las filas hará
referencia a una de las observaciones.

Para hacer un primer análisis del tipo de variables que tenemos en nuestro fichero de
datos, en SPSS tenemos la opción Datos- Definir propiedades de las variables que
nos permite escanear las variables para ver de una forma rápida que valores
presentan y que tipo de variables son.

2
Estudio y depuración de datos Tema 1

En este caso muestra el análisis de la variable Gender que es nominal, tipo cadena,
amplitud 6 y los valores que aparecen en dicha variable deberían ser F y M pero
además aparecen X, 2 y f. Como vemos este primer análisis es muy útil porque
detecta valores “extraños” que podremos corregir transformando la variable. Además
podemos incluir etiquetas tanto de variable como de valores.

La opción copiar las propiedades de otras variables es muy útil cuando tenemos en un
mismo fichero variables del mismo tipo, por ejemplo escalas de Likert, cuyos valores
van del 1 al 5 y sus etiquetas son siempre las mismas. Esta opción implica que
aplicará a nuestra variable el mismo nivel, el mismo formato (anchura y decimales) y
las mismas etiquetas a los valores.

Si pasamos al análisis de HR obtenemos que es una variable nominal pero de tipo


numérica. Por esto, si pinchamos en el botón sugerencias vemos que SPSS nos
recomienda que la variable sea de tipo escala.

3
Estudio y depuración de datos Tema 1

Si pinchamos en continuar nos cambia el nivel de variable al sugerido por SPSS en


este caso Escala.

1.2 Transformaciones de variables.

En ocasiones, los datos de un archivo están preparados para que sea posible aplicar
directamente sobre ellos el análisis estadístico deseado. Pero esto sólo ocurrirá en
una situación ideal; y las situaciones ideales raramente se presentan. Más bien al
contrario, lo habitual será encontrarse con archivos de datos que necesitarán ser
cuidadosamente preparados antes de poder aplicar con las mínimas garantías
cualquier análisis estadístico.
La preparación del archivo de datos incluye desde la simple detección y corrección de
los posibles errores cometidos al introducir datos, hasta sofisticadas transformaciones
(necesarias a veces para llegar a obtener las variables que realmente interesan),

4
Estudio y depuración de datos Tema 1

pasando por la recodificación de los códigos utilizados para los valores de una o más
variables, o la creación de nuevas variables a partir de otras ya existentes.

Por ejemplo, cuando una base de datos contiene la fecha de nacimiento, es mucho
más útil generar la variable edad, más fácil de interpretar, analizar como variable en si
misma y manejar numéricamente.

En SPSS el menú Transformar de la barra de menús principal incluye una serie de


opciones que permiten efectuar diferentes tipos de transformaciones, desde las más
simples a las más complejas. Trataremos en este capítulo todas esas opciones.

1.2.1. Transformando variables con la opción Calcular


El SPSS incluye varias opciones para crear variables nuevas a partir de otra u otras
existentes poniendo a disposición del usuario una gran cantidad de funciones
diferentes. Para crear una variable nueva:
 Seleccionar la opción Calcular... del menú Transformar para acceder al
cuadro de diálogo Calcular variable

5
Estudio y depuración de datos Tema 1

El cuadro de texto Variable de destino (target variable) permite introducir el nombre


de la variable que recibirá los valores calculados. El nombre de esta variable puede
ser nuevo o puede ser el de una variable ya existente. Si el nombre propuesto coincide
con el de una variable ya existente, al pulsar el botón Aceptar aparece un mensaje de
aviso solicitando confirmar o cancelar la acción.
A la variable de destino se le asigna, por defecto, formato numérico. No obstante, el
cuadro de diálogo Calcular permite controlar el tipo de formato de las nuevas
variables.
Para cambiar el formato de la nueva variable y/o asignarle una etiqueta pulsar:

6
Estudio y depuración de datos Tema 1

El recuadro Etiqueta permite asignar una etiqueta descriptiva a la nueva variable de


hasta 120 caracteres.
Usar la expresión como etiqueta. Al seleccionar esta opción, el SPSS asigna como
etiqueta los primeros 110 caracteres de la expresión numérica.
El recuadro Tipo sirve para cambiar el formato de la nueva variable:
Numérico. Formato por defecto.
Cadena. Asigna formato de cadena. Si se opta por este formato, es necesario
especificar el ancho de la cadena en la caja Ancho.

Para facilitar la tarea de construir la expresión numérica, el cuadro de diálogo Calcular


variable incluye un teclado de calculadora con números y operadores aritméticos,
relacionales y lógicos. Este teclado funciona exactamente igual que el de una
calculadora convencional.

Operadores aritméticos Operadores relacionales Operadores lógicos


Los operadores relacionales y lógicos son útiles, sobretodo, para efectuar
transformaciones condicionales.

Funciones
La lista del recuadro Funciones incluye más de 70 funciones aritméticas, estadísticas,
lógicas, etc. La ayuda específica del cuadro de diálogo Calcular variable contiene
información puntual sobre estas funciones. Además, situando el puntero del ratón
sobre una función, al pulsar el botón secundario del ratón aparece un cuadro de ayuda
contextual con una descripción de esa función. Para trasladar una función al cuadro de
texto Expresión numérica:
 Seleccionar la función y pulsar el botón flecha para trasladarla al cuadro
Expresión numérica.
Una expresión no está completa hasta que se incluye entre paréntesis el argumento
de la función seleccionada. Algunos ejemplos:
1. MEAN (var1, var2, var3).
2. ARSIN (ABS(SQRT(Var1))).
3. RV.NORMAL (0, 1).
La primera expresión calcula la media aritmética de var1, var2 y var3. La segunda
calcula la función arcoseno del valor absoluto de la raíz cuadrada de la variable var1
(transformación ésta muy utilizada, por ejemplo, cuando las puntuaciones de la
variable dependiente de un análisis de varianza son proporciones). La tercera

7
Estudio y depuración de datos Tema 1

expresión genera una variable aleatoria (RV = random variable) distribuida


normalmente con media 0 y desviación típica 1.

Generación de números aleatorios de distribuciones.


En esta sección veremos cómo generar una variable de números aleatorios de una
determinada distribución.
En primer lugar definimos una variable de destino en la que se guardarán los números
aleatorios.

Si queremos generar n números aleatorios, tenemos que irnos a la casilla número n de


esta variable y asignarle un valor. En la casilla que entonces se indica introducimos
cualquier dato, por ejemplo 1.
En el procedimiento Transformar/Calcular introducimos en el cuadro de expresión
numérica la función:

Por ejemplo RVNORMAL(0,1) para generar números aleatorios de una distribución

8
Estudio y depuración de datos Tema 1

normal de media 0 y desviación típica 1. El resultado es:

Expresiones condicionales
Definida la expresión numérica, el botón Aceptar crea una nueva variable en la que
todos los casos válidos del archivo de datos adoptan el valor resultante de la expresión
numérica propuesta. Ahora bien, la expresión numérica no tiene por qué afectar a
todos los casos del archivo. De hecho, podemos establecer una condición
cualquiera y hacer que las transformaciones propuestas afecten sólo a los casos
que cumplan esa condición. Para ello:
 Pulsar el botón Si... del cuadro de dialogo Calcular variable para acceder al
subcuadro de diálogo Calcular variable: Si los casos

9
Estudio y depuración de datos Tema 1

Este subcuadro de diálogo permite establecer una gran variedad de condiciones para
seleccionar sólo los casos que interesen:
Incluir todos los casos. Con esta opción activa, las transformaciones propuestas
afectan a todos los casos. Es la opción por defecto.
Incluir si el caso satisface la condición. Esta opción hace que las transformaciones
propuestas afecten únicamente a los casos que cumplan la condición establecida. La
condición puede incluir nombres de variables, constantes, operadores aritméticos,
relacionales y lógicos, y funciones matemáticas. Para construir la condición
disponemos de un teclado de calculadora y de una lista de funciones idénticos a los
del cuadro de diálogo Calcular variables.

Si la variable de destino es una variable nueva, los casos seleccionados (aquellos


que cumplen la condición establecida) adoptan en ella el valor resultante de la
expresión numérica; y los casos no seleccionados (los que no cumplen la condición
establecida) se consideran valores perdidos (aparecen puntos en las casillas del
Editor de datos). En nuestro ejemplo dividimos por 2 a HR si HR es mayor de 90 la
variable creada HR_T1 aparece en el editor de datos.

Si la variable de destino es una variable ya existente, los casos seleccionados


adoptan el valor resultante de la expresión numérica y los casos no
seleccionados quedan como estaban.

La expresión numérica puede construirse utilizando la lista de variables del archivo de


datos, los botones de la calculadora y la lista de funciones. Pero también puede

10
Estudio y depuración de datos Tema 1

construirse utilizando el teclado directamente, en cuyo caso hay que tener en cuenta
unas pocas reglas para no cometer errores:
• Los valores de las variables de cadena deben escribirse entre apóstrofos o entre
comillas. Hay que tener especial cuidado en no dejar espacios en blanco donde no
deba haberlos.
• Los argumentos de una función deben ir entre paréntesis y, cuando haya más de
uno, separados por comas. Puede insertarse un espacio en blanco entre un paréntesis
y un argumento, o entre un argumento y otro, pero no es necesario.
• Dentro de una expresión compleja, todas las expresiones simples deben estar
completas.
Por ejemplo, edad > 18 & < 30 es una expresión incorrecta, por incompleta. La
expresión correcta es: edad > 18 & edad < 30.
• El punto es el único separador decimal válido, independientemente de las
especificaciones internacionales seleccionadas en Windows.

1.3 Recuento de valores en los casos.


Esta opción sirve para crear variables nuevas a partir del número de veces que se
repite uno o más valores determinados en un conjunto de variables. Una variable
creada con esta opción contiene, para cada caso, el valor resultante de contar el
número de veces que el(los) valor(es) seleccionado(os) aparece(n) en el conjunto de
variables seleccionadas.
Contar apariciones es útil, por ejemplo, para contar el número de valores perdidos
que acumula cada caso del archivo, o para corregir el número de aciertos de los
sujetos en preguntas de opción múltiple, etc. Para contar valores:
| Seleccionar la opción Contar apariciones

11
Estudio y depuración de datos Tema 1

Variable de destino. Se refiere al nombre de la nueva variable: la variable que


recogerá el resultado del recuento. El nombre de la variable de destino puede ser
nuevo o puede ser el de una variable ya existente. En Este caso, al pulsar el botón
Aceptar aparece un mensaje de aviso solicitado confirmar o cancelar la acción.
Lógicamente, la variable de destino debe tener formato numérico.
Etiqueta del destino. Permite asignar una etiqueta descriptiva de hasta 120
caracteres a la variable de destino. Si la variable de destino ya existe y tiene etiqueta,
la etiqueta aparece en este cuadro de texto.
Variables. Las variables seleccionadas, es decir, las variables sobre las que
deseamos efectuar el recuento, deben trasladarse a esta lista. Estas variables pueden
ser numéricas o de cadena, pero no ambas cosas.
Definir valores. Para indicar el valor o valores que se desea contar:

 Pulsar el botón Definir valores... para acceder al subcuadro de diálogo Contar


valores dentro de los casos:

El recuadro Valor contiene varias opciones para especificar el valor o valores que se
desea contar. Permite seleccionar valores individuales, rangos de valores o una
combinación de ambas cosas:
Valor. Para contar el número de veces que aparece un valor concreto.

12
Estudio y depuración de datos Tema 1

Perdido por el sistema. Para contar el número de valores perdidos definidos por el
sistema. En la lista de valores aparece SYSMIS.
Perdido por el sistema o usuario. Para contar el número de valores perdidos de
cualquier tipo (definidos por el sistema o definidos por el usuario). En la lista de valores
aparece MISSING.
Rango (...hasta...). Para contar el número de veces que aparecen valores
comprendidos entre los límites del rango definido. No disponible para variables de
cadena.
Rango (Del menor hasta...). Para contar el número de veces que aparecen valores
comprendidos entre el valor más pequeño y el valor especificado. No disponible para
variables de cadena.
Rango (...hasta el mayor). Para contar el número de veces que aparecen valores
comprendidos entre el valor especificado y el mayor. No disponible para variables de
cadena.
La función Contar efectúa, para cada caso del archivo, un recuento del número de
veces que se repite, en el conjunto de variables seleccionadas, cualquier valor de los
añadidos a la lista.

Para construir la lista de valores que se desea contar:


 Seleccionar la opción deseada en el recuadro Valor y, en caso necesario,
introducir el valor o valores en los correspondientes cuadros de texto.
 Desplazar a la lista Contar los valores, mediante el botón Añadir, el valor o
valores definidos.
 Utilizar los botones Cambiar y Borrar para modificar o eliminar,
respectivamente, valores previamente añadidos.

El resultado es

13
Estudio y depuración de datos Tema 1

La función Contar, al igual que la función calcular, puede afectar a todos los casos del
archivo o a sólo un conjunto de casos que cumplan determinada condición. Si se
desea establecer alguna condición:
El botón Si... conduce el subcuadro de diálogo Contar apariciones:
Si los casos el cual permite establecer las condiciones que deben cumplir los casos
seleccionados.

1.4 Recodificación de variables.


La opción Recodificar del menú Transformar permite cambiar los códigos asignados
a los valores de una variable. La recodificación resulta especialmente útil para agrupar
en un único valor diferentes valores de una variable, y para transformar variables con
formato de cadena en variables con formato numérico.
Puede efectuarse sobre las mismas variables (cambiando los códigos de una variable
existente sin cambiar su nombre) o sobre variables distintas (creando una variable
nueva a partir de otra ya existente).

Ejemplo:
Transformar el género en sus iniciales en español M-V en lugar de F-M y . para los
valores Missing

Recodificar en las mismas variables


Para cambiar los códigos de una variable sin cambiar su nombre:
Seleccionar la opción Recodificar > En las mismas variables... del menú
Transformar

14
Estudio y depuración de datos Tema 1

En la recodificación pueden utilizarse tanto variables numéricas como variables de


cadena, pero no al mismo tiempo. Es decir, todas las variables llevadas a la lista
Variables deben tener el mismo tipo de formato. Al trasladar la primera variable, si es
numérica, la lista Variables cambia su nombre a Variables numéricas; si esa primera
variable es de cadena, el nombre de la lista cambia a Variables de cadena.
Si... La recodificación puede efectuarse de forma condicional, es decir, de forma que
sólo afecte a los casos que cumplan determinada condición. Para establecer una
condición:
Pulsar el botón Si... para acceder al subcuadro de diálogo Recodificar en las mismas
variables: Si los casos Este subcuadro contiene todas las opciones necesarias para
efectuar trasformaciones condicionales.

Valores antiguos y nuevos... Una vez seleccionadas las variables que se van a
recodificar, es necesario indicar la recodificación concreta que se desea llevar a cabo.
Para ello, el botón Valores antiguos y nuevos... conduce al subcuadro de diálogo
Recodificar en las mismas variables:

Valor antiguo. Las opciones de este recuadro permiten especificar el valor o valores
de la variable original que se desea recodificar. Ofrece varias alternativas para facilitar
la identificación del valor o valores antiguos:

15
Estudio y depuración de datos Tema 1

Valor. Un valor individual.


Perdido por el sistema. Valores perdidos definidos por el sistema (aparecen como
SYSMIS en la lista de valores). Esta opción no está disponible con variables de
cadena.
Perdido por el sistema o usuario. Valores perdidos de cualquier tipo: definidos por
el sistema o definidos por el usuario (aparecen como MISSING en la lista de valores).
Rango (... hasta ...). Rango de valores comprendidos entre los dos valores indicados.
Esta opción no está disponible con variables de cadena.
Rango (Del menor hasta ...). Rango comprendido entre el valor más pequeño de la
variable y el valor indicado. Esta opción no está disponible con variables de cadena.
Rango (... hasta el mayor). Rango comprendido entre el valor indicado y el valor más
grande de la variable. Esta opción no está disponible con variables de cadena.
Todos los demás valores. Todos los valores de la variable original no definidos
previamente (aparece como ELSE en la lista de valores).

Valor nuevo. En este recuadro debe especificarse el nuevo valor que se desea
asignar al valor o valores antiguos. Ofrece las siguientes alternativas:
Valor. El valor introducido en este cuadro de texto sustituye al valor o valores
antiguos recién definidos. (Si se trata de una variable de cadena, el valor introducido
en este cuadro de texto aparece entre apóstrofos o comillas al trasladarlo a la lista de
valores: por tanto, no hay que poner apóstrofos o comillas a los valores de las
variables de cadena, como ocurre, por ejemplo, en los cuadros de diálogo que
permiten definir una expresión numérica).
Perdido por el sistema. Asigna un valor perdido definido por el sistema (aparece
como SYSMIS en la lista de valores).

Para cada valor o rango de valores que se desee recodificar:


 Indicar el valor o rango de valores antiguos que se desea recodificar utilizando
alguna de las opciones del recuadro Valor antiguo.
 Especificar el nuevo código en el cuadro de texto Valor nuevo.
 Pulsar el botón Añadir para trasladar la recodificación recién definida a la lista
Antiguo Nuevo.

Utilizar los botones Cambiar y Borrar para modificar o eliminar, respectivamente,


recodificaciones previamente añadidas.

16
Estudio y depuración de datos Tema 1

Debe tenerse presente que, es posible asignar el mismo valor nuevo a más de un
valor antiguo (lo cual puede resultar útil, por ejemplo, para fundir en un sólo valor
nuevo valores antiguos no consecutivos).

Recodificar en distintas variables


Para cambiar los códigos de una variable y, al mismo tiempo, crear una variable nueva
con los nuevos códigos (dejando intacta la variable original):
 Seleccionar la opción Recodificar > En distintas variables... del menú
Transformar para acceder al cuadro de diálogo Recodificar en distintas
variables

Este cuadro de diálogo permite crear variables nuevas a partir de los valores de
variables ya existentes. La diferencia está, únicamente, en que aquí es necesario
asignar nombre (y, opcionalmente, etiqueta) a las nuevas variables que deseamos
crear. Para iniciar la recodificación en variables diferentes:

 Seleccionar, en la lista de variables, la variable que se desea recodificar y


trasladarla, mediante el botón flecha, a la lista Var. de entrada Var. de
resultado.
 En el recuadro Variable de resultado, introducir el nombre elegido para la
nueva variable (en el cuadro de texto Nombre) y, si se desea, una etiqueta
descriptiva de hasta 120 caracteres (en el cuadro de texto Etiqueta).

17
Estudio y depuración de datos Tema 1

 Pulsar el botón Cambiar para activar el nuevo nombre y situarlo en la lista Var.
de entrada Var. de resultado junto al nombre de la variable original.

Si... La recodificación puede efectuarse de forma condicional, es decir, de forma que


sólo afecte a los casos que cumplan determinada condición. Para ello:
Pulsar el botón Si... para acceder al subcuadro de diálogo Recodificar en distintas
variables: Si los casos (idéntico al de la figura 5.4). Este subcuadro de diálogo
contiene las opciones necesarias para efectuar trasformaciones condicionales.
Valores antiguos y nuevos... Una vez seleccionadas las variables que se van a
recodificar, es necesario definir la recodificación concreta que se desea llevar a cabo.
Para ello:
 Pulsar el botón Valores antiguos y nuevos... para acceder al subcuadro de
diálogo

Este subcuadro de diálogo es idéntico al anterior, pero contiene un elemento adicional


en el recuadro Valor nuevo:
Copiar valores antiguos. Al marcar esta opción, el valor o valores antiguos
seleccionados se mantienen sin cambios en la nueva variable.
Este subcuadro de diálogo también contiene dos elementos adicionales referidos a las
variables de cadena:

18
Estudio y depuración de datos Tema 1

Las variables de resultado son cadenas. Si la variable receptora de los nuevos


códigos es una variable de cadena, es necesario marcar esta opción y especificar
el ancho de la cadena en la caja Ancho.

Convertir cadenas numéricas en números.


Esta opción permite transformar una variable de cadena en una variable numérica.
Para ello, los valores de la cadena deben ser únicamente números (opcionalmente
acompañados de un signo + o n, o de un separador decimal). Si se activa esta opción
y la cadena contiene algún carácter no numérico, la cadena se convierte en un valor
perdido definido por el sistema.
Los valores antiguos no seleccionados pasan a ser, en la nueva variable, valores
perdidos definidos por el sistema. La opción Todos los demás valores del recuadro
Valores antiguos combinada con la opción Copiar valores antiguos del recuadro
Valores nuevos resulta especialmente útil para conseguir que los valores antiguos no
seleccionados pasen a formar parte de la nueva variable sin ser convertidos en valores
perdidos.

1.5 Categorización de variables.


Categorizar variables consiste en crear una variable categórica a partir de una variable
cuantitativa continua. Las nuevas categorías se pueden hacer dividiendo el intervalo
de valores de la variable en intervalos de igual longitud ó dividiendo de forma
que las categorías tengan aproximadamente la misma frecuencia. En este caso se
toma como base de la transformación los percentiles de la variable continua.
Por ejemplo, la edad de los sujetos medida en años y meses, que es una variable
cuantitativa continua, puede transformarse en una variable categórica creando cuatro
o cinco grupos de edad.
Este tipo de transformación lleva asociada una inevitable pérdida de información, pero
puede resultar útil si se tiene interés en construir tablas de contingencia cruzando la
variable edad con otras variables categóricas como el sexo o la categoría laboral.; o si
se tiene interés en utilizar la edad como variable independiente en, por ejemplo, un
análisis de varianza.
Para categorizar una variable:
Seleccionar la opción Agrupación visual...

19
Estudio y depuración de datos Tema 1

Crear categorías para. Las variables ordinales ó continuas que se vayan a


categorizar deben trasladarse a esta lista. Pulsar continuar y aparece el siguiente
cuadro de dialogo donde seleccionamos la variable y aparece un análisis descriptivo
para orientarnos sobre el número de categorías a crear.

20
Estudio y depuración de datos Tema 1

En nuestro ejemplo el análisis descriptivo nos muestra un posible outlier entre 1300 y
1458,75. De momento no lo eliminamos (los outliers los estudiaremos en el tema
siguiente) e iniciamos la categorización.

Variable categorizada.. El botón Aceptar no está disponible hasta que se da un


nombre a la variable receptora de los nuevos códigos. Por tanto, es necesario asociar
un nombre nuevo al nombre de la variable original. Para ello:

 Introducir el nombre deseado en el cuadro de texto situado junto al botón


variable agrupada.
 Pulsar el botón Nuevo nombre para activar el nombre elegido (es decir, para
asociarlo al nombre original).

El SPSS crea una variable con los nuevos códigos y el nuevo nombre asignado. La
variable original queda intacta. Si la variable original posee etiquetas, a la nueva
variable y a los nuevos códigos se les asignan las mismas etiquetas. Si los valores de
la variable original no poseen etiquetas, los nuevos códigos adoptan como etiquetas
los valores de la variable original.
Continuamos seleccionando en crear puntos de corte

21
Estudio y depuración de datos Tema 1

Tenemos las siguientes opciones para categorizar:

Intervalo de igual amplitud. Basta con seleccionar el primer punto de corte y el


número de puntos de corte (uno menos que el de categorías a crear) y calcula las
categorías automáticamente.

El resultado obtenido es una nueva variable que toma los valores 1, 2, 3, 4, 5, 6 o 7


dependiendo de la categoría a la que pertenece el valor.

22
Estudio y depuración de datos Tema 1

Esta forma de categorizar variables, basada en los valores de los percentiles se


encuentra también disponible en la opción Ntiles del procedimiento Asignar rangos
que se describe en el siguiente apartado.

Igual reparto de frecuencias. La categorización de variables es especialmente útil


cuando vamos a realizar contrastes de independencia en tablas de contingencia. En
este caso es conveniente que la frecuencia de cada categoría sea aproximadamente
igual. Seleccionamos entonces Percentiles iguales

Si pulsamos Aplicar tenemos como quedarían las categorías

23
Estudio y depuración de datos Tema 1

Es fundamental añadir etiquetas para saber cómo se ha hecho la categorización. Para


esto lo más cómodo es seleccionar la opción Crear Etiquetas y las pone
automáticamente indicando los intervalos. El resultado es

Si realizamos un análisis descriptivo para ver como quedan las dos nuevas variables
creadas observamos que en la primera opción amplitudes iguales las categorías tiene
frecuencias muy desiguales incluso hay algunas categorías con frecuencia cero.

INDICE (Binned)
Frequency Percent Valid Percent Cumulative Percent
1 1 3,2 4,0 4,0
2 18 58,1 72,0 76,0
Valid 3 5 16,1 20,0 96,0
7 1 3,2 4,0 100,0
Total 25 80,6 100,0
Missing System 6 19,4
Total 31 100,0

24
Estudio y depuración de datos Tema 1

Mientras que la variable categorizada utilizando los percentiles tiene categorías con
aproximadamente la misma frecuencia. Observemos que en la tabla de frecuencias
aparecen las etiquetas indicando los intervalos en que hemos dividido a la variable.

INDICE (Binned)
Frequency Percent Valid Percent Cumulative Percent
<=162 4 12,9 16,0 16,0
162-176 4 12,9 16,0 32,0
176-188 3 9,7 12,0 44,0
188-216 4 12,9 16,0 60,0
Valid
216-230 3 9,7 12,0 72,0
230-301 4 12,9 16,0 88,0
302,00+ 3 9,7 12,0 100,0
Total 25 80,6 100,0
Missing System 6 19,4
Total 31 100,0

25
Estudio y depuración de datos Tema 1

1.6 Asignación de rangos.


Asignar rangos consiste en sustituir los valores originales de una variable numérica por
enteros consecutivos de 1 a n. El SPSS incluye diferentes métodos para llevar a cabo
esta sustitución.
El SPSS también permite asignar puntuaciones normales y de Savage, y agrupar los
casos según el percentil que les corresponde. Para asignar rangos:
 Seleccionar la opción Asignar rangos a casos... del menú Transformar para
acceder al cuadro de diálogo Asignar rangos a casos que muestra la figura

Variables. Para asignar rangos a una variable debe comenzarse seleccionando la


variable. Para ello:
Marcar la variable en la lista de variables del archivo de datos y trasladarla a la lista
Variables mediante el botón flecha.
Al pulsar el botón Aceptar, el SPSS crea una nueva variable cuyos valores son
enteros consecutivos de 1 a n. La nueva variable recibe de forma automática un nuevo
nombre (el nombre de la variable original precedido por una r) y una etiqueta. La
variable original queda intacta. Si no se marca ninguna otra opción, la asignación de
rangos se hace en orden ascendente (al valor más pequeño se le asigna un 1) y los
empates son sustituidos por la media de los rangos (ver más adelante el apartado
Rangos empatados).
Por. La asignación de rangos puede organizarse por subgrupos. Para ello, es
necesario trasladar a esta lista la variable o variables que definen los subgrupos de
interés.

26
Estudio y depuración de datos Tema 1

Asignar rango 1 a. Las opciones de este recuadro permiten cambiar el orden en el


que son asignados los rangos:
Valor menor. Asigna los rangos en orden ascendente: al valor más pequeño se le
asigna un 1, al valor más pequeño de los restantes se le asigna un 2, etc. Es la opción
por defecto.
Valor mayor. Asigna los rangos en orden descendente: al valor más grande se le
asigna un 1, al valor más grande de los restantes se le asigna un 2, etc
Mostrar tablas de resumen. Con esta opción activa (se encuentra activa por defecto),
al asignar rangos a una variable el SPSS muestra en el Visor de resultados una tabla
con el nombre de la variable original, el nombre de la nueva variable y una etiqueta
descriptiva incluyendo el tipo de rangos utilizados. El Visor no muestra toda esta
información si se desactiva esta casilla.

Tipos de rango
 Pulsar el botón Tipos de rango... (ver figura 5.13) para acceder al subcuadro
de diálogo

Este subcuadro permite seleccionar diferentes métodos de asignación de rangos. Si se


elige más de un método, el SPSS crea una variable diferente con los rangos
correspondientes a cada método seleccionado. La etiqueta que el SPSS asigna de
forma automática a cada nueva variable informa sobre el método de asignación de
rangos utilizado. El SPSS proporciona seis métodos distintos de asignación de rangos:
Rango. Asigna enteros consecutivos de 1 a n. Es la opción por defecto.
Puntuación de Savage. Asigna puntuaciones basadas en una distribución
exponencial. Se calculan según la siguiente formula

27
Estudio y depuración de datos Tema 1

j
1
Rj 1
i 1 n i 1

Se utilizan para comparar diferentes distribuciones exponenciales o cambios de


localización en distribuciones de valores extremos.
Rango fraccional. Asigna el resultado de dividir cada rango por el número de casos
válidos.(Frecuencia relativa acumulada)
Rango fraccional como %. Asigna el rango fraccional multiplicado por 100.
Suma de ponderaciones de casos. Asigna a cada caso, como único rango, el
número de casos válidos. Si utilizamos una variable de agrupación a los casos de
cada grupo se les asigna como puntuación el número de sujetos del grupo al que
pertenecen (por tanto, la puntuación asignada es constante para los casos de un
mismo grupo).
Ntiles. Esta opción divide la distribución en k áreas (áreas porcentuales de
aproximadamente igual tamaño, basadas en el cálculo de percentiles) y asigna a cada
caso, como puntuación, el rango (de 1 a k) del área en la que se encuentra. Se obtiene
el mismo resultado con la opción Categorizar variables del menú Transformar.
Si marcamos todos los tipos de rangos en la salida de SPSS aparece el nombre de
cada una de las variables creadas con su descripción

c
Variables creadas
Variable de Función Nueva Etiqueta
origen variable
a
HR Estimación de proporción PHR Proportion Estimate of HR using
Blom's Formula
Puntuación normal NHR Normal Score of HR using Blom's
Formula
Rango RHR Rank of HR
Puntuación de Savage SHR Savage Score of HR
b
Grupo de percentiles NTI001 Percentile Group of HR
Rango fraccional RFR001 Fractional Rank of HR
Porcentaje de rango PER001 Fractional Rank Percent of HR
fraccional
Suma de ponderaciones de N001 Sum of Case Weights of HR
los casos
a. Los rangos se encuentran en orden ascendente.
b. Se generarán 4 grupos.
c. El rango promedio de los valores empatados se utilizará para los empates.

28
Estudio y depuración de datos Tema 1

Si ordenamos por la variable HR

29
Estudio y depuración de datos Tema 1

Además de varias opciones para asignar rangos a los casos, el cuadro de diálogo
Asignar rangos contiene también opciones para:
1) obtener estimaciones de la proporción de casos acumulada hasta cada rango y
2) calcular las puntuaciones típicas normales que corresponden a esas proporciones.
Para obtener esta información adicional:

Estimaciones de la proporción. Estima la proporción acumulada (el área acumulada


de la distribución) que corresponde a cada rango concreto.

Puntuaciones normales. Asigna las puntuaciones típicas z que corresponden en la


curva normal tipificada a las proporciones acumuladas de cada rango. Por ejemplo, a
un rango que acumula una proporción de casos de 0,50, se le asigna una puntuación z
de 0; si acumula una proporción de 0,75, se le asigna una puntuación z de 0,67; etc.

Fórmula de estimación de la proporción. La estimación de la proporción acumulada


que corresponde a cada rango puede efectuarse utilizando diferentes procedimientos
(en todos los casos, Ri se refiere al rango asignado y n al número de casos válidos):

Ri 3 R 1 Ri 1
8 . Tukey. i 3 2 Ri
Blom. Rankit. Van der Waerden.
n 1 4 n 1 3 n n 1

Rangos empatados
Cuando existen casos con los mismos valores, es decir, casos empatados, a cada
caso se le asigna, por defecto, el promedio de los rangos que corresponden a esos
casos. Para utilizar un tratamiento distinto de los empates:

30
Estudio y depuración de datos Tema 1

Pulsar el botón Empates... para acceder al subcuadro de diálogo Asignar rangos a los
casos: Empates

Rango asignado a los empates. El SPSS ofrece cuatro formas distintas de asignar
rangos a los empates.
Media. Asigna la media de los rangos que corresponden a los casos empatados. Es la
opción por defecto.
Menor. Asigna el menor de los rangos que corresponden a los casos empatados.
Mayor. Asigna el mayor de los rangos que corresponden a los casos empatados.
Rangos secuenciales para valores únicos. Asigna rangos de 1 a m, siendo m el
número de valores distintos. Los casos empatados reciben el mismo rango y cuentan
cómo un único caso al computar el rango siguiente.

1.7 Recodificación automática.


La recodificación automática asigna enteros consecutivos de 1 a m a los m valores
diferentes de una variable (sea ésta numérica o de cadena). Es, por tanto, una
asignación de rangos equivalente al método secuencial de tratamiento de los empates
visto en el apartado anterior.
Esta opción resulta particularmente útil si tenemos en cuenta, por ejemplo, que en
algunos procedimientos SPSS (como el análisis de varianza) interesa que los niveles
de los factores estén codificados como enteros consecutivos.
 Seleccionar la opción Recodificación automática... del menú Transformar
para acceder al cuadro de diálogo

31
Estudio y depuración de datos Tema 1

Variable Las variables cuyos códigos se van a recodificar en enteros consecutivos


deben trasladarse a este recuadro. Para ello, hay que seleccionar, en la lista de
variables del archivo de datos, la variable o variables que se van a recodificar y pulsar
el botón flecha para trasladarlas a la lista.

Nuevo nombre. El botón Aceptar no está disponible hasta que se da un nombre a la


variable receptora de los nuevos códigos. Por tanto, es necesario asociar un nombre
nuevo al nombre de la variable original. Para ello:
 Introducir el nombre deseado en el cuadro de texto situado junto al botón
Nuevo nombre.
 Pulsar el botón Nuevo nombre para activar el nombre elegido (es decir, para
asociarlo al nombre original).

El SPSS crea una variable con los nuevos códigos y el nuevo nombre asignado. La
variable original queda intacta. Si la variable original posee etiquetas, a la nueva
variable y a los nuevos códigos se les asignan las mismas etiquetas. Si los valores de

32
Estudio y depuración de datos Tema 1

la variable original no poseen etiquetas, los nuevos códigos adoptan como etiquetas
los valores de la variable original.
Recodificar empezando por. Las opciones de este recuadro permiten cambiar el
orden en el que son asignados los nuevos códigos:
Menor valor. Asigna los códigos en orden ascendente: al valor más pequeño se le
asigna un 1, al valor más pequeño de los restantes se le asigna un 2, etc. Es la opción
por defecto.
Mayor valor. Asigna los códigos en orden descendente: al valor más grande se le
asigna un 1, al valor más grande de los restantes se le asigna un 2, etc. Si la variable
es de cadena, los nuevos códigos se asignan de acuerdo con el orden alfabético de
las categorías (las mayúsculas preceden a las minúsculas). Los valores perdidos son
codificados después de los válidos.

1.8 Manipulación de fechas.


Trabajar con variables en formato de fecha es habitual y sin embargo no es sencillo.
Por esto SPSS nos permite crear fechas o trabajar con ellas mediante la opción Datos-
Definir fechas donde aparece el siguiente cuadro de diálogo

33
Estudio y depuración de datos Tema 1

En este ejemplo los datos de la variable vienen dados por meses desde Enero de
1968. De esta forma asociadas a la variable que contiene los valores de la serie X
aparece la variable fecha.

1.9. El Procedimiento Format

Si queremos recodificar variables tipo carácter en numéricas o viceversa


podemos utilizar el procedimiento Format y las sentencias Format e Informat dentro
del paso Data o los procedimientos. Existen otras formas de recodificar y categorizar
pero consideramos que esta es la sintaxis más sencilla. No confundir la sentencia
Format con el Proc Format, la sentencia Format o Informat asocian un formato ya
existente, creado en el Proc Format, a una o más variables. La sintaxis del Proc
Format es

34
Estudio y depuración de datos Tema 1

PROC FORMAT <opciones>;

INVALUE <$>nombre <(opciones)> valores , rangos , conjuntos;


PICTURE nombre <(opciones)> valores , rangos , conjuntos;
VALUE <$>nombre <(opciones)> valores , rangos , conjuntos;

Veamos cada una de las sentencias y su utilidad para recodificar o categorizar


variables mediante algunos ejemplos.

La sentencia invalue del procedimiento FORMAT crea un formato de entrada para


leer los datos de un fichero. Va asociada a la sentencia Informat que utilizará el
formato creado de lectura. Consideremos los siguientes ejemplos:

El formato de tipo carácter $GENDER. Convierte los valores F y M a valores carácter


'1' y '2': invalue $gender 'F'='1' 'M'='2';

El prefijo dolar indica que el formato de lectura de datos da lugar a datos de tipo
carácter.

Cuando estamos creando formatos de lectura numéricos, podemos especificar


cadenas o números para value-or-range. Por ejemplo, el formato TRIAL. convierte
cualquier cadena que comienza entre A y M en el número 1 y si empieza por N y Z en
el número 2. El informat trata el rango 1-3000 como un rango numérico, que incluye
todos los valores entre 1 y 3000:

invalue trial 'A'-'M'=1 'N'-'Z'=2 1-3000=3;

Si utilizamos un informat numérico para convertir cadenas que no corresponden a


valores o rangos aparecerá un mensaje de error.

El informat CHECK. Utiliza _ERROR_ y _SAME_ para convertir valores del 1 al 4 y


99. Todos los demás valores se consideran error:

invalue check 1-4=_same_ 99=. other=_error_;

La sentencia value crea un formato que especifica cadenas para usar a la hora de
imprimir las variables. Esta sentencia va asociada a su posterior utilización en una
sentencia Format Consideremos los siguientes ejemplos:

El formato de tipo carácter $STATE imprime el código postal de los estados:

value $state 'Delaware'='DE' 'Florida'='FL' 'Ohio'='OH';

35
Estudio y depuración de datos Tema 1

El formato numérico ANSWER escribe los valores 1 y 2 como yes o no:

value answer 1='yes' 2='no';

La sentencia picture se utiliza para dar formato a números. Veamos su


funcionamiento con un ejemplo.

Proc format;
picture ingresos 0-70000='00000' 70001-150000='000000'
other='más de 150000' (noedit);
run;
data uno; input ingre;
cards;
50000
300000
130000
;run;
proc print data=uno;
format ingre ingresos.;
run;

La salida es
Obs ingre

1 50000

2 más de 150000

3 130000

Observemos que los ceros nos indican el espacio reservado al valor y la opción noedit
al final de la sentencia indica que el formato presentado no representa valores sino un
mensaje (categorías). Además podemos utilizar low y high que representan el mínimo
y máximo.

Sobre el ejemplo pacientes vamos a identificar los valores erróneos de una variable y
recodificarlos de forma adecuada.

1.10. Chequeo y recodificación de variables con SAS

1.10.1 Chequeo de los valores de una variable nominal.

Comenzamos creando nuestro fichero de datos SAS permanente (libname) leyendo en


el paso DATA el fichero de texto que contiene los datos.

libname EYDD 'E:\EYDD\Ejemplos';

data EYDD.patients;
infile 'E:\EYDD\Ejemplos\Patients.txt'

input @1 Patno $3.

36
Estudio y depuración de datos Tema 1

@4 gender $1.
@5 Visit mmddyy10.
@15 HR 3.
@18 SBP 3.
@21 DBP 3.
@24 Dx $3.
@27 AE $1.;

LABEL Patno = "Nº paciente"


Gender = "Genero"
Visit = "fecha visita"
HR = "Razón cardiaca"
SBP = "Presión sistólica"
DBP = "Presión diastólica"
Dx = "Codigo de diagnosis"
AE = "Evento Adverso";
format visit mmddyy10.;
run;
proc print data=EYDD.patients; run;

El fichero EYDD.Patients es:

Obs Patno gender Visit HR SBP DBP Dx AE

1 001 M 11/11/1998 88 140 80 1 0

2 002 F 11/13/1998 84 120 78 X 0

3 003 X 10/21/1998 68 190 100 3 1

4 004 F 01/01/1999 101 200 120 5 A

5 XX5 M 05/07/1998 68 120 80 1 0

6 006 06/15/1999 72 102 68 6 1

7 007 M . 88 148 102 0

8 M 11/11/1998 90 190 100 0

9 008 F 08/08/1998 210 . . 7 0

10 009 M 09/25/1999 86 240 180 4 1

11 010 f 10/19/1999 . 40 120 1 0

12 011 M . 68 300 20 4 1

13 012 M 10/12/1998 60 122 74 0

14 013 2 08/23/1999 74 108 64 1

15 014 M 02/02/1999 22 130 90 1

16 002 F 11/13/1998 84 120 78 X 0

17 003 M 11/12/1999 58 112 74 0

18 015 F . 82 148 88 3 1

19 017 F 04/05/1999 208 . 84 2 0

20 019 M 06/07/1999 58 118 70 0

21 123 M . 60 . . 1 0

22 321 F . 900 400 200 5 1

23 020 F . 10 20 8 0

24 022 M 10/10/1999 48 114 82 2 1

37
Estudio y depuración de datos Tema 1

Obs Patno gender Visit HR SBP DBP Dx AE

25 023 f 12/31/1998 22 34 78 0

26 024 F 11/09/1998 76 120 80 1 0

27 025 M 01/01/1999 74 102 68 5 1

28 027 F . . 166 106 7 0

29 028 F 03/28/1998 66 150 90 3 0

30 029 M 05/15/1998 . . . 4 1

31 006 F 07/07/1999 82 148 84 1 0

Para obtener de forma rápida y resumida los valores que toman las variables que
nos interesen haremos un proc freq.

title "Tablas de Frecuencia para las variables nominales";


proc freq data=EYDD.patients;
tables Gender Dx AE / nocum nopercent;
run;

Genero Código de diagnosis Evento Adverso


gender Frequency Dx Frequency AE Frequency
2 1 1 7 0 19
F 12 2 2 1 10
M 14 3 3 A 1
X 1 4 3

f 2 5 3

6 1

7 2

X 2

Si queremos tener una lista de únicamente los valores mal codificados utilizaremos
dos programas distintos para obtenerla. Uno con funciones condicionales y el otro
con el proc format para crear los formatos de lectura y asignar el valor ‟Miscoded‟ a los
valores mal codificados. En ambos casos creamos un fichero de datos auxiliar (data
_null_) para imprimirlo en la ventana de salida (file print) seleccionando los valores mal
codificados con la función put.
Observemos que Gender y AE son chequeadas utilizando el operador IN que indica
que si la variable toma uno cualquiera de los valores de la lista se cumple la condición.
En nuestro caso lo utilizamos negando (not) en este caso si no es ninguno será no
valido y escribimos (put ) en el Output su número de observación y el valor. .

38
Estudio y depuración de datos Tema 1

data _null_;
set EYDD.patients;
file print;
if Gender not in ('F' 'M' ' ') then put Patno= Gender=;

if verify(Dx,' 0123456789') and not missing(Dx) then put Patno= Dx=;

if AE not in ('0' '1' ' ') then put Patno= AE=;


run;

Obtenemos una lista de los valores no válidos

Patno=002 Dx=X
Patno=003 gender=X
Patno=004 AE=A
Patno=010 gender=f
Patno=013 gender=2
Patno=002 Dx=X
Patno=023 gender=f

La variable Dx está chequeada con la función verify donde comprobamos si contiene


dígitos del 0 al 9 y ó espacios.
Otra opción para encontrar valores no válidos es utilizar formatos. La ventaja
que tiene esta opción se presenta sobre todo si tenemos varias variables que tienen el
mismo formato. En este caso, lo definiríamos en un proc Format y luego lo
aplicaríamos en la sentencia format de los procedimientos y a las variables que lo
utilicen.
proc format;
value $gender 'F','M' = 'Valid'
' ' = 'Missing'
other = 'Miscoded';

value $ae '0','1' = 'Valid'


' ' = 'Missing'
other = 'Miscoded';
run;

title "Imprimimos un lista con los datos mal codificados ";


data _null_;
set EYDD.patients(keep=Patno Gender AE);
file print; /*envia los datos mal codificados a la ventana output*/
if put(Gender,$gender.) = 'Miscoded' then put Patno= Gender=;
if put(AE,$ae.) = 'Miscoded' then put Patno= AE=;
run;

La salida es:

Patno=003 gender=X
Patno=004 AE=A
Patno=010 gender=f
Patno=013 gender=2
Patno=023 gender=f

39
Estudio y depuración de datos Tema 1

En este programa hemos utilizado la función PUT que junto con la INPUT son muy
útiles para crear variables recodificadas con un formato determinado. La sintaxis de
estas funciones es:

Variable_r (carácter)= PUT(variable, formato)

Es decir creamos una variable carácter que contiene los valores de la variable con el
formato que hemos creado antes mediante una sentencia value. Este formato
debe ser del mismo tipo que la variable que queremos crear. Por esto esta función se
utiliza para recodificar variables carácter o numéricas en carácter.

Variable_r = INPUT(variable, formato)

En este caso creamos una variable que puede ser numérica o carácter dependiendo
del formato que le asignemos. Esta contiene los valores de la variable con el formato
que hemos creado antes mediante una sentencia invalue. Por esto esta función
se utiliza para recodificar variables de cualquier tipo.

1.10.2. Creación de variables alfanuméricas recodificadas.

De nuevo, veremos varias formas de trabajar con valores recodificados. La primera


consiste en crear otra variable con los valores cambiados (recodificación en otras
variables) y la segunda utilizando formatos de lectura o escritura que no cambian el
valor interno de nuestra variable pero si el que aparece en los análisis en los que la
utilizamos con dicho formato.

Ahora veamos cómo utilizar los formatos para chequear los valores de una variable o
recodificarlos. La sentencia invalue del procedimiento FORMAT crea un formato de
entrada para leer o convertir los datos de un fichero si directamente usamos este
formato creado de lectura. En nuestro ejemplo recodificamos las variables de tipo
carácter Gender y AE sustituyendo los valores mal codificados como missing (.).

proc format;

invalue $gen 'F','M' = _same_ other = '.';

invalue $ae '0','1' = _same_ other = '.';


run;

40
Estudio y depuración de datos Tema 1

title "CREAMOS UN FICHERO DONDE RECODIFICAMOS LOS VALORES DE GENERO Y


AE";
data EYDD.PACIENTES2;
infile 'E:\EYDD\Ejemplos\patients.txt' PAD;
Input @1 Patno $3.
@4 Gender $gen.
@27 AE $ae.;
run;
proc print data=EYDD.PACIENTES2; run;

Obs Patno Gender AE

1 001 M 0

2 002 F 0

3 003 . 1

4 004 F .

5 XX5 M 0

6 006 . 1

7 007 M 0

8 M 0

9 008 F 0

10 009 M 1

11 010 . 0

Observemos que la observación 10 cuyo valor era „f‟ se ha recodificado en missing. Si


queremos que no distinga entre mayúsculas y minúsculas utilizaremos la opción
upcase de la sentencia invalue y el proc format sería

proc format;
invalue $gen (UPCASE) 'F'= 'F' 'M' ='M'
other = '.';
invalue $ae '0','1' = _same_
other = '.';
run;
En este caso la salida será

Obs Patno Gender AE

1 001 M 0

2 002 F 0

3 003 . 1

4 004 F .

5 XX5 M 0

6 006 . 1

7 007 M 0

8 M 0

9 008 F 0

10 009 M 1

41
Estudio y depuración de datos Tema 1

Obs Patno Gender AE

11 010 F 0

12 011 M 1

Si en lugar de utilizar la sentencia Infile utilizamos un fichero de datos sas ya


creado mediante la sentencia set, utilizaremos la función INPUT para recodificar
las variables en otras tipo carácter.

proc format;
invalue $gender (upcase) 'F'='F' 'M' ='M' Other = '.';

invalue $ae '0'='0' '1' = '1' other = '.';


run;

title "CREAMOS UN FICHERO DONDE RECODIFICAMOS LOS VALORES DE GENERO Y


AE";
data EYDD.PACIENTES2A ;
set EYDD.PATIENTS;
GENERO=INPUT(gender,$gender.);
ae_r=INPUT(ae,$ae.);
run;

proc print data=EYDD.PACIENTES2A ( OBS=15 KEEP= Patno Gender AE


GENERO ae_r); run;

1.10.3. Chequeo y recodificación de los valores de una variable numérica.

Para una variable numérica lo primero que tenemos que controlar es el rango de
valores que aparecen en el fichero para ver si son valores posibles de la variable.
Además de los valores missing. Esto lo podemos ver de una forma sencilla mediante
el procedimiento means.

LIBNAME EYDD 'E:\EYDD\Ejemplos';

proc means data=EYDD.PATIENTS N NMISS MIN MAX MAXCDEC=3;


TITLE "Chequeando las variables numéricas";
var HR SBP DBP;
RUN;

The MEANS Procedure

Variable Label N N Miss Minimum Maximum


HR Razón cardiaca 28 3 10.000 900.000
SBP Presión sistólica 27 4 20.000 400.000
DBP Presión diastólica 28 3 8.000 200.000

42
Estudio y depuración de datos Tema 1

Observemos que la variable SBP tiene un missing más que las otras, por esto N tiene
uno menos (N son los valores no misssing).

Para detectar las observaciones que se salen fuera del rango de valores posibles de
una variable podemos utilizar el proc format. En nuestro ejemplo HR toman valores
entre 40 y 100, SBP entre 80 y 200 y DBP entre 60 y 120.

PROC FORMAT;
VALUE HR_F 40-100='OK';
VALUE SBP_F 80-200='OK';
VALUE DBP_F 60-120='OK';
RUN;
title "Imprimimos un lista con los datos fuera de rango";
data _null_;
set EYDD.patients(keep=Patno HR SBP DBP);
file print; /*envia los datos mal codificados a la ventana output*/
if put(HR,HR_F.) NE 'OK' OR _ERROR_ GT 0 THEN PUT Patno= HR=;
if put(SBP,SBP_F.) NE 'OK' OR _ERROR_ GT 0 THEN PUT Patno= SBP=;
if put(DBP,DBP_F.) NE 'OK' OR _ERROR_ GT 0 THEN PUT Patno= DBP=;
run;
El resultado es la siguiente tabla en la ventana output.

Patno=004 HR=101
Patno=008 HR=210
Patno=008 SBP=.
Patno=008 DBP=.
Patno=009 SBP=240
Patno=009 DBP=180
Patno=010 HR=.
Patno=010 SBP=40
Patno=011 SBP=300
Patno=011 DBP=20
Patno=014 HR=22
Patno=017 HR=208
Patno=017 SBP=.
Patno=123 SBP=.
Patno=123 DBP=.
Patno=321 HR=900
Patno=321 SBP=400
Patno=321 DBP=200
Patno=020 HR=10
Patno=020 SBP=20
Patno=020 DBP=8
Patno=023 HR=22
Patno=023 SBP=34
Patno=027 HR=.
Patno=029 HR=.
Patno=029 SBP=.
Patno=029 DBP=.

Si queremos que los datos mal codificados sean tratados como missing (.) podemos
recodificarlos como tal utilizando el proc Format para crear el formato de lectura
adecuado para los valores y guardarlos en un nuevo fichero.

43
Estudio y depuración de datos Tema 1

proc format;
PICTURE HR_F 40-100='000' other = .;
PICTURE SBP_F 80-200='000' Other = .;
PICTURE DBP_F 60-120='000' other = .;
run;

data EYDD.PACIENTES3;
set EYDD.patients;
KEEP PATNO HR SBP DBP;
FORMAT HR HR_F. SBP SBP_F. DBP DBP_F. ;
run;
proc print data=EYDD.PACIENTES3; run;
El nuevo fichero contiene solo las cuatro variables que hemos guardado y los valores
fuera de rango se han sustituido por puntos. Ponemos al lado la tabla que obtuvimos
antes de lo valores fuera de rango para comprobar que han sido sustituidos

Obs Patno HR SBP DBP


Patno=004 HR=101
1 001 88 140 80 Patno=008 HR=210
2 002 84 120 78 Patno=008 SBP=.
Patno=008 DBP=.
3 003 68 190 100 Patno=009 SBP=240
4 004 . 200 120 Patno=009 DBP=180
Patno=010 HR=.
5 XX5 68 120 80 Patno=010 SBP=40
6 006 72 102 68 Patno=011 SBP=300
Patno=011 DBP=20
7 007 88 148 102 Patno=014 HR=22
8 90 190 100
Patno=017 HR=208
Patno=017 SBP=.
9 008 . . . Patno=123 SBP=.
10 009 86 . .
Patno=123 DBP=.
Patno=321 HR=900
11 010 . . 120 Patno=321 SBP=400
Patno=321 DBP=200
12 011 68 . .
Patno=020 HR=10
13 012 60 122 74 Patno=020 SBP=20
Patno=020 DBP=8
14 013 74 108 64
Patno=023 HR=22
15 014 . 130 90 Patno=023 SBP=34
Patno=027 HR=.
16 002 84 120 78
Patno=029 HR=.
17 003 58 112 74 Patno=029 SBP=.
Patno=029 DBP=.
18 015 82 148 88

19 017 . . 84

20 019 58 118 70

21 123 60 . .

22 321 . . .

23 020 . . .

24 022 48 114 82

25 023 . . 78

26 024 76 120 80

27 025 74 102 68

44
Estudio y depuración de datos Tema 1

28 027 . 166 106

29 028 66 150 90

30 029 . . .

31 006 82 148 84

Si queremos recodificar en otras variables distintas utilizaremos la función


input:

proc format;
INVALUE HR_F 40-100=_SAME_ other = .;
INVALUE SBP_F 80-200=_SAME_ Other = .;
INVALUE DBP_F 60-120=_SAME_ other= .;
run;

data EYDD.PACIENTES3;
set EYDD.patients;
KEEP PATNO HR SBP DBP HR_R SBP_R DBP_R;
HR_R=INPUT(HR, HR_F.);
SBP_R=INPUT(SBP, SBP_F.);
DBP_R=INPUT(DBP, DBP_F.);
run;
proc print data=EYDD.PACIENTES3 (OBS= 15) ; run;

Obs Patno HR SBP DBP HR_R SBP_R DBP_R

1 001 88 140 80 88 140 80

2 002 84 120 78 84 120 78

3 003 68 190 100 68 190 100

4 004 101 200 120 . 200 120

5 XX5 68 120 80 68 120 80

6 006 72 102 68 72 102 68

7 007 88 148 102 88 148 102

8 90 190 100 90 190 100

9 008 210 . . . . .

10 009 86 240 180 86 . .

11 010 . 40 120 . . 120

12 011 68 300 20 68 . .

13 012 60 122 74 60 122 74

14 013 74 108 64 74 108 64

15 014 22 130 90 . 130 90

45
Estudio y depuración de datos Tema 1

1.11. Categorización de variables.


Para agrupar valores de una variable en categorías vamos a ver 4 formas posibles.
Utilizando IF THEN ELSE
Calculamos los percentiles

title "PROC UNIVARIATE para calcular los percentiles";


proc univariate data=EYDD.patients NOPRINT;
id Patno;
var HR SBP DBP;
output out=Pctls pctlpts = 10 20 30 40 50 60 70 80 90
pctlpre = HR
pctlname = pct10 pct20 pct30 pct40 pct50 pct60
pct70 pct80 pct90;
run;
PROC PRINT DATA=Pctls; run;

HRpct10 HRpct20 HRpct30 HRpct40 HRpct50 HRpct60 HRpct70 HRpct80 HRpct90

22 58 66 68 74 82 84 88 208

Y ahora dividimos la variable en categorías utilizando estos puntos de corte creando la


nueva variable CAT. Además hacemos un proc freq para comprobar como ha
quedado repartida la frecuencia en as categorías.

DATA CATEP1 (KEEP=HR CAT);


SET EYDD.PATIENTS;
IF 0 LE HR LT 58 then CAT=1;
ELSE IF 58 LE HR LT 68 THEN CAT=2;
ELSE IF 68 LE HR LT 82 THEN CAT=3;
ELSE IF 82 LE HR LT 88 THEN CAT=4;
ELSE IF 88 LE HR THEN CAT=5;
RUN;
PROC PRINT DATA=CATEP1;
run;
PROC FREQ DATA= CATEP1;RUN;

El fichero CATEP1 contiene la variable HR y la categorizada. Las primeras


observaciones son:
Obs HR CAT

1 88 5

2 84 4

3 68 3

4 101 5

5 68 3

6 72 3

7 88 5

8 90 5

46
Estudio y depuración de datos Tema 1

Si analizamos la distribución de frecuencias de HR y de CAT, vemos que las


frecuencias de las categorías no son exactamente 20% porque los valores son
enteros y se repiten.

The FREQ Procedure

Razón cardiaca

HR Frequency Percent Cumulative Cumulative


Frequency Percent CAT Frequency Percent Cumulative Cumulative
Frequency Percent
10 1 3.57 1 3.57
1 4 14.29 4 14.29
22 2 7.14 3 10.71
2 5 17.86 9 32.14
48 1 3.57 4 14.29
3 7 25.00 16 57.14
58 2 7.14 6 21.43
4 5 17.86 21 75.00
60 2 7.14 8 28.57
5 7 25.00 28 100.00
66 1 3.57 9 32.14

68 3 10.71 12 42.86

72 1 3.57 13 46.43

74 2 7.14 15 53.57

76 1 3.57 16 57.14

82 2 7.14 18 64.29

84 2 7.14 20 71.43

86 1 3.57 21 75.00

88 2 7.14 23 82.14

90 1 3.57 24 85.71

101 1 3.57 25 89.29

208 1 3.57 26 92.86

210 1 3.57 27 96.43

900 1 3.57 28 100.00

Como vemos es conveniente poner etiquetas a los valores de la nueva variable creada
para poder interpretarla correctamente.

Utilizando SELECT.
Esta función equivale a la anterior pero es más cómoda de utilizar especialmente
cuando el número de condiciones a evaluar es alto. Veamos como crearíamos la
variable categorizada con esta función.

DATA CATEP2 (KEEP=HR CAT);


SET EYDD.PATIENTS;

47
Estudio y depuración de datos Tema 1

SELECT;
WHEN (0 LE HR LT 58) CAT=1;
WHEN (58 LE HR LT 68) CAT=2;
WHEN (68 LE HR LT 82) CAT=3;
WHEN (82 LE HR LT 88) CAT=4;
OTHERWISE CAT=5;
END;
RUN;

PROC PRINT DATA=CATEP2;


run;
PROC FREQ DATA= CATEP2;RUN;

La salida es la misma de antes.

Utilizando el PROC FORMAT.


Una de las ventajas de hacer la recodificación utilizando formatos es que no hay
necesidad de crear otra variable que sea la categorizada sino simplemente utilizar el
formato o en el paso DATA o en los procedimientos en los que vayamos a utilizar la
variable.

PROC FORMAT;
VALUE HRF 0-58='<58'
58-68 ='58-68'
68-82 ='68-82'
82-88 ='82-88'
90-HIGH='>90';
RUN;
PROC PRINT DATA=EYDD.PATIENTS (KEEP=Patno HR);
FORMAT HR HRF.;
run;
PROC FREQ DATA= EYDD.PATIENTS (KEEP= HR);
FORMAT HR HRF.;RUN;

Obs Patno HR
Razón cardiaca
1 001 82-88
HR Frequency Percent Cumulative Cumulative
2 002 82-88
Frequency Percent
3 003 58-68
<58 6 21.43 6 21.43
4 004 >90
58-68 6 21.43 12 42.86
5 XX5 58-68
68-82 6 21.43 18 64.29
6 006 68-82
82-88 5 17.86 23 82.14
7 007 82-88
>90 5 17.86 28 100.00
8 >90

Si además queremos crear una variable que sea la variable categorizada podemos
hacerlo con la función PUT, que ya utilizamos antes.

48
Estudio y depuración de datos Tema 1

DATA CATEP3;
SET EYDD.PATIENTS;
CATEGORIA=PUT(HR,HRF.);
RUN;
PROC PRINT DATA=CATEP3 (KEEP=HR CATEGORIA);
RUN;
Obs HR CATEGORIA

1 88 82-88

2 84 82-88

3 68 58-68

4 101 >90

5 68 58-68

6 72 68-82

7 88 82-88

8 90 >90

1.12. Análisis y manipulación de fechas.


¿QUÉ SON LOS VALORES DE FECHA Y HORA SAS?
Hay tres formas principales de medir el tiempo en el Sistema SAS. Estos son
conocidos como fecha, hora y valores DATETIME. Cada uno es un valor numérico que
mide desde el punto de partida arbitrario contando el número de unidades de tiempo
transcurrido. Aunque un poco incómodo para nosotros como programadores SAS para
acostumbrarse a ellos, esto es muy bueno para el equipo, ya que todos los cálculos de
intervalo se convierten en simple adición y operaciones de resta.
Los valores de fecha se almacenan como el número de días que han transcurrido
desde el inicio del tiempo (1 de enero de 1960).
Los valores de tiempo son el número de segundos que han transcurrido desde la
medianoche del día actual.
El valor DATETIME cuenta el número de segundos que han transcurrido desde la
medianoche del 1 de enero de 1960.
Por ejemplo: El 28 de julio de 2004 a las 11:32 am el valor SAS FECHA es 16,280 días
desde 1 de enero de 1960. También es 41.520 segundos desde la medianoche (el
valor de TIEMPO), y el valor DATETIME es 1406633520 segundos desde la
medianoche 01 de enero 1960.
Obviamente, los números de este tipo son difíciles de interpretar para nosotros, por
esto SAS ha creado una serie de herramientas para mostrar estos valores de forma
más cómoda.
Sas dispone de una lista especial de funciones para manipular fechas y horas. A
continuación presentamos la lista de las más utilizadas con una breve explicación.

49
Estudio y depuración de datos Tema 1

FUNCIONES DE TIEMPO Y FECHAS DE SAS

DATDIF Calcula el número de días entre dos fechas


DATYR Calcula el número de años entre dos fechas
DATE Fecha de hoy en formato de fecha de sas
DATEPART Extrae la fecha de un formato con fecha y hora
DATETIME Fecha y hora de ahora mismo en formato de sas
DAY Dia del mes de un valor de fecha de sas
DHMS Fecha ,Horas minutos y segundos
HMS Tiempo en horas minutos y segundos
HOUR Nos da la hora de una fecha o tiempo que la contenga
INTCK Calcula el número de intervalos de tiempo en un periodo dado.
INTNX Aumenta una unidad de tiempo y nos va dando la fecha o la hora mas esa unidad
de una indicada. (Se utiliza para crear variables con la fecha de cada observación
para series)
MDY Fecha en formato mes, día año.
MINUTE Minuto de un Fecha y hora
MONTH Mes de una fecha
QTR Trimeste de una fecha
SECOND Segundo
TIME Hora de ahora mismo.
TIMEPART Extrae la parte de hora de una fecha y hora
TODAY Fecha de hoy en formato de fecha de sas
WEEKDAY Dia de la semana de una fecha
YEAR Año
YRDIF Diferencia de años entre dos fechas

Creación de constantes de fecha y tiempo en sas.

data sampdate;
sampdate = '28jul2004'd;
samptime = '11:32't;
sampdtime= '28jul2004:11:32'dt;
put sampdate=;
put samptime=;
put sampdtime=;
run;

El resultado en el Log es

sampdate=16280
samptime=41520
sampdtime=1406633520

50
Estudio y depuración de datos Tema 1

Si queremos ver estos valores en su formato habitual tendremos que utilizar los
formatos de sas.

proc print;
format sampdate date.;
format samptime time.;
format sampdtime datetime.;
run;
El resultado es:
Obs sampdate samptime sampdtime
1 28JUL04 11:32:00 28JUL04:11:32:00

Crear valores FECHA Y HORA a partir de variables.


A veces tenemos la información de fecha y / o el tiempo en nuestro fichero en formatos
que no son los adecuados para sas. A continuación mostramos algunas de las
funciones que se pueden utilizar para crear valores de fecha y hora.
Por ejemplo fusionando variables que contienen partes de la fecha o de la hora.
data dtvalues;
day=10;
mon=8;
yr=2004;
hr=10;
min=30;
sec=0;
sampdate = mdy(mon,day,yr);
samptime = hms(hr,min,sec);
sampdtime= dhms(sampdate,hr,min,sec);
current = today();
run;

proc print;
format sampdate current date.;
format samptime time.;
format sampdtime datetime.;

run;

Obs day mon yr hr min sec sampdate samptime sampdtime current


1 10 8 2004 10 30 0 10AUG04 10:30:00 10AUG04:10:30:00 09MAR11

La función today nos da la fecha actual según los datos almacenados en el reloj del
ordenador.

51
Estudio y depuración de datos Tema 1

Formatos para fecha y hora.


Como se ha demostrado en todos los ejemplos anteriores, cuando un valor de fecha y
hora se muestra su valor en bruto (número de días transcurridos desde el comienzo
del tiempo) no es muy legible. SAS suministra un número de formatos que han sido
específicamente diseñados para su uso con los valores de fecha y hora. Hay muchos
más de estos que se muestran aquí, en la ayuda de sas tenemos una tabla con todos
los formatos posibles. En el ejemplo siguiente mostramos algunos.

data extensions;
sampdate = '28jul2004'd;
put ' ' sampdate= mmddyy10.;
put 'b ' sampdate= mmddyyb10.;
put 'c ' sampdate= mmddyyc10.;
put 'd ' sampdate= mmddyyd10.;
put 'n ' sampdate= mmddyyn8.;
put 'p ' sampdate= mmddyyp10.;
put 's ' sampdate= mmddyys10.;
run;

En el Log tendríamos:

Sampdate = 07/28/2004
b sampdate = 07 28 2004
c sampdate = 07:28:2004
d sampdate = 07-28-2004
n sampdate = 07282004
p sampdate = 07.28.2004
s sampdate = 07/28/2004

Crear una variable que sea la fecha asociada a una serie

Si queremos crear una variable que sea la fecha asociada a una serie temporal
utilizaremos la función Intnx. Esta función incluida en el paso Data genera una
variable con la fecha empezando en la fecha que marquemos y avanzando una unidad
con cada observación. Por ejemplo,
data fechas1;
input serie ;
date = intnx( 'month', '01sep78'd, _n_-1 );
format date monyy.;
cards;
47.395
45.73
44.647
45.087
46.1
45.045
44.752
;
proc print; run;

52
Estudio y depuración de datos Tema 1

Cuya salida es
Obs serie date

1 47.395 SEP78

2 45.730 OCT78

3 44.647 NOV78

4 45.087 DEC78

5 46.100 JAN79

6 45.045 FEB79

7 44.752 MAR79

Observemos que comienza en la fecha que hemos puesto, pero el formato es el


indicado en format. El _n_ -1 es el incremento en la fecha por cada lectura de una
línea de datos. Le restamos 1 para que, para la primera observación leída, la fecha se
incremente en cero es decir empiece en la fijada.

data period;
sampdate = '28jul2004'd;
start = intnx('month',sampdate,0);
stop = intnx('month',sampdate,1) - 1;
put sampdate= worddate18.;
put start= date9.;
put stop= mmddyy10.;
run;

sampdate=July 28, 2004


start=01JUL2004
stop=07/31/2004

Calcular el tiempo transcurrido entre dos fechas en años.

Si queremos calcular el tiempo transcurrido entre dos fechas en años utilizaremos la


función yrdif , cuya sintaxis viene explicada en el siguiente ejemplo. Cuando tenemos
la fecha de nacimiento en un fichero podemos utilizar esta función para calcular la
edad calculando la diferencia con la fecha de hoy.

data _null_;
file print;
sdate='16oct1998'd;
edate='16feb2003'd;
years=yrdif(sdate, edate, 'ACT/ACT');
put years=;
run;

53
Estudio y depuración de datos Tema 1

El resultado aparece en la ventana output

years=4.3369863014

Chequeo de fechas.
Supongamos que en nuestro ejemplo las fechas de las visitas deben estar entre el 1
de Junio de 1998 y el 15 de Octubre 1999.

title "fechas antes del 1 de Junio de 1998 o después del 15 de octubre


de 1999";
data _null_;
file print;
set EYDD.patients(keep=visit patno);
if visit lt '01jun1998'd and not missing(visit) or
visit gt '15oct1999'd then put Patno= Visit= mmddyy10.;
run;

Obtenemos

Patno=XX5 Visit=05/07/1998
Patno=010 Visit=10/19/1999
Patno=003 Visit=11/12/1999
Patno=028 Visit=03/28/1998
Patno=029 Visit=05/15/1998

También podemos obtener este listado con un proc print


proc print data=EYDD.patients;
where Visit not between '01jun1998'd and '15oct1999'd and
not missing(Visit);
id Patno;
var Visit;
format Visit date9.;
run;

Patno Visit

XX5 07MAY1998

010 19OCT1999

003 12NOV1999

028 28MAR1998

029 15MAY1998

54

You might also like