Sunteți pe pagina 1din 10

Crear variables nuevas o modificar las existentes: los

comandos generate / replace y egen

Para crear nuevas variables (generalmente a partir de otras variables en su conjunto de datos, más
algunas expresiones aritméticas o lógicas), o para modificar variables que ya existen en su conjunto de
datos, Stata proporciona dos versiones de básicamente los mismos procedimientos: el comando
generate se usa si un nuevo La variable se debe agregar al conjunto de datos, mientras que
replace, obviamente, se usa para reemplazar una variable antigua (= ya existente). Para los
principiantes, puede ser importante tener en cuenta que en el momento en que se genera una variable,
existe; por lo tanto, incluso una variable que se acaba de crear a través de generate, en el siguiente
paso debe ser abordada por replace.

Tenga en cuenta que el software estadístico moderno ofrece una amplia gama de posibilidades, y una
breve guía como la mía no puede hacer justicia a todos ellos. Aun así, esta entrada es bastante larga.

Introducción y algunos ejemplos.


Por una vez, permítanme comenzar con una formulación general de la sintaxis:

generate newvar = expresión

La "expresión" puede ser un argumento matemático. Por ejemplo,

gen dist_abs = abs(distance)

devolverá el valor absoluto de la distancia variable, es decir, los valores negativos se convertirán en
valores positivos. Pero la mayoría de las veces "expresión" contendrá operadores matemáticos, como
en el siguiente ejemplo:

gen pcincome = income / nhhmembers

Es decir, se crea un "ingreso per cápita" variable dividiendo el ingreso total por el número de miembros
del hogar. Por supuesto, los operadores y otros argumentos pueden combinarse, y los paréntesis
pueden usarse para aclarar el orden en el que se supone que los operadores deben trabajar.
El comando replace funciona de la misma manera, excepto que en el lado izquierdo del signo "igual"
se nombra una variable que ya está presente en su conjunto de datos. Aunque esto no es típico, esta
variable también puede aparecer en el lado derecho del signo "igual", como en:

replace distance = log(distance)

Si tiene sentido o no hacer algo como esto depende de usted. Pero no replace es necesario con poca
frecuencia si no puede o no desea crear una nueva variable de una sola vez. Por ejemplo, primero puede
definir una nueva variable con generate y luego modificarla para un subconjunto de casos (es decir,
si se cumplen ciertas condiciones). En este caso, deberá hacer referencia a la variable replace en
todos los pasos posteriores.
La oración anterior muestra, aunque implícitamente, eso generate y replace se puede combinar
con una cláusula if (como casi cualquier otro comando Stata). Considere el siguiente ejemplo de la
vida real: en las encuestas, a los encuestados a menudo se les pregunta sobre sus ingresos. Si no
quieren dar una cifra exacta, se les pregunta si sus ingresos están dentro de un determinado rango de
ingresos; Esto a menudo desencadena un número considerable de respuestas adicionales, aunque algo
menos exactas. Supongamos que las respuestas exactas se almacenan en variable income_1 y las
respuestas categorizadas en income_2. Los encuestados que han dado una respuesta exacta tienen
un valor de 98 en income_2, mientras que todos los que han dado una respuesta categorizada tienen
un valor menor que eso (digamos, de "1" para "0 a 300 euros" a 15 para "más de 10,000 euros"). Ahora,
es posible que desee combinar ambos tipos de respuesta en una sola variable:

generate income_combined = income_1


replace income_combined = income_2 if income_2 < 98

Por cierto: generate puede ser abreviado por gen o incluso g, mientras que no hay abreviatura para
replace.

En las siguientes secciones se detallarán más los operadores utilizados (es decir, expresiones como "/"
oder "<"); pero primero algunas observaciones más generales.

Etiquetas de valor
Puede conectar una variable recién creada al nombre de una etiqueta de valor, como en:

gen leftright:lflabel = 1 if var13 < 3

La etiqueta de valor "lflabel" puede o no haber sido definida.

Tipo de almacenamiento
Puede ser importante crear una variable de cierto tipo de almacenamiento . Por ejemplo, si una variable
que desea crear debe almacenarse en el formato "largo" (apto para enteros de hasta 8 dígitos), esto
puede especificarse de la siguiente manera:

g long income_combined = income_1 + income_2 + income_3

Debe usar uno de los tipos de almacenamiento para valores enteros (byte, entero o largo) siempre que
sea apropiado, ya que los tipos de datos para variables con valores decimales (flotante o doble) pueden
causar problemas desordenados (aunque manejables).

