Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Codes Lab

    Una tabla que compare las medias entre el grupo de control y los tres grupos del tratamiento. • Por cada grupo incluir el promedio de las variables: a˜nos de educaci´on del jefe del hogar, edad del jefe del hogar. • Indicar si las medias en los grupos de tratamiento son estad´ısticamente diferentes respecto al grupo de control. • Una tabla que muestre los efectos causales de haber estado asignado a cada grupo de tratamiento sobre variables de inter´es: • Las variables son: 1) no hacer nada si se presenta una enfermedad (episode), 2) tomar medicina antimal´arica si se presenta la enfermedad, y 3) tomar un test de diagn´ostico para la malaria.

    clear all
    set more off // No cortar lso datos

    global folder= "direction"

    cd "$folder" /* Indicamos que lo que se haga se use y se guarde se va a ubicar en esta carpeta */

    use MalariaData_reduced.dta, clear

    * Ejemplo de obtener la media para una variable y un grupo

    summarize B_head_edu if control==1 // resumen si el grup de control ==1
    return list // Vemos la lista de r()
    scalar prom_edad_control=`r(mean)'
    display prom_edad_control
    scalar list // Muestra la lista de escalares


    * Loop para obtener las medias de más de una variable a través de todos los grupos, y guardar las medias en una matriz

    foreach var in B_head_edu B_head_age_imputed { /* primer loop: variables */

    if ("`var'"=="B_head_edu") local vars `"1"' /* crear un local numerico para los textos en el loop, así podemos guardar los locales en la matriz C*/
    if ("`var'"=="B_head_age_imputed") local vars `"2"'

    foreach group in control act40 act60 act100 { /* segundo loop: grupos */

    if ("`group'"=="control") local groups `"1"' /* crear un local numerico para los textos en el loop, así podemos guardar los locales en la matriz C */
    if ("`group'"=="act40") local groups `"2"'
    if ("`group'"=="act60") local groups `"3"'
    if ("`group'"=="act100") local groups `"4"'

    summarize `var' if `group'==1 /* obetner la media */
    local mean=`r(mean)' /* guardarla como un local */

    matrix C= nullmat(C) \ (`vars', `groups', `mean') /* en esta matriz se guardan todos los locales */

    }
    }

    mat list C /* Muestra la matriz*/

    * ahora vamos a guardar la matriz C como un archivo csv.

    preserve /* Este comando deja la base en pausa, para que cuando se restaure no se pierda la informacion*/
    matrix colnames C = variable group mean /* crear los nombres de las columnas de la matriz C */
    drop _all /* quitar toda la informacion en la base de datos */
    svmat double C, n(col) /* la matriz C se convierte a una base de datos */
    tostring variable group, replace // Volvemos las col de double a string

    // Cambiamos las cadenas//
    replace variable="educacion" if variable=="1"
    replace variable="edad" if variable=="2"
    replace group="control" if group=="1"
    replace group="tratamiento40" if group=="2"
    replace group="tratamiento60" if group=="3"
    replace group="tratamiento100" if group=="4"
    export delimited means.csv, replace /*guardar la matriz que fue convetida a base de datos */
    restore /*restaurar la base datos que teníamos antes */

    mat drop C /* eliminar la matriz que tenia las medias */

    * De manera estricta, para saber si las medias son significativamente distintas entre los grupos de tratamiento y el grupo control usamos el comando ttest para comparar las medias. Podemos faciltiar el trabajo corriendo regresiones donde la variable dependiente es la variable sobre la que comparamos las medias. Si el coeficiente no es significativo, las medias con alta probabilidad deberían ser estadísticamente iguales.

    gen groups=. /* generamos variable categorica que contiene un numero por cada grupo */
    replace groups=1 if act40==1
    replace groups=2 if act60==1
    replace groups=3 if act100==1
    replace groups=0 if control==1


    // Imprimimos las 2 regresiones juntas en excel y word//
    reg B_head_edu i.groups
    outreg2 using regresiones_controles.doc, excel replace ctitle(educacion) stats (coef se ci) dec(3)
    /*outreg2 using regresiones_controles.doc, excel replace ctitle(educacion) stats (coef se ci) dec(3) //Solo imprimirla en excel */
    reg B_head_age_imputed i.groups
    outreg2 using regresiones_controles.doc, excel append ctitle(edad) stats (coef se ci) dec(3)
    /*outreg2 using regresiones_controles, excel append ctitle(edad) stats (coef se ci) dec(3) //como imprimirla solo en excel */


    * hacer las regresiones sobre las variables de interés. (Solo imprimir excel)

    reg m_took_act i.groups
    outreg2 using regresiones_dependientes, excel replace ctitle(tomarmedicina) stats (coef se ci) dec(3)

    foreach var in m_care_nothing m_took_maltest {

    if ("`var'"=="m_care_nothing") local vars `"hacernada"'
    if ("`var'"=="m_took_maltest") local vars `"tomartest"'

    reg `var' i.groups
    outreg2 using regresiones_dependientes, excel append ctitle(`vars') stats (coef se ci) dec(3)

    }
    Last edited by James Taquito; 05 Dec 2022, 09:13.

  • #2
    Con la base nsw_dw_new.dta, hacer una tabla que contenga estimadores regresiones de MCO que muestren el efecto causal de haber recibido el programa de capacitaci´on sobre el ingreso de 1978. Hacer tres especif´ıcaciones: • 1) sin controles; 2) controles: incluya edad, educaci´on y estado civil como controles; 3) controles: las variables anteriores, m´as ser de raza negra, ser hispano, no tener diploma, el ingreso de 1974 y el ingreso de 1975. • Para las tres regresiones, incluir coeficiente del efecto causal, error est´andar, intervalos de confianza al 95% y n´umero de observaciones. No es necesario incluir el coeficiente de los controles. • Con la base psid_controls_new, hacer una tabla que contenga: • La diferencia de medias incondicional del ingreso de 1978 entre los tratados y los no tratados. • El estimador del efecto de haber recibido el curso de capacitaci´on bajo el m´etodo de propensity score matching: • Construir el score de dos formas: 1) con la edad, educaci´on y estado civil; 2) con las variables anteriores m´as ser de raza negra, ser hispano, no tener diploma, el ingreso de 1974 y el ingreso de 1975. • Incluir coeficiente del efecto causal y el error est´andar.

    global folder="PONER AQUI EL DIRECTORIO DE LA CARPETA DONDE GUARDARON SU BASE DE DATOS"

    cd "$folder"

    use nsw_dw_new.dta, clear

    * Hacer las regresiones de MCO para obtener el estimador de un experimento aleatorio.

    reg re78 treat
    outreg2 using regresiones_rct, excel replace ctitle(sincontroles) stats (coef se ci) dec(0)
    reg re78 treat age education married
    outreg2 using regresiones_rct, excel append ctitle(concontroles1) stats (coef se ci) dec(0)
    reg re78 treat treat age education married hispanic black nodegree re74 re75
    outreg2 using regresiones_rct, excel append ctitle(concontroles2) stats (coef se ci) dec(0)

    use psid_controls_new.dta, clear

    * Obtener la diferencia de medias incondicional (y la desviación estándar de la diferencia de medias) entre los tratados y los no tratados.

    ttest re78, by(treat) reverse
    local diff=`r(mu_1)'-`r(mu_2)' /*guardar en un local la diferencia de medias */

    mat A=[`diff' \ `r(se)'] /*poner en una matriz la diferencia de medias y su desviación estándar */
    mat list A

    mat drop A

    * Calcular la diferencia de medias entre tratados y no tratados con el método de propensity score matching.

    psmatch2 treat age education married, outcome(re78)
    matrix A = ( `r(att)' \ `r(seatt)' ) /*guardar en una matriz el estimador de PSM y su desviación estandar */
    mat list A
    psmatch2 treat age education married black hispanic nodegree re74 re75, outcome(re78)
    matrix B = ( `r(att)' \ `r(seatt)' ) /*guardar en una matriz el estimador de PSM y su desviación estandar */
    mat list B

    mat C = [A, B] /*hacer una matriz con los estimadores de PSM con las dos especificaciones */
    mat list C

    Comment


    • #3
      How is this any helpfull?
      In reg, you should be using reg32 instead of 78.

      Not to mention

      // Primera diferencia

      xtreg d.ln_wage d.union d.grade d.ttl_exp
      estimate store FD
      //Primera diferencia VI


      xtivreg d.ln_wage ( d.union = d.c_city) d.grade d.ttl_exp
      estimate store FD_VI
      regress d.ln_wage d.union d.grade d.ttl_exp
      estimate store FD
      xtivreg d.ln_wage (d.union = d.c_city) d.grade d.ttl_exp, fd
      estimate store IVFD
      putexcel

      //EFECTOS FIJOS

      xtreg ln_wage union grade ttl_exp, fe
      estimate store EF

      //Efectos Fijos con VI

      xtivreg ln_wage (union = c_city) grade ttl_exp, fe
      estimate store EF_VI


      use "nlswork.dta", replace

      xtset idcode year

      drop if union ==.

      xtreg ln_wage union grade ttl_exp , re
      estimates store RE

      xtivreg ln_wage grade ttl_exp (union=c_city)
      estimates store RE_IV

      Hope this helps you understand better the different types of regression

      best regards!

      Comment


      • #4
        Thank you for yout answer.

        DATOS PANEL:

        Entregar una tabla que contenga el efecto de pertenecer a un sindicato sobre el logaritmo del salario. Incluir como variables de control: el ´ultimo grado cursado, experiencia laboral (tambi´en incluir los coeficientes de las variables de control). 1 Regresi´on de MCO. 2 Regresi´on de efectos aleatorios. 3 Regresi´on de efectos fijos. 4 Regresi´on de primeras diferencias.

        • Adem´as incluir en la tabla estimadores de variables instrumentales donde se instrumenta el pertencer a un sindicato con el hecho de vivir en una ciudad capital. 5 Regresi´on de variables instrumentales (VI). 6 Regresi´on de VI con efectos aleatorios. 7 Regresi´on de VI con efectos fijos. 8 Regresi´on de VI con primeras diferencias.

        CODIGOS RECOMENDADOS:

        global folder="PONER AQUI DIRECTORIO DONDE GUARDARON LA BASE DE DATOS"

        cd "$folder"

        use nlswork.dta, replace

        xtset idcode year /*indicamos cuales son las variables que definen el individuo y el tiempo */

        global xlist union grade ttl_exp /* hacemos un global con las variables explicativas */

        * regresion de MCO (pooled OLS)
        reg ln_wage $xlist
        outreg2 using regresiones, excel replace ctitle(MCO) stats (coef se ci) dec(3) nor nodepvar

        * regresion de efectos aleatorios
        xtreg ln_wage $xlist, re
        outreg2 using regresiones, excel append ctitle(EA) stats (coef se ci) dec(3) nor nodepvar

        * regresion de efectos fijos
        xtreg ln_wage $xlist, fe
        outreg2 using regresiones, excel append ctitle(EF) stats (coef se ci) dec(3) nor nodepvar

        * regresion de primeras diferencias
        sort idcode year /*ordenamos los valores en la base de datos */

        foreach var in ln_wage $xlist { /*generamos las variables en primeras diferencias */
        by idcode : gen D_`var'=`var'[_n]-`var'[_n-1] /* el "by idcode" en el comando es importante porque así genera las diferencias a través del tiempo para cada individuo. */
        }

        global D_xlist D_union-D_ttl_exp /* hacemos un global con las variables explicativas en primeras diferencias */

        reg D_ln_wage $D_xlist /*hacemos la regresion de primeras diferencias */
        outreg2 using regresiones, excel append ctitle(PD) stats (coef se ci) dec(3) nor nodepvar

        * variables instrumentales

        global iv_xlist grade ttl_exp /* hacemos un nuevo global con las variables explicativas */

        ivreg2 ln_wage (union=c_city) $iv_xlist /*estimador de variables instrumentales */
        outreg2 using regresiones, excel append ctitle(VI) stats (coef se ci) dec(3) nor nodepvar
        xtivreg ln_wage (union=c_city) $iv_xlist, re /*estimador de variables instrumentales con efectos aleatorios*/
        outreg2 using regresiones, excel append ctitle(VI EA) stats (coef se ci) dec(3) nor nodepvar
        xtivreg ln_wage (union=c_city) $iv_xlist, fe /*estimador de variables instrumentales con efectos fijos*/
        outreg2 using regresiones, excel append ctitle(VI EF) stats (coef se ci) dec(3) nor nodepvar
        xtivreg ln_wage (union=c_city) $iv_xlist, fd /*estimador de variables instrumentales con primeras diferencias*/
        outreg2 using regresiones, excel append ctitle(VI PD) stats (coef se ci) dec(3) nor nodepvar

        Comment


        • #5
          There is another option: VARIABLES INSTRUMENTALES.

          Una tabla que contenga estimadores del efecto de tener seguro m´edico sobre los gastos m´edicos (en logaritmo).
          • Incluir en la tabla el estimador de MCO, y un estimador de variables insturmentales, en el que el tener seguro m´edico se instrumenta con tener un cup´on de descuento para comprar un seguro m´edico.
          • Tambi´en incluir en la tabla los coeficientes estimados en la primera etapa de la regresi´on de variables instrumentales.
          • En ambos estimadores, usar como variables de control el n´umero de enfermedades, la edad y el logaritmo del ingreso. Incluir en la tabla los estimadores de las variables de control. • Para todos los casos, incluir el coeficiente estimado, su error est´andar y mostrar con estrellas su nivel de significancia.

          * Ejercicio basado en Ani Katchova (2013). Econometrics Academy.

          global folder="IDIRECCION_DE_ARCHIVO"

          cd "$folder"

          use iv_health_new.dta, replace

          *generamos las variables en logaritmo

          gen logmedexpense=log(medexpense)
          gen logincome=log(income)

          *hacemos la regresión de MCO.

          regress logmedexpense healthinsu illnesses age logincome
          outreg2 using regresiones_vi, excel replace ctitle(MCO) stats (coef se) dec(3)

          *Hacemos la regresión de variables instrumentales (el instrumento Z es healthcupon)

          ivreg2 logmedexpense (healthinsu=healthcupon) illnesses age logincome
          ivreg2 logmedexpense (healthinsu=healthcupon) illnesses age logincome, first /*la opción first arroja la primera etapa de la estimación */

          *También podemos calcular "manualmente" el estimador de IV o MC2E.

          regress healthinsu healthcupon illnesses age logincome /* esta es la primera etapa */
          outreg2 using regresiones_vi, excel append ctitle(VI 1era) stats (coef se) dec(3)
          predict healthinsu_hat /*vamos a usar esta predicción de X para la segunda etapa */

          regress logmedexpense healthinsu_hat illnesses age logincome /* esta es la segunda etapa */
          outreg2 using regresiones_vi, excel append ctitle(VI 2da) stats (coef se) dec(3)

          Comment


          • #6
            I know that some people have problems with Loops so I share an example:

            LOOPS:

            * generar las 100 variables a partir de age2000

            forvalues i=1/9 { /*con este loop generamos las variables age2001 a age2009 */
            gen age200`i'=age2000+`i'
            }

            forvalues i=10/99 { /*con este loop generamos las variables age2001 a age2009 */
            gen age20`i'=age2000+`i'
            }

            gen age2100=age2000+100 /* finalmente, aquí generamos la variable age2100 */


            * generar las 100 variables a partir de re2000

            forvalues i=1/9 { /*con este loop generamos las variables re2001 a re2009 */
            gen re200`i'=re2000+`i' if treat==1
            replace re200`i'=re2000-`i' if treat==0
            }

            forvalues i=10/99 { /*con este loop generamos las variables re2010 a re2099 */
            gen re20`i'=re2000+`i' if treat==1
            replace re20`i'=re2000-`i' if treat==0
            }

            gen re2100=re2000+100 if treat==1 /* finalmente, aquí generamos la variable re2100 */
            replace re2100=re2000-100 if treat==0

            * hacer las regresiones

            reg re2000 treat /* separamos la primera regresión del loop para generar el archivo que contiene la tabla con outreg */
            outreg2 using regresiones_loop, excel replace ctitle(re2000) stats (coef se) dec(0) nor2 nodepvar /* cada que necesiten rehacer el archivo desde cero, corren este código */

            forvalues i=2001/2100 { /* hacemos el resto de las regresiones con un loop sobre y exportamos los resultados con el archivo generado anteriormente */
            reg re`i' treat
            outreg2 using regresiones_loop, excel append ctitle(re`i') stats (coef se) dec(0) nor2 nodepvar
            }

            * cambiar la base de datos a forma "long"

            gen identifier=_n+1000 /* generamos un identificador para cada observacion */
            tostring identifier, replace /* lo podemos convertir a formato de texto para diferenciarlo de las otras variables */

            reshape long age re, i(identifier) j(year) /* convertimos a formato long */

            ANOTHER EXAMPLE:

            reg re2000 treat
            outreg2 using tablas2, excel replace ctitle(Modelo 2000) stats (coef se) dec(0) nor2 nodepvar

            forvalues i=2001/2100 {
            gen age`i'=age2000+`i'-2000
            gen re`i'=re2000+`i'-2000 if treat==1
            replace re`i'=re2000-`i'+2000 if treat==0
            reg re`i' treat
            outreg2 using tablas2, excel append ctitle(Modelo `i') stats (coef se) dec(0) nor2 nodepvar
            }

            gen index = _n

            reshape long re age, i(index) j(year)

            Comment


            • #7
              Do not forget to consider that in DIFERENCIAS EN DIFERENCIAS:


              global folder="PONER AQUÍ LUGAR DONDE GUARDARON LA BASE DE DATOS"

              cd "$folder"

              use organ_donations.dta, clear

              ***** Regresión de diff-in-diff ****

              *creamos dummy de tiempo
              gen time=1 if quarter=="Q32011" | quarter=="Q42011" | quarter=="Q12012"
              replace time=0 if time==.

              *creamos dummy de grupo
              gen treat=1 if state=="California"
              replace treat=0 if treat==.

              *creamos la interacción de diff-in-diff
              gen did=1 if time==1 & treat==1
              replace did=0 if did==.

              * hacemos la regresión de diff-in-diff, cualquiera de las siguientes dos formas es correcta:
              reg rate time treat did
              reg rate time##treat


              ***** Gráfica *****

              gen nquarter=quarter_num-4 /* para facilitar la presentación gráfica, normalizamos a cero el trimestre en que tomó efecto la reforma (2011Q3) */

              * sacamos las medias a través del tiempo y de los grupos para obtener las series que graficaremos
              collapse (mean) rate, by(nquarter treat)

              * hacemos la gráfica de los valores medios de la variable de interés a través del tiempo en ambos grupos
              twoway (scatter rate nquarter if treat==1, connect(direct)) ///
              (scatter rate nquarter if treat==0, connect(direct)), ///
              xline(-0.8, lpattern(dash) lcolor(cranberry)) legend(cols(2) label(1 "California (tratamiento)") label(2 "Resto de Estados (control)")) ///
              ytitle(Tasa de donadores de organos) xtitle(trimestres desde que tomó efecto la reforma (2011Q3=0))
              graph export trendsnivel.png, replace


              gen n_rate=.
              forvalues i=0/1 { /*con este loop transformamos la variable Y a cambios respecto a una base 100, donde 2011Q2=100 */
              sum rate if nquarter==-1 & treat==`i'
              scalar norm=`r(mean)'
              replace n_rate=rate / norm*100 if treat==`i'
              }

              twoway (scatter n_rate nquarter if treat==1, connect(direct)) ///
              (scatter n_rate nquarter if treat==0, connect(direct)), ///
              xline(-0.8, lpattern(dash) lcolor(cranberry)) legend(cols(2) label(1 "California (tratamiento)") label(2 "Resto de Estados (control)")) ///
              ytitle(Tasa de donadores de organos (2011Q2=100)) xtitle(trimestres desde que tomó efecto la reforma (2011Q3=0))
              graph export trendsbase100.png, replace

              Comment


              • #8
                EFECTOS DE TRATAMIENTO CON ALEATORIZACION PERFECTA:


                clear all
                set more off

                /*
                I. GENERAR LAS VARIABLES
                */

                * Simulando la poblacion
                set obs 30000
                gen id=_n

                * Generando tres regiones diferentes
                generate auxiliar = 3*runiform()
                gen region = .
                replace region = 1 if (auxiliar < 1)
                replace region = 2 if (1 < auxiliar & auxiliar < 2)
                replace region = 3 if (2 < auxiliar & auxiliar < 3)
                drop auxiliar

                * Generando la variable dependiente
                * (contrafactual si es que las cosas no cambian antes y despues del tratamiento)
                gen salud_0 = rnormal(10,1)
                replace salud_0 = salud_0 + 1 if region==1
                replace salud_0 = salud_0 + 2 if region==2
                replace salud_0 = salud_0 + 5 if region==3

                * La distribucion de salud antes del tratamiento
                kdensity salud_0 if region==1, lcolor(green) lpattern(dash) plot(kdensity salud_0 ///
                if region==2, lcolor(navy)) addplot(kdensity salud_0 if region==3, lcolor(red) ///
                lpattern(dash_dot)) legend(label(1 "Region 1") label(2 "Region 2") label(3 "Region 3") ///
                region(lcolor(white))) title("Efecto del tratamiento", color(black) size(5)) ///
                graphregion(fcolor(white)) xtitle("Salud")

                /*
                II. TRATAMIENTO ALEATORIZADO PERFECTAMENTE
                */

                * Asignando el tratamiento
                generate auxiliar = runiform()
                gen asign1 = round(auxiliar)
                drop auxiliar

                * Cumplimiento perfecto
                gen tratado1 = asign1

                * No hay diferencias ex ante entre los grupos
                reg tratado1 i.region

                bysort tratado1: summ salud_0

                kdensity salud_0 if tratado1==0, lcolor(green) lpattern(dash) plot(kdensity salud_0 ///
                if tratado1==1, lcolor(navy)) legend(label(1 "No tratados") label(2 "Tratados") ///
                region(lcolor(white))) title("Efecto del tratamiento", color(black) size(5)) ///
                graphregion(fcolor(white)) xtitle("Salud")

                * Genera la variable dependiente despues del tratamiento
                gen salud_1 = salud_0 + 2*tratado1

                * La distribucion de ambos grupos despues del tratamiento
                kdensity salud_1 if tratado1==0, lcolor(green) lpattern(dash) plot(kdensity salud_1 ///
                if tratado1==1, lcolor(navy)) legend(label(1 "No tratados") label(2 "Tratados") ///
                region(lcolor(white))) title("Efecto del tratamiento", color(black) size(5)) ///
                graphregion(fcolor(white)) xtitle("Salud")

                * Calcular el efecto del tratamiento
                summ salud_1 if tratado1 == 1
                scalar salud_1_T = r(mean)
                summ salud_1 if tratado1 == 0
                scalar salud_1_C = r(mean)
                scalar ate_1 = `=scalar(salud_1_T)' - `=scalar(salud_1_C)'

                ************************************************** ********************
                di in red "El ATE estimado es de `=scalar(ate_1)'"
                ************************************************** ********************

                * Calcular el efecto con una regresion *
                reg salud_1 tratado1

                /*
                III. TRATAMIENTO ALEATORIZADO IMPERFECTAMENTE
                */

                * Asignando el tratamiento
                generate auxiliar = runiform()
                gen asign2 = 0
                replace asign2 = 1 if (region == 3 & auxiliar < 0.25 )
                replace asign2 = 1 if (region == 2 & auxiliar < 0.5 )
                replace asign2 = 1 if (region == 1 & auxiliar < 1 )
                drop auxiliar

                * Cumplimiento perfecto
                gen tratado2 = asign2

                * Hay diferencias ex ante entre los grupos
                reg tratado2 i.region

                bysort tratado2: summ salud_0

                kdensity salud_0 if tratado2==0, lcolor(green) lpattern(dash) plot(kdensity salud_0 ///
                if tratado2==1, lcolor(navy)) legend(label(1 "No tratados") label(2 "Tratados") ///
                region(lcolor(white))) title("Efecto del tratamiento", color(black) size(5)) ///
                graphregion(fcolor(white)) xtitle("Salud")

                * Genera la variable dependiente despues del tratamiento
                gen salud_2 = salud_0 + 2*tratado2

                * La distribucion de ambos grupos despues del tratamiento
                kdensity salud_2 if tratado2==0, lcolor(green) lpattern(dash) plot(kdensity salud_2 ///
                if tratado2==1, lcolor(navy)) legend(label(1 "No tratados") label(2 "Tratados") ///
                region(lcolor(white))) title("Efecto del tratamiento", color(black) size(5)) ///
                graphregion(fcolor(white)) xtitle("Salud")

                * Calcular el efecto del tratamiento (sesgado)
                summ salud_2 if tratado2 == 1
                scalar salud_2_T = r(mean)
                summ salud_2 if tratado2 == 0
                scalar salud_2_C = r(mean)
                scalar ate_2 = `=scalar(salud_2_T)' - `=scalar(salud_2_C)'

                ************************************************** ********************
                di in red "El ATE (sesgado) estimado es de `=scalar(ate_2)'"
                ************************************************** ********************

                * Calcular el efecto (sesgado) con una regresion *
                reg salud_2 tratado2

                * Controlar por el efecto de la region en una regresion *
                reg salud_2 tratado2 i.region

                Comment


                • #9
                  For the people that have more questions abot DATOS PANEL here is another example from Baltagi:

                  PSID wage data 1976-1982 from Baltagi and Khanti-Akom (1990)


                  * Darle formato de panel a los datos *
                  xtset id t

                  * Describir los datos *
                  xtdescribe

                  * Definir el set de controles *
                  global xlist exp exp2 wks ed

                  * Estimar el modelo de Pooled OLS *
                  xtreg lwage $xlist, pa corr(independent)
                  estimates store Pool

                  * Estimar el modelo de Pooled OLS con errores cluster-robustos*
                  xtreg lwage $xlist, pa corr(independent) vce(robust)
                  estimates store Pool_rob

                  * Estimar el modelo de efectos fijos *
                  xtreg lwage $xlist, fe
                  estimates store FE

                  * Estimar el modelo de efectos fijos y errores cluster-robustos *
                  xtreg lwage $xlist, fe vce(robust)
                  estimates store FE_rob

                  * Estimar el modelo de efectos aleatorios *
                  xtreg lwage $xlist, re
                  estimates store RE

                  * Estimar el modelo de efectos aleatorios y errores cluster-robustos *
                  xtreg lwage $xlist, re vce(robust)
                  estimates store RE_rob

                  * Compilar los resultados en una tabla *
                  estimates table Pool Pool_rob FE FE_rob RE RE_rob, ///
                  b se stats(sigma_u sigma_e) b(%7.4f)

                  * Hacer el test de Hausman *
                  *Nos sirve para decidir entre un modelo de FW o RE. La hipotesis nula es que preferimos el modelo de RE y la alternativa es que preferimos FE.
                  hausman FE RE, sigmamore

                  * Una alternativa para el test de Hausman *
                  quietly xtreg lwage $xlist, re

                  scalar theta=e(theta)

                  global yandxforhausman lwage exp exp2 wks

                  sort id

                  foreach x of varlist $yandxforhausman {
                  by id: egen mean`x' = mean(`x')
                  gen md`x' = `x' - mean`x'
                  gen red`x' = `x' - theta*mean`x'
                  }

                  reg redlwage redexp redexp2 redwks mdexp mdexp2 mdwks

                  test mdexp mdexp2 mdwks

                  Comment


                  • #10
                    * Propensity Score Matching in Stata

                    Basado en el ejemplo encontrado en
                    https://sites.google.com/site/econom...score-matching

                    clear all
                    set more off

                    * Define treatment, outcome, and independent variables
                    global treatment TREAT
                    global ylist RE78
                    global xlist AGE EDUC MARR

                    describe $treatment $ylist $xlist
                    summarize $treatment $ylist $xlist

                    bysort $treatment: summarize $ylist $xlist

                    * Regression with a dummy variable for treatment (t-test)
                    reg $ylist $treatment

                    * Regression with a dummy variable for treatment controlling for x
                    reg $ylist $treatment $xlist

                    * Propensity score matching with common support
                    pscore $treatment $xlist, pscore(myscore) blockid(myblock) comsup

                    * Propensity score matching using psmatch2 package

                    * Install psmatch2 package
                    *ssc install psmatch2

                    * Propensity score matching
                    psmatch2 $treatment $xlist, outcome($ylist) ate

                    * Propensity score matching with logit instead of probit model
                    psmatch2 $treatment $xlist, outcome($ylist) logit

                    * Propensity score matching with common support
                    psmatch2 $treatment $xlist, outcome($ylist) common

                    * Nearest neighbor matching - neighbor(number of neighbors)
                    psmatch2 $treatment $xlist, outcome($ylist) common neighbor(1)

                    * Radius matching - caliper(distance)
                    psmatch2 $treatment $xlist, outcome($ylist) common radius caliper(0.1)

                    * Kernel matching
                    psmatch2 $treatment $xlist, outcome($ylist) common kernel


                    * Balancing - comparisons of treated and controls after matching
                    pstest

                    Comment


                    • #11
                      Diferencias en Diferencias

                      Ejemplo 1

                      describe

                      * Creemos una variable dummy para indicar el periodo en el que inició el tratamiento.
                      * Asumamos que el tratamiento inició en 1994. En este caso, los años previos a
                      * 1994 tendrán un valor de 0 y los años posteriores tendrán un valor de 1.
                      gen time = (year>=1994) & !missing(year)

                      * Creemos una variable dummy para identificar al grupo expuesto al tratamiento.
                      * En este ejemplo, asumamos que los países con códigos 5, 6 y 7 recibieron el
                      * tratamiento, mientras que los países 1-4 no lo recibieron.
                      gen treated = (country>4) & !missing(country)

                      * Creemos una interacción entre el tiempo y el tratamiento y llamemosla "did"
                      gen did = time*treated

                      * Estimiemos DiD
                      reg y time treated did, r
                      // El coeficiente de "did" es el estimador de DiD. El efecto es significativo
                      // al 10%, con el tratamiento teniendo un efecto negativo.

                      /*
                      Usando el método de hashtash
                      */

                      * No necesitaremos generar una interacción al usar este método. Estimaremos de
                      * la siguiente manera:
                      reg y time##treated, r
                      // El coeficiente de "time#treated" es el estimador de DiD que en el ejemplo
                      // anterior era el estimador de "did". El efecto es significativo
                      // al 10%, con el tratamiento teniendo un efecto negativo.

                      /*
                      Usando el comando "diff"
                      */

                      * El comando de diff es un comando programado por usuarios. Debemos instalarlo:
                      *ssc install diff

                      * Estimando con el comando diff:
                      diff y, t(treated) p(time)
                      // Nota: "treated" y "tiempo" en parentesis son dummies para el tratamiento
                      // y tiempo, véase el "basic method"

                      * use el help de diff para más información.

                      /************************************************** ****************************
                      Ejercicio
                      ************************************************** ****************************/
                      * Usaremos un panel de 788 firmas entre 2006-2017.
                      * Hubo un shock exógeno en 2009, siendo que algunas fueron tratadas y otras no.
                      * Queremos usar una gráfica para ver el impacto diferenciado del tratamiento
                      * entre los grupos. Su tarea es hacer esta gráfica usando el comando de two-way
                      * que ya hemos visto antes en el laboratorio. (Vean la gráfica de ejemplo que
                      * puse en la carpeta para que se den una idea).
                      * Tendrán 10 minutos para completar el ejercicio.

                      webuse grunfeld, clear

                      * Generamos un tratamiento falso
                      gen treated = inrange(company,1,3)
                      gen post = year>=1945

                      * basic DiD regressionHacemos una regresión Did básica
                      reg kstock i.treated##i.post

                      * Ahora, hacemos el gráfico

                      /************************************************** ****************************
                      Ejemplo 1
                      ************************************************** ****************************/
                      describe

                      * Estimemos DiD con el comando didregress (este comando sólo existe en Stata 17)
                      didregress (satis) (procedure), group(hospital) time(month)

                      * Hagamos un gráfico que nos permita diagnosticar si se cumple el supuesto de
                      * tendencias paralelas
                      estat rendplot

                      * Hagamos un test para este supuesto
                      estat ptrends

                      * Hagamos un test conjunto para los coeficientes y ver si es necesario incluir
                      * dummies como si el tratamiento hubiera ocurrido en el pasado
                      estat granger

                      * Hagamos una especificación 2x2
                      * Crearemos dummies por grupo de tratamiento y periodo
                      bysort hospital: egen treated = mean(procedure)
                      replace treated = 1 if treated>0
                      gen post = 0
                      replace post = 1 if month >3

                      * Le indicamos a stata que no incliya efectos de grupo o tiempo
                      * Agregamos las dummies a la ecuación
                      didregress (satis treated post) (procedure), ///
                      group(hospital) time (month) nogtefects

                      Comment


                      • #12
                        Excelent info! Very usefull to reall get a grasp of what STATA is capable of!

                        Id like to add


                        set more off
                        clear all

                        use "PanelPROGRESA_Enrollment_97_99.dta" , clear

                        /* Trabajaremos con un panel de PROGRESA. Este es un conjunto de datos de panel
                        para infantes de seis a dieciséis años. El panel consta de hogares e individuos
                        de aldeas seleccionadas que fueron monitoreados anualmente desde 1997 hasta 1999.

                        La siguiente tabla describe la asignación del programa y los criterios de
                        elegibilidad. Los hogares que eran “pobres” según una clasificación del gobierno
                        eran elegibles para recibir la transferencia de efectivo bajo PROGRESA.
                        En el grupo de tratamiento, alrededor del 63% de los hogares eran elegibles para
                        el programa. En el grupo de control, el 37 % de los hogares podría haber sido
                        elegible.*/

                        *creamos variables auxiliares
                        destring year villid, replace
                        gen aux=D if year==1998
                        egen D_assig=mean(aux),by(villid)

                        gen aux1=pov_HH if year==1998
                        egen aux2=mean(aux1),by(hogid)
                        replace pov_HH=aux2 if year==1997
                        drop aux aux1 aux2

                        *Tabulamos
                        tab2 D_assig pov_HH, col

                        /*Para que RD proporcione una estimación consistente del efecto del tratamiento,
                        el tratamiento debe asignarse siguiendo una regla que depende de una variable forzada.
                        En PROGRESA, los hogares de las aldeas de tratamiento fueron elegidos sobre la
                        base de un índice de pobreza (yycali, la variable de asignación).
                        Aquellos hogares donde yycali estaba por debajo de un valor de corte eran elegibles
                        para PROGRESA y se les ofrecieron los beneficios del programa en las aldeas de
                        tratamiento.

                        Grafiquemos la distribución del puntaje del índice de pobreza de yycali para
                        visualizar los hogares de tratamiento y control (tenga en cuenta que ahora estamos
                        restringiendo la muestra y no estimamos ITT sino ATET). La gráfica muestra que el
                        índice de pobreza promedió 800 para los hogares tratados y 700 para los hogares de
                        control no elegibles.*/
                        twoway (kdensity yycali if pov_HH==1 & D_assig==1 & year==1997) ///
                        (kdensity yycali if pov_HH==0 & D_assig==1 & year==1997), ///
                        legend(lab(1 Poor) lab(2 Non-Poor)) graphregion(fcolor(white)) title("")

                        /*Encontramos una superposición de las distribuciones porque el gobierno mexicano
                        tenía diferentes puntos de corte para el índice de pobreza en diferentes regiones
                        (variable de región: entidad).

                        Supongamos que el valor máximo de yycali para los hogares pobres de las aldeas
                        de tratamiento en cada región es el valor de corte para esa región.
                        Podemos crear valores de corte (max_*) para las regiones en un bucle:*/
                        gen maxcut = 0
                        levelsof entidad, local(entidades)
                        foreach j of local entidades {
                        sum yycali if year==1997 & D_assig == 1 & pov_HH==1 & entidad==`j'
                        replace maxcut=r(max) if entidad==`j'
                        }

                        /*A continuación, necesitamos "normalizar" el valor de la variable forzada para
                        que haya un único punto de corte en todas las regiones. Simplemente restaremos el
                        valor de corte determinado en el paso (a) anterior del valor de yycali*/
                        gen z = yycali - maxcut

                        /* Grafiquemos la distribución de la nueva variable forzada centrada z por
                        los dos grupos de hogares que comparamos. Encontramos que 0 es ahora el punto de
                        corte. */
                        twoway (kdensity z if pov_HH==1 & D_assig==1 & year==1997) ///
                        (kdensity z if pov_HH==0 & D_assig==1 & year==1997), legend(lab(1 Poor) ///
                        lab(2 Non-Poor)) graphregion(fcolor(white)) title("")

                        /* Creamos una variable de asignación ficticia para marcar los hogares que son
                        elegibles frente a los que no lo son:*/
                        gen E = z<=0


                        /* Habíamos discutido que en RD, la comparación debe hacerse lo más cerca posible
                        del punto de corte. Sin embargo, cuanto más estrecho es el rango, más pequeña es
                        la muestra disponible para el análisis, lo que implica un trade-off entre el
                        tamaño de la muestra y la consistencia teórica. Restrinjamos el análisis solo a
                        aquellos hogares donde el índice de pobreza centrado z es +/- 200
                        (elegido arbitrariamente por motivos de demostración).

                        Restringimos la muestra a observaciones de 1999 e incluimos solo a los individuos
                        que encajarían en un diseño nítido (sharp RD).

                        Dentro de esta submuestra, calculamos 60 grupos de igual tamaño (30 en cada
                        lado alrededor del punto de discontinuidad) de z y tomamos las medias para la
                        variable enroll dentro de cada grupo. Luego, graficamos la media de cada
                        grupo de z contra la media de enroll. */
                        gen sampleRD = D_assig==1 & ( (pov_HH == 1 & z>=-200 & z<=0) | ///
                        (pov_HH == 0 & z>0 & z<=200) ) & year == 1999

                        xtile hl = z if pov_HH==1 & sampleRD == 1, n(30)
                        xtile hu = z if pov_HH==0 & sampleRD == 1, n(30)

                        gen hd = -hl if pov_HH==1
                        replace hd = hu if pov_HH==0

                        egen meanZ = mean(z), by(hd)
                        egen meanEnroll = mean(enroll), by(hd)
                        egen meanpov_HH = mean(pov_HH), by(hd)

                        gen meanZ2 = meanZ ^ 2

                        reg meanEnroll meanZ meanZ2 if meanpov_HH==1
                        predict yhat1 if e(sample)

                        reg meanEnroll meanZ meanZ2 if meanpov_HH==0
                        predict yhat0 if e(sample)

                        sort meanZ

                        /* La gráfica compara el impacto alrededor del punto de corte entre hogares
                        elegibles (pobres) y no elegibles (no pobres) de las aldeas de tratamiento en la
                        inscripción de infantes. Encontramos un cambio discreto en la tasa de inscripción de
                        beneficiarios en el punto de discontinuidad. Más adelante, probaremos la
                        significancia estadística de este cambio utilizando un análisis de regresión.
                        Es importante recordar que RD estima el impacto condicional alrededor del punto
                        de discontinuidad (el impacto local en aquellos individuos que están cerca de z=0,
                        que no es necesariamente generalizable a la población más amplia).*/

                        twoway (scatter meanEnroll meanZ if meanpov_HH ==1) (line yhat1 meanZ if meanpov_HH ==1) || ///
                        (scatter meanEnroll meanZ if meanpov_HH ==0) (line yhat0 meanZ if meanpov_HH ==0), ///
                        ylabel(0 1) xline(0) legend(off) graphregion(fcolor(white))


                        /* RDD comparando individuos elegibles en el grupo de tratamiento con individuos
                        no elegibles en el grupo de control

                        Arriba, comparamos los hogares del grupo de tratamiento en el corte para evaluar
                        el efecto causal del tratamiento. Sin embargo, PROGRESA puede haber tenido
                        externalidades locales positivas, en las que los hogares no elegibles también se
                        habrían beneficiado del programa. Por lo tanto, la comparación únicamente dentro
                        de las aldeas de tratamiento puede subestimar el efecto causal del tratamiento.
                        Sin embargo, podríamos usar en su lugar los hogares de las aldeas de control que
                        estaban por debajo del punto de corte (y por lo tanto doblemente inelegibles para
                        recibir PROGRESA). Esto es razonable porque la asignación de pueblos a PROGRESA
                        es aleatoria y podemos suponer que los factores de confusión están equilibrados
                        a nivel de pueblo.

                        Compararemos a las personas pobres de las aldeas de tratamiento con las personas
                        que no son pobres de las aldeas de control y que podría haber un "sesgo de
                        selección" en estos dos grupos. Un RDD cuasi-experimental nos permite minimizar
                        este sesgo restringiendo la comparación a una pequeña región alrededor del punto
                        de corte. Nuevamente, lo hacemos solo porque no queremos subestimar los efectos
                        debido a las externalidades positivas. */
                        drop hl hu hd meanZ meanEnroll meanpov_HH meanZ2 yhat1 yhat0

                        replace sampleRD = ( (D_assig==1 & pov_HH == 1 & z>=-200 & z<=0) | ///
                        (D_assig==0 & pov_HH == 0 & z>0 & z<=200) )


                        xtile hl = z if pov_HH==1 & sampleRD == 1, n(30)
                        xtile hu = z if pov_HH==0 & sampleRD == 1, n(30)

                        gen hd = -hl if pov_HH==1
                        replace hd = hu if pov_HH==0

                        egen meanZ = mean(z), by(hd)
                        egen meanEnroll = mean(enroll), by(hd)
                        egen meanpov_HH = mean(pov_HH), by(hd)

                        gen meanZ2 = meanZ ^ 2

                        reg meanEnroll meanZ meanZ2 if meanpov_HH==1
                        predict yhat1 if e(sample)

                        reg meanEnroll meanZ meanZ2 if meanpov_HH==0
                        predict yhat0 if e(sample)

                        sort meanZ

                        /* Repetimos el análisis gráfico anterior. La gráfica es el resultado de este
                        análisis gráfico. Encontramos que los impactos alrededor del punto de
                        discontinuidad son más grandes y más claros que los de la gráfica anterior,
                        como se esperaba.*/
                        twoway (scatter meanEnroll meanZ if meanpov_HH ==1) (line yhat1 meanZ if meanpov_HH ==1) || ///
                        (scatter meanEnroll meanZ if meanpov_HH ==0) (line yhat0 meanZ if meanpov_HH ==0), ///
                        ylabel(0 1) xline(0) legend(off) graphregion(fcolor(white))

                        * Análisis de regresión
                        * 1) checamos que hay balance en la línea base
                        gen z2= z*z

                        reg enroll D_assig z if sampleRD==1 & year==1997, vce(cluster villid)
                        eststo r1_97
                        reg enroll D_assig z z2 if sampleRD==1 & year==1997, vce(cluster villid)
                        eststo r2_97

                        *Encontramos que el coeficiente para D_assig no es significativo en ningún modelo,
                        *lo que indica un buen equilibrio de referencia en el resultado.

                        * 2) Estimamos el ATE
                        * net install estout, replace // quizás tengan que instalar este comando
                        reg enroll D_assig z if sampleRD==1 & year==1999, vce(cluster villid)
                        eststo r3_99
                        reg enroll D_assig z z2 if sampleRD==1 & year==1999, vce(cluster villid)
                        eststo r4_99

                        * 3) Exportamos las regresiones
                        * net install xml_tab // quizás tengan que instalar este comando
                        xml_tab r1_97 r2_97 r3_99 r4_99, replace ///
                        save("RD_TableI.xml") title("Table I: Sharp RD for Enrollment") below stats(N r2)

                        /* La tabla muestra los resultados de los análisis de regresión realizados
                        anteriormente. Encontramos que PROGRESA aumentó la tasa de matrícula entre 9 y
                        11 puntos porcentuales en la discontinuidad. También encontramos que la forma
                        funcional de f(Zi) tiene solo un efecto menor sobre el tamaño del tratamiento. */

                        Comment


                        • #13
                          DATOS PANEL Y SU MANEJO

                          1) Formato de datos
                          Los datos deben estar ordenados de forma "long"
                          * Quiza lo mas sencillo es que vean la ayuda para el comando reshape si en la linea de comandos escriben (y luego da enter) help reshape * pueden ir al help. Les recomiendo vayan al link del help en pdf.

                          * Para mostrar la estructura que deben tener los datos para que podamos utilizar
                          * los comandos especificos de Stata para datos panel, usaremos una base de datos
                          \* El comando list nos muestra todos los datos que estan en la base * en este caso son solo 3 observaciones y 8 variables list
                          * Noten que no hay un variable para identificar a cada observacion. Una manera
                          * muy sencilla de solucionar eso es utilizando la opcion _n.

                          gen id=_n // Generando una variable indicador
                          list // Veamos lo que obtuvimos

                          * Los datos que tenemos estan en formato wide, cambiemos a la forma long
                          * En clase nosotros usamo xit donde i se referia a la unidad de observacion * (individuo, hogar, etc) y t a la unidad del panel (en general tiempo).
                          * Stata en lugar de xit usa xij.

                          reshape long inc ue, i(id) j(year) list // Veamos lo que obtuvimos


                          2) Declarando las caracteristicas de los datos

                          Hasta ahora lo unico que hicimos fue "rotar" la base de datos.
                          * Antes de poder usar los comandos de datos panel debemos decirle a stata * cual variable es i y cual variable es j. Eso lo hacemos con el siguiente comando:

                          xtset id year

                          * Despues de hacer esto deberiamos guardar lo datos para no tener que repetir * esto cada vez. En este caso no lo haremos pues no usaremos esta base de datos. ************************************************** ********** *


                          3) Conociendo las caracteristicas de los datos panel:

                          * Para el resto de los comandos utilizaremos una base de datos ligeramente * mas interesante
                          use lab12b.dta, clear // (Esa base ya esta en formato long)
                          xtset identi year
                          xtdescribe // similar a describe pero da caracteristicas especificas del panel

                          * Ahora usemos una base que esta disponible en internet para ilustrar
                          * el uso del comando xttrans * Otro comando que puede ser util es xttab (vean el help para detalles) webuse nlswork
                          xtset id year
                          xttrans msp
                          xttrans msp, freq ************************************************** ********** *


                          4) Estadisticas descriptivas para panel
                          desc

                          * Recordemos uso de "label" en stata label list
                          * Estadisticas descriptivas para panel

                          xtdescribe
                          sum
                          xtsum

                          5) Exploración de una base de datos ************************************************** ********** **

                          1: dar formato de panel
                          **La siguiente es una muestra del Panel Study of Income Dynamics
                          use mus08psidextract.dta, clear

                          **Describimos la base de datos:
                          describe
                          sum

                          **Los comandos de panel requieren indicar a Stata que tenemos un panel
                          xtset id t // siempre va primero la variable panel y luego el tiempo

                          **El comando xtdescribe toma en cuenta la estructura de panel:
                          xtdescribe

                          ** 2: variación within y between
                          *Variación within: variación a lo largo del tiempo para un individuo
                          *Variación between: variación entre individuos

                          xtsum id t lwage ed exp exp2 wks south tdum1

                          ** 3: gráficos de series de tiempo para cada individuo.

                          xtline lwage if id==1, overlay // para una persona
                          xtline lwage if id&lt;=10, overlay // para las primeras 10 personas

                          ** 4: graph combine para hacer gráficas con varios paneles

                          xtline lwage if id&lt;10, overlay legend(off) saving(lwage, replace)

                          xtline wks if id&lt;10, overlay legend(off) saving(wks, replace)

                          graph combine lwage.gph wks.gph

                          **Ahora ya saben combinar gráficas ** 5: relación simple (y,x)

                          twoway (scatter lwage exp) (qfit lwage exp) (lowess lwage exp)

                          Comment


                          • #14
                            DID
                            Diferencias en Diferencias
                            ************************************************** ****************************/

                            clear all

                            set more off

                            /************************************************** ****************************
                            Ejemplo 1
                            ************************************************** ****************************/

                            * Obtengamos los datos
                            use "C:\Users\IDEX2559\OneDrive - CIDE\CIDE\Lab microeconometría 2022\Dif en dif\Panel101.dta", clear
                            describe

                            * Creemos una variable dummy para indicar el periodo en el que inició el tratamiento.
                            * Asumamos que el tratamiento inició en 1994. En este caso, los años previos a
                            * 1994 tendrán un valor de 0 y los años posteriores tendrán un valor de 1.
                            gen time = (year>=1994) & !missing(year)

                            * Creemos una variable dummy para identificar al grupo expuesto al tratamiento.
                            * En este ejemplo, asumamos que los países con códigos 5, 6 y 7 recibieron el
                            * tratamiento, mientras que los países 1-4 no lo recibieron.
                            gen treated = (country>4) & !missing(country)

                            * Creemos una interacción entre el tiempo y el tratamiento y llamemosla "did"
                            gen did = time*treated

                            * Estimiemos DiD
                            reg y time treated did, r
                            // El coeficiente de "did" es el estimador de DiD. El efecto es significativo
                            // al 10%, con el tratamiento teniendo un efecto negativo.

                            /*
                            Usando el método de hashtash
                            */

                            * No necesitaremos generar una interacción al usar este método. Estimaremos de
                            * la siguiente manera:
                            reg y time##treated, r
                            // El coeficiente de "time#treated" es el estimador de DiD que en el ejemplo
                            // anterior era el estimador de "did". El efecto es significativo
                            // al 10%, con el tratamiento teniendo un efecto negativo.

                            /*
                            Usando el comando "diff"
                            */

                            * El comando de diff es un comando programado por usuarios. Debemos instalarlo:
                            *ssc install diff

                            * Estimando con el comando diff:
                            diff y, t(treated) p(time)
                            // Nota: "treated" y "tiempo" en parentesis son dummies para el tratamiento
                            // y tiempo, véase el "basic method"

                            * use el help de diff para más información.

                            /************************************************** ****************************
                            Ejercicio
                            ************************************************** ****************************/
                            * Usaremos un panel de 788 firmas entre 2006-2017.
                            * Hubo un shock exógeno en 2009, siendo que algunas fueron tratadas y otras no.
                            * Queremos usar una gráfica para ver el impacto diferenciado del tratamiento
                            * entre los grupos. Su tarea es hacer esta gráfica usando el comando de two-way
                            * que ya hemos visto antes en el laboratorio. (Vean la gráfica de ejemplo que
                            * puse en la carpeta para que se den una idea).
                            * Tendrán 10 minutos para completar el ejercicio.

                            webuse grunfeld, clear

                            * Generamos un tratamiento falso
                            gen treated = inrange(company,1,3)
                            gen post = year>=1945

                            * basic DiD regressionHacemos una regresión Did básica
                            reg kstock i.treated##i.post

                            * Ahora, hacemos el gráfico

                            /************************************************** ****************************
                            Ejemplo 1
                            ************************************************** ****************************/
                            use "C:\Users\IDEX2559\OneDrive - CIDE\CIDE\Lab microeconometría 2022\Dif en dif\hospdd.dta" , clear
                            describe

                            * Estimemos DiD con el comando didregress (este comando sólo existe en Stata 17)
                            didregress (satis) (procedure), group(hospital) time(month)

                            * Hagamos un gráfico que nos permita diagnosticar si se cumple el supuesto de
                            * tendencias paralelas
                            estat rendplot

                            * Hagamos un test para este supuesto
                            estat ptrends

                            * Hagamos un test conjunto para los coeficientes y ver si es necesario incluir
                            * dummies como si el tratamiento hubiera ocurrido en el pasado
                            estat granger

                            * Hagamos una especificación 2x2
                            * Crearemos dummies por grupo de tratamiento y periodo
                            bysort hospital: egen treated = mean(procedure)
                            replace treated = 1 if treated>0
                            gen post = 0
                            replace post = 1 if month >3

                            * Le indicamos a stata que no incliya efectos de grupo o tiempo
                            * Agregamos las dummies a la ecuación
                            didregress (satis treated post) (procedure), ///
                            group(hospital) time (month) nogtefects

                            Comment

                            Working...
                            X