• No results found

The Failure of the Common Good

A. Domination, Conflicts, and Competition

1. The Failure of the Common Good

El comando foreach construye bucles para cada uno de los item de una lista, donde la lista puede ser nombre de variables (posiblemente dados en una macro) o una lista de n´umeros.

Comencemos por usar una lista de nombre de variables. En este caso la lista es x1var, x2var, x3var y x4var. Como vimos, la ´ultima variable creada fue suma, ahora crearemos otra que sea suma1=0, tal que los valores de esta sean todos iguales a cero. Usaremos esta misma idea para generar la suma de estas cuatro variable usando el comando foreach.

114 5.3. Comandos para Bucles

. // foreach . *--- . *I Forma . gen suma1=0

. foreach var of varlist x1var x2var x3var x4var{ . replace suma1=suma1 + `var´

. } . //

(1000 real changes made) (1000 real changes made) (1000 real changes made) (1000 real changes made)

. *II Forma . replace suma1=0 (1000 real changes made)

. global xvar x1var x2var x3var x4var . foreach var of varlist $xvar { . replace suma1=suma1 + `var´ . }

(1000 real changes made) (1000 real changes made) (1000 real changes made) (1000 real changes made)

. *III Forma

. //Para esto se necesita que exista un orden entre . //desde variables x1var hasta x4var

. replace suma1=0 (1000 real changes made)

. foreach var of varlist x1var-x4var { . replace suma1=suma1 + `var´ . }

(1000 real changes made) (1000 real changes made) (1000 real changes made) (1000 real changes made)

El resultado es el mismo obtenido manualmente. La codificaci´on en este bucle es un ejemplo de una programaci´on, donde se coloca un corchete de apertura { al final de la primera l´ınea de comando y un corchete de cierre } al final del programa. En este bucle, nos referimos a cada variable en la lista de variable llamada varlist a trav´es de la macro local llamada var, as´ı que es necesario el uso de las comillas

especiales para invocar a esta macro local. El nombre de la macro es opcional, pero la palabra varlist si es necesaria para indicarle al STATA que est´a trabajando con una lista de variable. Otros posibles listas que se podr´ıan usar es numlist, newlist, global o local 4.

5.3.2.

El comando forvalues

El comando forvalues iter sobre valores consecutivos, En el siguiente c´odigo, nosotros usamos un ´ındice i para que se una macro local ‘i’.

. // forvalues . *--- . gen suma2=0 . forvalues i=1/4 {

. replace suma2= suma2 + x`i´var . }

(1000 real changes made) (1000 real changes made) (1000 real changes made) (1000 real changes made)

. summarize suma2

Variable Obs Mean Std. Dev. Min Max suma2 1000 2.026775 .5819928 .3077757 3.789982

Como vemos produce el mismo resultado.la elecci´on del nombre i para la macro local fue arbitrario. En este caso espec´ıfico donde el incremento es una unidad, uno puede usar otros incrementos. Por ejemplo, podemos escribir forvalues i=1(2)11, entonces el ´ındice va de 1 hasta 11 en incrementos de 2 unidades.

5.3.3.

El comando while

El comando while continua ejerciendo la operaci´on ordenada hasta que una condici´on ya no sea cumplida. Este comando es utilizado cuando los comandos

116 5.4. Escalares y Matrices

foreach y forvalues no puedan ser utilizados. En el siguiente c´odigo, la macro local i se hace que inicie en el valor de 1 y luego aumenta hasta que i ≤ 4.

. //while . *--- . gen suma3=0 . local i 1 . while `i´ <=4 {

. replace suma3= suma3 + x`i´var . local i= `i´ + 1

. }

(1000 real changes made) (1000 real changes made) (1000 real changes made) (1000 real changes made) . summ suma3

Variable Obs Mean Std. Dev. Min Max suma3 1000 2.026775 .5819928 .3077757 3.789982

5.4.

Escalares y Matrices

Los escalares pueden almacenar n´umeros o string, y las matrices pueden alma- cenar diferentes n´umeros o string como un vector.