Las variables de cadena pueden tener una longitud de 1 a 244 caracteres; el formato es "stringX" con X
siendo reemplazado por el número de caracteres que desea asignar a la variable.

Operadores y funciones matemáticas.


Como se describió anteriormente, a menudo querrá usar algunas matemáticas al crear o cambiar
variables, como sumar, multiplicar, etc. Los operadores matemáticos básicos disponibles son los
siguientes:
+ adición
- sustracción
* * multiplicación
/ / división
^ poder

Hay una gran cantidad de funciones disponibles (ver help functions para más información). Aquí
hay unos ejemplos:

abs(x) valor absoluto de x


Exp(x) antilog de x
int(x) o trunc(x) truncamiento al valor entero
ln(x), log(x) logaritmo natural de x
round(x) se redondea al entero más cercano de x
x redondeado en unidades de y (es decir, redondeado (x, .1) se redondea a
round(x, y)
un decimal)
sqrt(x) raíz cuadrada de x

runiform() devuelve números distribuidos uniformemente entre 0 y casi 1


rnormal () devuelve números que siguen una distribución normal estándar
devuelve números que siguen una distribución normal con una media de x
rnormal (x, y)
y un sd de y

Tenga en cuenta que las funciones que se refieren a varias variables (como la media, el total o los
parámetros estadísticos, en varias variables) están disponibles con el egen comando (ver más abajo ).

Operadores lógicos y relacionales.


Como se describe en la sección introductoria, a menudo se debe hacer algo "si" algo es el caso; por
ejemplo, si una variable tiene, o no tiene, o es mayor que un cierto valor. Aquí estamos hablando de
operadores relacionales (¿es algo mayor o menor que, o [no] igual a otra cosa?). A menudo, tales
relaciones pueden combinarse; deseamos hacer algo "si este" es el caso "y si" algo más es también el
caso. "Y" y "o" son operadores lógicos. Un ejemplo simple podría ser

gen lonemother = 1 if gender == 1 & partner == 0 & nchild > 0

(Tenga en cuenta que este ejemplo puede estar incompleto; es solo una demostración muy breve). Más
información sobre las transformaciones "condicionales" seguirá en la siguiente sección, pero una. Pero
primero, demos una visión general de los símbolos utilizados para comparar variables o números
(operadores relacionales) y para escribir "y" y "o".
== igual
! = diferente de
>,> = mayor que, mayor o igual que
<, <= menor que, menor o igual que
! no
~ igual que !
& y
| o