5.4.1.

Escalar

Los comandos que nos permite analizar variable (describe, summarize, etc) dan resultados como escalares num´ericos. Podemos ver los contenido de un escalar usando el comando display, tambi´en podemos ver la lista de todos los escalares creados a trav´es del comando scalar list.

. * Escalares y Matrices . *--- . //Escalar

. scalar a = 2*3 . scalar list a = 6 . display "2 veces 3= " a 2 veces 3= 6

5.4.2.

Matrices

STATA provee dos formas distintas para usar matrices, ambas almacenan tanto n´umeros o string en vectores. Una manera es a trav´es de los comandos de STATA que tiene el prefijo matrix. El otro modo es usando el lenguaje de programaci´on que incluye el STATA en esta versi´on llamada MATA. El siguiente c´odigo ilustra la definici´on de una matriz de tama˜no 2 × 3 (con el comando matriz define), la lista de la matriz (matfrix list) y la extracci´on como un escalar de un elemento espec´ıfico del elemento de una matriz.

. //Matrices . *--- . matrix define A = (1,2,3\4,5,6\7,8,9) . matrix list A A[2,3] c1 c2 c3 r1 1 2 3 r2 4 5 6 r2 7 8 9 . scalar a= A[2,3] . display a 6

Tambi´en es posible convertir las variables de una base de datos a una amtriz agrupandolas, a trav´es del comando mkmat. Es recomendable usar la opcion ma- trix() donde se coloca el nombre de la matriz que se va a generar. Para una ilustraci´on, agruparemos las primeras 100 observaciones de lasvariable aleatorias w, x, y, z en una matriz llamada X, pero previamente podemos establecer una memoria m´axima para crear uan matriz, en nuestro caso estableceremos que la matriz puede ser de orden 1000 como m´aximo.

118 5.4. Escalares y Matrices

Current memory allocation

current memory usage settable value description (1M = 1024k) set maxvar 5000 max. variables allowed 1.909M set memory 200M max. data space 200.000M set matsize 1000 max. RHS vars in models 7.713M 209.622M . mkmat w x y z in 1/100, matrix(X)

. matrix list X

Lo interesante del entorno matricial del STATA, es que tiene implementado di- versas funciones que son de gran utilidad como la Transpuesta, el Determinante, la Inversal, los Autovalores y Autovectores de una matriz, entre otros. A continuaci´on se muestra un ejemplo de estas funciones:

. //Operaciones con Matrices

. scalar detA=det(A) //Determinante de A . display "detA =" detA

detA =6.661e-16

. scalar trazaA=trace(A) //Traza de A . display "trazaA =" trazaA

trazaA =15

. matrix define At=A´ //Transpuesta de A . matrix list At At[3,3] r1 r2 r3 c1 1 4 7 c2 2 5 8 c3 3 6 9

. matrix define Ainv=inv(A) //Inversa de A . matrix list Ainv

symmetric Ainv[3,3]

r1 r2 r3 c1 -4.504e+15

c2 9.007e+15 -1.801e+16

c3 -4.504e+15 9.007e+15 -4.504e+15

. matrix define I5=I(5) //Identidad(5) . matrix list I5

symmetric I5[5,5] c1 c2 c3 c4 c5 r1 1 r2 0 1 r3 0 0 1 r4 0 0 0 1 r5 0 0 0 0 1

. matrix define B=J(2,3,0) //Matriz B de 2 filas y 3 columnas lleno de ceros . matrix list B

B[2,3]

c1 c2 c3 r1 0 0 0 r2 0 0 0

. matrix define d=vecdiag(A) //Vector compuesto por los elementos de la diagonal de A . matrix list d

d[1,3]

c1 c2 c3 r1 1 5 9

. matrix define D=diag(d) //Matriz columna cuya diagonal principal es el vector d . matrix list D symmetric D[3,3] c1 c2 c3 c1 1 c2 0 5 c3 0 0 9

5.5.

Usando los Resultados de los Comandos de