Funciones no matemáticas
Otras funciones pueden ser útiles ocasionalmente. Algunos de estos son los siguientes (use "función de
ayuda" en Stata para obtener más información):

generate profession = inlist(isco88, 101, 125, 170, 171, 172, 202, 310)

La nueva variable "profesión" tendrá un valor de 1 si la variable (existente) "isco88" tiene alguno de los
valores que siguen ahora; de lo contrario, el valor será cero. Claramente, esta es una manera simple de
evitar una larga lista de declaraciones del tipo "si ... o ... o ... o ...". Tenga en cuenta que no puede usar
la expresión "170/172" (que significa 170 a 172) aquí. (También tenga en cuenta que los valores que he
usado en este ejemplo son completamente ficticios; "isco88" es en realidad una categorización de
ocupaciones, pero no lo busqué para averiguar cuál de estas se puede denominar profesiones).

generate clerical = inrange(isco88, 400, 490)

La nueva variable "clerical" tendrá un valor de 1 si la variable (existente) "isco88" está entre 400 y 490;
de lo contrario, el valor será 0.

generate agroup = autocode(age, 4, 25, 70)

Esto crea un "grupo" variable de edad variable, que agrupa la edad en 4 categorías de la siguiente
manera:
El rango de 25 a 70 se divide en cuatro intervalos igualmente espaciados (25 a 36.25, más de 36.25 a
47.5, etc.)
Cada valor de edad variable es codificado con el límite superior del intervalo en el que cae en la variable
"grupo".

Transformaciones condicionales

Introducción
Las nuevas variables a menudo usan la información recopilada en otras variables al denotar ciertas
combinaciones de valores. Es decir, la nueva variable obtiene "este" valor, if algo es el caso, o "ese"
valor, if otra cosa es el caso, o finalmente "otro" valor if nuevamente, otra cosa es el caso. Llamo a
tales transformaciones "condicionales": se supone que algo sucederá con la condición de que algo más
sea el caso.

Un caso simple podría referirse a la pregunta de si una persona está casada (y vive con su pareja),
cohabitando (viviendo con una pareja sin estar casada), perteneciendo a una pareja "LAT" (viviendo
juntos) o soltera. La información pertinente puede estar dispersa en varias variables, por ejemplo,
"estado civil", nombrado marstat (con categorías casado / viviendo juntos = 1, casado / separado =
2, divorciado = 3, viudo / er = 4, soltero = 5), " tener una pareja ", partner (sí / no) y" vivir juntos con
la pareja ", livpart (sí / no). Por lo tanto, puede crear su nueva variable de la siguiente manera:

gen hhtype = 1 if marstat == 1


replace hhtype = 2 if marstat > 1 & partner == 1 & livpart == 1
replace hhtype = 3 if marstat > 1 & partner == 1 & livpart == 0

Variables indicadoras
A menudo, las transformaciones condicionales se usan para crear variables indicadoras, es decir, las
variables codificadas "1" para denotar la presencia de una propiedad y "0" para denotar su ausencia (a
veces, particularmente en el contexto de modelos de regresión, tales variables se denominan "ficticias"
variables "). Continuando con el ejemplo del estado civil y el tipo de familia (u hogar), podríamos por
alguna razón tener que crear una variable que solo indique si una persona está casada o no. Esto podría
hacerse de varias maneras, pero sería natural usar una transformación condicional aquí, por ejemplo:

gen married = 1 if marstat == 1 | marstat == 2


replace married = 0 if marstat > 2 & marstat <.

La cláusula & marstat <. evita que los casos con valores faltantes se traten como casos válidos.
Tenga en cuenta que la primera línea también podría ser así:

gen married = 1 if inlist(marstat, 1, 2)

(consulte la sección sobre funciones no matemáticas anteriores), que es útil especialmente si desea
direccionar más de dos valores.
Hay una forma aún más corta de crear una variable codificada 0/1; sin embargo, debe usar esto solo en
ausencia de valores faltantes (o si toma precauciones especiales). Mira el siguiente ejemplo:

gen married = marstat == 1 | marstat == 2

Tenga en cuenta que en la mano derecha del signo igual no indica un valor numérico para asignar; todo
lo que se menciona es una condición, a saber, que un caso debe tener valores 1 o 2 en marstat variable.
Stata asigna automáticamente el valor "1" si esta condición es "verdadera" y el valor "0" si no lo es. Sin
embargo, tenga en cuenta que los casos con valores perdidos pertenecen a la última categoría (no
tienen un valor de 1 o 2), por lo que se agruparán con personas que no estén casadas. Por supuesto, en
este simple ejemplo, esto podría repararse fácilmente agregando una línea como, por ejemplo:

replace married = . if marstat >=.


Tenga en cuenta que hay una manera simple de crear variables ficticias relacionadas con el tab
comando. Este método es muy simple en la medida en que crea una variable indicadora para cada valor
diferente de la variable respectiva. Para continuar nuestro ejemplo,

tab marstat, gen(marst)

creará cinco variables ficticias, marst1 a marst5, cada una representando una de las categorías de
variable marstat. Tenga en cuenta que a los casos con valores faltantes en la variable original se les
asignarán valores faltantes para todas las variables ficticias recién creadas.

Si es "X", haga "esto", si es "Y", haga "eso"

El objetivo de lo que sigue aquí quizás no sea claro para los principiantes, y puede que nunca sea
importante para muchas personas. Pero para algunas tareas de transformación, lo que sigue puede ser
muy útil. El ejemplo que uso requiere cierto conocimiento de los retrasos (se trata más adelante), ya
que este es un contexto en el que la función descrita aquí puede ser particularmente importante.

Es una de las funciones de programación de Stata, que sin embargo puede invocarse en el contexto del
trabajo de todos de escribir do-files. Se nombra la función cond, que obviamente tiene algo que ver
con "condición". Funciona así:

gen highinc = cond(income > 5000, 1, 0)

y hace lo siguiente: si income es mayor que 5000, highinc tendrá un valor de 1, de lo contrario el
valor será 0.

Hasta ahora, puede decir: ¿y qué? El mismo resultado se puede lograr con un simple if comando.
También se puede lograr con la versión "corta" de generar variables ficticias descritas en la sección
anterior, la única diferencia es que puede usar cond con otros valores (resultantes) que no sean 1 y 0
(p. Ej., Puede haber escrito lo gen highinc = cond(income > 5000, -17, 3000)absurdo
que sea) parecer.)

Pero lo bueno de esto condes que puede usarse recursivamente. Por ejemplo, podrías escribir:

gen highinc = cond(income > 5000, 2, cond(income > 3000, 1, 0))

lo que dará como resultado highinc un valor de 2 si el ingreso es> 5000, un valor de 1 si el ingreso es
<= 5000 y> 3000, y un valor de 0 en caso contrario (por cierto: si faltan valores en el ingreso variable,
debe comenzar la secuencia de condiciones con cond(missing(income), ). Habrás notado que
cond(income > 3000)en este ejemplo realmente significa > 3000 and <= 5000, ya que los
casos en que los ingresos son mayores a 5000 nunca llegarán al tercer argumento de la cláusula
principal. Pero, aun así, por elegante que parezca, todo esto también se puede lograr con una serie de
ifs.

Pero ahora mira los siguientes datos. Estos datos describen una serie de episodios en la vida de una
sola persona, con "comenzar" como el mes en que comenzó el episodio y "terminar" como el mes en
que terminó. Piense, por ejemplo, en una persona a la que se le pidió que describiera lo que sucedió
una vez que dejó la escuela. Es posible que esta persona haya tenido un trabajo en el primer mes
(indicado por "j" en la tabla), y en el segundo mes ingresó a la universidad ("c") donde permaneció
hasta el mes 24. Pero, además, ha tenido otro trabajo en los meses 10 a 12 y otro trabajo en los meses
13 a 16.

ID begin end type


1 1 1 j
1 2 24 c
1 10 12 j
1 13 16 j

Tales datos ocurren con frecuencia en las historias de vida, y en realidad este ejemplo sigue el modelo
del Panel Socioeconómico de Alemania (donde 1 se refiere a enero de 1983). Ahora, al analizar estos
datos, me gustaría saber si una persona que tiene un trabajo está o no al mismo tiempo en otro
"estado" (por ejemplo, ir a la universidad). El primer paso sería averiguar, para cada episodio en los
datos, si hay (al menos) otro episodio con el que se superpone. Entonces, en el caso de la tercera y
cuarta línea, me gustaría saber que estos episodios se superponen con el segundo episodio o, en
general, me gustaría saber si hay un episodio que comienza antes (esto se determina por la clasificación
de los datos de acuerdo con "comenzar") pero termina después del comienzo, o incluso el final, del
episodio actual.

Por esta razón, el comando que uso funciona de esta manera (tenga en cuenta que el sufijo se [_n-
1]refiere a la fila anterior en el conjunto de datos; por lo tanto, ID[_n-1]es la ID en la fila
inmediatamente superior a la fila a la que se aplica un comando):

generate maxend = end if ID != ID[_n-1]


replace maxend = cond(end >= maxend[_n-1] & ID == ID[_n-1], end, ///
cond(end < maxend[_n-1] & ID == ID[_n-1], maxend[_n-1], maxend))

y el resultado es:

ID begin end type maxend


1 1 1 j 1
1 2 24 c 24
1 10 12 j 24
1 13 16 j 24

Finalmente, tenga en cuenta que hay una versión especial de este comando: el uso, por ejemplo,
cond(var1,3,1) significa que la nueva variable tendrá un valor de 3 si var1 tiene cualquier otro
valor que no sea cero, y un valor de 1 si var1 es exactamente cero. Entonces, ¿qué pasa con los valores
perdidos? De hecho, en este caso especial debe usar, por ejemplo, lo cond(var1,3,1,-1) que
significa que cuando falta var1, la nueva variable tendrá un valor de -1. Si omite este cuarto argumento,
los valores faltantes se codificarán como 3.

Retrasos y leads
Este encabezado se refiere a variables que se crean o modifican mediante referencia a otra fila en el
conjunto de datos. Considere el siguiente ejemplo: suponga que tiene datos sobre parejas; cada
persona está representada por una fila en el conjunto de datos y ahora es posible que desee definir
variables para cada persona que se refieran al compañero de esa persona.

Por lo general, los datos podrían ordenarse, primero, por la identificación de la pareja, y luego por
género, digamos con la pareja masculina (sexo = 1) primero, seguida de la pareja femenina (sexo = 2).
Para cada persona, hay un "ingreso" variable, y ahora desea crear un "pincome" variable que
represente el ingreso del socio. Procederá de la siguiente manera:

generate pincome = income[_n+1] if sex==1


replace pincome = income[_n-1] if sex==2

La expresión [_n+1] significa que el valor de la variable "ingreso" de la siguiente fila (= la pareja del
hombre) debe asignarse a la variable "pincome"; [_n-1]funcionará de manera análoga. También
puede usar números que no sean 1 si las circunstancias lo exigen.

Extensiones
Se han implementado varias posibilidades más complejas en el comando "egen". Aquí hay algunos que
encontré útiles.

egen nkids = anycount(pers1 pers2 pers3 pers4 pers5), value(1)

Suponga que hay datos para cinco miembros del hogar almacenados en las variables "pers1" a "pers5",
clasificadas por edad, con un valor de 1 que indica que es un niño menor de 14 años. Ahora la variable
"nkids" arrojará el número de niños entre estos cinco miembros del hogar.

egen v323r = rank(v323)

La variable v323r contendrá el rango de cada caso en v323. En caso de empate, a cada caso se le
asignará el rango medio.

egen myindex = rowmean(var15 var17 var18 var20 var23)

Esto creará, para cada caso (o fila), una variable que contenga la media de las variables en la lista de
variables. Tenga en cuenta que, si un caso tiene uno o varios valores faltantes, se calculará "rowmean"
a partir de aquellas variables que tengan valores válidos. Con la ayuda de "rowmiss" (ver el siguiente
ítem) esto puede ser cambiado.

egen nmiss = rowmiss(x1-x10 var15-var23)

Esto almacenará el número de valores faltantes que ocurren en las variables listadas en la variable
"nmiss". La función también rownonmiss está disponible.

Tenga en cuenta que si, por cualquier razón, una variable se incluye dos veces (o incluso con más
frecuencia) en la lista (como en rowmiss(x1 x2 x2 x3)), esto no dará lugar a un error. Por el
contrario, la variable se contará dos veces (o con mayor frecuencia). En el ejemplo que se acaba de
presentar, un caso con un valor faltante en x2 tendría un valor de 2 en la variable pertinente.
egen nmiss = rowtotal(x1-x10 var15-var23)

Esto calculará el total (o suma) de las variables para cada caso (o fila). Sin embargo, tenga en cuenta
que los valores faltantes se contarán como ceros y, por lo tanto, este comando debe usarse con mucha
precaución. Hay una opción, missing, pero esto solo producirá un valor faltante en la variable
resultante si todas las variables que ingresan al cálculo tienen valores faltantes.

egen incomst = std(income)

creará valores estandarizados de la renta variable. Puede "estandarizar" proponiendo una media y una
desviación estándar diferente de los valores habituales de 0 y 1, respectivamente. Para hacerlo, use las
opciones mean(value)y o std(value).

Combinando egen con by

Una serie de funciones para egen son particularmente útiles cuando se combinan con el prefijo by,
ya que se refieren a todos los casos, lo que, en combinación con by, significa todos los casos con el
mismo valor en la variable que sigue al prefijo. Así,

bysort v3: egen mincome = mean(income)

calculará para cada caso la media del ingreso variable del "grupo" definido por v3 al que pertenece el
caso individual (p. ej., ingreso promedio del hogar, distrito, país ... lo que sea que v3 represente). Una
selección de funciones adicionales se puede encontrar aquí:

bysort varX: egen newvar = count El número de casos con valores válidos
(somevar) en somevar
bysort varX: egen newvar = max (somevar) El valor máximo de somevar

bysort varX: egen newvar = sd (somevar) La desviación estándar de somevar

bysort varX: egen newvar = mediana La mediana somevar


(somevar)
El total de somevar (los valores
bysort varX: egen newvar = total
(somevar) faltantes se tratan como 0 en el
cálculo)
El total de somevar (produce un valor
bysort varX: egen newvar = total
(somevar), falta faltante si faltan todos los valores de
somevar)

En la misma línea, puede usar las funciones iqr (rango intercuartil), kurt(curtosis), mad(desviación
absoluta media), mdev(desviación absoluta media), min(intentar y adivinar ...), skew(asimetría).
Finalmente, permítanme mencionar algunas funciones más complejas (complejas solo en la medida en
que necesitan un poco más de explicación):

bysort v3: egen pcincome = pc(income)


calculará para cada caso el porcentaje del total de ingresos. Por ejemplo, si un caso (¡dentro de v3!)
Tiene un ingreso de 500 y un segundo caso tiene un ingreso de 1000, el primer caso tendrá un valor de
33.3333 en pcincome variable, etc. Puede usarlo pc(income), prop en su lugar, lo que generará el
mismo valor expresados como proporciones (es decir, .333333, etc., en nuestro ejemplo).

bysort v3: egen pct30income = pctile(income), p(30)

calculará y asignará a cada caso el valor del percentil 30 del ingreso variable (dentro de v3).
Hay una o dos más de estas funciones que he omitido aquí.

S-ar putea să vă placă și