Taller 7: Panel Data

Carlos Daboin Contreras (cdaboincontreras@udesa.edu.ar)

2023-11-01

Resumen de contenido

Nuestra meta

  • Familiarizarnos con las estructuras de datos cross-section y panel.

  • Diferenciar entre estructura de datos y fuentes de variación.

  • Familiarizarnos las posibles fuentes de variación en un panel (cross section, time-series, panel).

  • Hacer estimaciones con efectos fijos de tres maneras diferentes.

Conceptos

  • Panel data.

  • Variabilidad Within (mismo i, entre t).

  • Variabilidad Between (entre i, mismo t).

Herramientas

  • fixest::feols .

  • modelsummary::msummary .

  • broom:tidy

Librerías

Usaremos las siguientes librerías:

library(tidyverse) # libreria muy usada para manipular los datos y hacer grficos
library(modelsummary)# para tablas
library(gapminder)   # datos del world bank
library(fixest)      # estimaciones de efectos fijos
library(broom)       # Revisar modelos

Panel data y motivacion de efectos fijos (FE)

El panel data me permite observar a los sujetos de estudio en varios períodos. ¿Mas data, mas endogeneidad? No necesariamente. Los efectos fijos te permiten remover la variabilidad fija en una dimensión.

Ejemplos de panel data

Vamos a usar data de salud e ingresos por país/año de Gapminder.

data(gapminder)   # crea un data.frame llamado gapminder
# A tibble: 12 × 6
   country   continent  year lifeExp      pop gdpPercap
   <fct>     <fct>     <int>   <dbl>    <int>     <dbl>
 1 Argentina Americas   1997    73.3 36203463    10967.
 2 Argentina Americas   2002    74.3 38331121     8798.
 3 Argentina Americas   2007    75.3 40301927    12779.
 4 Ireland   Europe     1997    76.1  3667233    24522.
 5 Ireland   Europe     2002    77.8  3879155    34077.
 6 Ireland   Europe     2007    78.9  4109086    40676.
 7 Paraguay  Americas   1997    69.4  5154123     4247.
 8 Paraguay  Americas   2002    70.8  5884491     3784.
 9 Paraguay  Americas   2007    71.8  6667147     4173.
10 Syria     Asia       1997    71.5 15081016     4014.
11 Syria     Asia       2002    73.1 17155814     4091.
12 Syria     Asia       2007    74.1 19314747     4185.

¿Mayor ingreso-> Mayor Longevidad?

Correlación en sección cruzada - todos los países en 2007:

\(EV_{c}=\beta_0 + \beta_1GDPpc_{c}+\mu_{c}\)


# Tengamos una data separada para Argentina
Argentina <- gapminder %>% 
  filter(country == "Argentina")

# Veamos la correlación entre 
# ingreso y expectativa de vida en 2007
p1<-gapminder %>% filter(year == 2007) %>%
  ggplot(., aes(x = log(gdpPercap), y = lifeExp)) +
  geom_point() + geom_smooth(method = 'lm') +
  geom_point(data = Argentina[Argentina$year == 2007,], 
             color = "red")

Parecieran asociarse positivamente en 2007.

Estamos viendo una relación estimada por MCO.

¿Que piensan de \(Cor(\mu_c, GDPpc_c)\)?

¿Mayor ingreso-> Mayor Longevidad?

Correlación en panel - Todos los países, todos los años:

\(EV_{c,t}=\beta_0 + \beta_1GDPpc_{c,t}+\mu_{c,t}\)


# Veamos la correlación entre 
# ingreso y expectativa de vida en toda la data
p2<-gapminder  %>%
  ggplot(., aes(x = log(gdpPercap), y = lifeExp)) +
  geom_point() + geom_smooth(method = 'lm') +
  geom_point(data = Argentina, 
             color = "red")

Parecieran asociarse positivamente.

A esta estimación se le conoce cómo MCO agrupado (todos las unidades, en todos los periodos).

¿Que piensan de \(Cor(\mu_{c,t}, GDPpc_{c,t})\)?

¿Exogeneidad?

Tenemos \(EV_{c,t}=\beta_0 + \beta_1GDPpc_{c,t}+\mu_{c,t}\)

Hay sesgo si \(Cor(μ_{c,t}GDPpc_{c,t}) \neq 0\)

Razones detrás de sesgo:

  1. Conflictos internos: Afecta a cada pais en distintos periodos.

  2. Geografía: Solo varia entre paises.

  3. Pandemias: Afecta a todos al mismo tiempo

Supongamos que estos 3 no-observables son las únicas causantes del sesgo (partes de \(\mu_{ct}\) correlacionadas con \(X_{ct}\).)

No podemos controlar algo que no tenemos en data, pero…

  1. Sabemos que hay no-observables fijos para alguna dimensión de la data.

  2. Si controlamos por esa dimensión, controlamos por todos esos no-observables.

Controlar por dimensiones de la data : Agregar efectos fijos

\[ E V_{c, t}=\beta_0+\beta_1 GDPpc_{c, t}+\underbrace{\sum_{i=1}^C \gamma_i * 1[c=i]}_{\text {EF por países }}+\underbrace{\sum_{t=1}^Y \phi_t * 1[y=t]}_{\text {EF por años }}+\epsilon_{c, t} \]

Recuerda que en \(\mu_{ct}\) teniamos Crisis, Geografia, y Pandemias.

En esta regresión:

  • ¿Que parte del \(\mu_{ct}\) remueven los EF por país? ¿y los EF por año?

  • ¿\(\beta_1\) captura el efecto causal bajo nuestros supuestos?

Estimaciones por FE

Llamado pooled MCO o MCO agrupado.

\[ E V_{c, t}=\beta_0+\beta_1 GPDpc_{c, t}+\epsilon_{c, t} \]

gapminder<-gapminder %>% mutate(log_gdppc=log(gdpPercap))  # Minimos Cuadrados Agrupados 
m1 <- feols(lifeExp ~ log_gdppc, data = gapminder)

Permite controlar por Geografía.

\[ E V_{c, t}=\beta_0+\beta_1 GPDpc_{c, t}+ \sum_{i=1}^C \gamma_i * 1[c=i]+\epsilon_{c, t} \]

# Efectos fijos por pais
m2 <- feols(lifeExp ~ log_gdppc | country, data = gapminder)

Permite controlar por Pandemias.

\[ E V_{c, t}=\beta_0+\beta_1 GPDpc_{c, t}+ \sum_{t=1}^Y \phi_t * 1[y=t]+\epsilon_{c, t} \]

# Efectos fijos por año
m3 <- feols(lifeExp ~ log_gdppc | year, data = gapminder)

Permite controlar por Pandemias y Geografía.

\[ E V_{c, t}=\beta_0+\beta_1 GPDpc_{c, t}+ \sum_{i=1}^C \gamma_i * 1[c=i]+\sum_{t=1}^Y \phi_t * 1[y=t]+\epsilon_{c, t} \]

# Ambos efectos fijos 
m4 <- feols(lifeExp ~ log_gdppc | country + year, data = gapminder) 

Resultados

# Minimos Cuadrados Agrupados
m1 <- feols(lifeExp ~ log_gdppc, 
            data = gapminder)
# Efectos fijos por pais
m2 <- feols(lifeExp ~ log_gdppc | country, 
            data = gapminder)
# Efectos fijos por año
m3 <- feols(lifeExp ~ log_gdppc | year, 
            data = gapminder)
# Ambos efectos fijos
m4 <- feols(lifeExp ~ log_gdppc | country + year, 
            data = gapminder)

msummary(list('MCOAg' = m1, 'FE pais' = m2,
              'FE año' = m3, 'FE ambos' = m4), 
         data = gapminder, stars = TRUE, 
         gof_omit = 'AIC|BIC|F|Lik|Adj|Pseudo')

Resultados

MCOAg FE pais FE año FE ambos
(Intercept) −9.101***
(1.228)
log_gdppc 8.405*** 9.769*** 7.768*** 1.450*
(0.149) (0.702) (0.142) (0.679)
Num.Obs. 1704 1704 1704 1704
R2 0.652 0.846 0.720 0.936
R2 Within 0.410 0.652 0.019
RMSE 7.62 5.06 6.84 3.27
Std.Errors IID by: country by: year by: country
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

Causalidad

En el término de error teníamos \(Geografia_{c}\) y \(Pandemias_{t}\), pero los removimos con los efectos fijos por pais y año.

Aún queda \(Crisis_{ct}\) afectando a cada país en períodos distintos:

  • Varía wihtin país: Cada país es afectado en períodos diferentes.

  • Varía wihtin año: Cada período tiene distintos países afectados.

\(Corr(\epsilon_{ct},GDPpc_{ct}) \neq 0\) en nuestro ejemplo simplificado: Aún hay sesgo!

Replicando estimaciones via resta de promedios

La función feols nos está retornando las estimaciones within.

A continuación ilustramos en que consiste para el caso del modelo con efecto fíjo país:

El modelo para estimar efecto de \(GDP_{pc}\) sobre \(E V\) sería…

\[ E V_{c, y}=\beta_0+\beta_1 GDPpc_{c, t}+\beta_2 G_c+\epsilon_{c, t} \]

En ambos lados de la igualdad, calculemos la media por país entre años:

\[ \overline{E V_c}=\beta_0+\beta_1\left[\bar{GDPpc}_c\right]+\beta_2 \bar{G}_c+\bar{\epsilon}_c \]

Noten que \(\bar{G}_c=G_c\). Ahora restemos las medias de la ecuación inicial:

\[ E V_{c, y}-\overline{E V_c}=[\underbrace{\left.\beta_0-\beta_0\right]}_0+\beta_1\left[Y_{c, y}-\bar{Y}_c\right]+\beta_2[\underbrace{\left.G_c-G_c\right]}_0+\left[\epsilon_{c, y}-\bar{\epsilon}_c\right] \]

“Efectos fijos” por país = Quitar media por país de GDPpc y EV

Filtrar variación entre países (antes de estimar \(\beta_1\). Usas variación “a lo interno” de los países (a lo largo de los años).

Replicando estimaciones via resta de promedios

Restamos medias de GDPpc y EV a nivel de país:

# creo promedio de ambas variable y los resto a la variable original ('demeaning')
gapminder_demeaned <- gapminder %>%
  group_by(country) %>%
  mutate(# demeaning de X y Y: 
         log_gdppc_demean_c = log_gdppc - mean(log_gdppc),
         lifeExp_demean_c = lifeExp - mean(lifeExp)) %>%
  ungroup()

demeaned_1<-lm(lifeExp_demean_c~log_gdppc_demean_c,data=gapminder_demeaned)

tidy(demeaned_1)
# A tibble: 2 × 5
  term                estimate std.error statistic   p.value
  <chr>                  <dbl>     <dbl>     <dbl>     <dbl>
1 (Intercept)        -4.45e-17     0.123 -3.63e-16 1   e+  0
2 log_gdppc_demean_c  9.77e+ 0     0.284  3.44e+ 1 2.51e-197

Replicando estimaciones via resta de promedios

Ahora hagamoslo a nivel de año:

gapminder_demeaned <- gapminder_demeaned %>%
  group_by(year) %>%
  # Demeaning X y Y por año
  mutate(log_gdppc_demean_y = log_gdppc - mean(log_gdppc),
         lifeExp_demean_y = lifeExp - mean(lifeExp)) %>%
  ungroup()

demeaned_2<-lm(lifeExp_demean_y~log_gdppc_demean_y,data=gapminder_demeaned)

tidy(demeaned_2)
# A tibble: 2 × 5
  term               estimate std.error statistic p.value
  <chr>                 <dbl>     <dbl>     <dbl>   <dbl>
1 (Intercept)        4.31e-15     0.166  2.60e-14    1.00
2 log_gdppc_demean_y 7.77e+ 0     0.138  5.64e+ 1    0   

Replicando estimaciones via resta de promedios

Ahora restemos los promedios por país y año:

gapminder_demeaned <- gapminder_demeaned %>%
  group_by(year) %>%
  # demeaning por pais, luego demeaning por año
  mutate(log_gdppc_demean_cy = log_gdppc_demean_c - mean(log_gdppc),
         lifeExp_demean_cy = lifeExp_demean_c - mean(lifeExp)) %>%
  ungroup()

demeaned_3<-lm(lifeExp_demean_cy~log_gdppc_demean_cy,data=gapminder_demeaned)

tidy(demeaned_3)
# A tibble: 2 × 5
  term                estimate std.error statistic   p.value
  <chr>                  <dbl>     <dbl>     <dbl>     <dbl>
1 (Intercept)           -47.6      2.08     -22.9  4.72e-101
2 log_gdppc_demean_cy     1.45     0.255      5.68 1.59e-  8

Replicando estimaciones via resta de promedios

# Minimos Cuadrados Agrupados
lm1 <- lm(lifeExp ~ log_gdppc, data = gapminder)
# Efectos fijos por pais
demeaned_1<-lm(lifeExp_demean_c~log_gdppc_demean_c,data=gapminder_demeaned)
# Efectos fijos por año
demeaned_2<-lm(lifeExp_demean_y~log_gdppc_demean_y,data=gapminder_demeaned)
# Ambos efectos fijos
demeaned_3<-lm(lifeExp_demean_cy~log_gdppc_demean_cy,data=gapminder_demeaned)


msummary(list('MCOAg' = lm1, 'FE pais' = demeaned_1,
              'FE año' = demeaned_2, 'FE ambos' = demeaned_3), 
         data = gapminder, stars = TRUE, 
         gof_omit = 'AIC|BIC|F|Lik|Adj|Pseudo')

Replicando estimaciones via resta de promedios

MCOAg FE pais FE año FE ambos
(Intercept) −9.101*** 0.000 0.000 −47.645***
(1.228) (0.123) (0.166) (2.085)
log_gdppc 8.405***
(0.149)
log_gdppc_demean_c 9.769***
(0.284)
log_gdppc_demean_y 7.768***
(0.138)
log_gdppc_demean_cy 1.450***
(0.255)
Num.Obs. 1704 1704 1704 1704
R2 0.652 0.410 0.652 0.019
RMSE 7.62 5.06 6.84 3.27
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

Replicando estimaciones con lm()

# Minimos Cuadrados Agrupados
lm1 <- lm(lifeExp ~ log_gdppc, 
            data = gapminder)
# Efectos fijos por pais
lm2 <- lm(lifeExp ~ log_gdppc + country, 
            data = gapminder)
# Efectos fijos por año
lm3 <- lm(lifeExp ~ log_gdppc + factor(year), 
            data = gapminder)
# Ambos efectos fijos
lm4 <- lm(lifeExp ~ log_gdppc + country + factor(year), 
            data = gapminder)

msummary(list('MCOAg' = lm1, 'FE pais' = lm2,
              'FE año' = lm3, 'FE ambos' = lm4), 
         data = gapminder, stars = TRUE, 
         gof_omit = 'AIC|BIC|F|Lik|Adj|Pseudo')

Replicando estimaciones con lm()

MCOAg FE pais FE año FE ambos
(Intercept) −9.101*** −27.773*** −9.800*** 18.221***
(1.228) (2.501) (1.195) (1.927)
log_gdppc 8.405*** 9.769*** 7.768*** 1.450***
(0.149) (0.297) (0.138) (0.268)
countryAlbania 17.783*** 28.999***
(2.195) (1.444)
countryAlgeria 5.241* 19.131***
(2.214) (1.468)
countryAngola −13.907*** −1.719
(2.202) (1.452)
countryArgentina 8.132*** 28.101***
(2.273) (1.539)
countryAustralia 6.400** 32.615***
(2.352) (1.633)
countryAustria 5.156* 31.102***
(2.348) (1.628)
countryBahrain −1.968 23.660***
(2.344) (1.623)
countryBangladesh 12.401*** 12.362***
(2.158) (1.398)
countryBelgium 5.617* 31.629***
(2.349) (1.629)
countryBenin 7.745*** 10.773***
(2.161) (1.402)
countryBolivia 2.338 13.143***
(2.193) (1.441)
countryBosnia and Herzegovina 17.353*** 28.318***
(2.194) (1.442)
countryBotswana 3.152 15.046***
(2.200) (1.450)
countryBrazil 6.318** 22.024***
(2.230) (1.487)
countryBulgaria 12.670*** 29.357***
(2.239) (1.498)
countryBurkina Faso 6.858** 7.162***
(2.158) (1.398)
countryBurundi 12.646*** 8.126***
(2.164) (1.406)
countryCambodia 12.917*** 10.794***
(2.160) (1.400)
countryCameroon 3.062 9.524***
(2.171) (1.414)
countryCanada 5.465* 32.681***
(2.366) (1.650)
countryCentral African Republic 4.758* 6.146***
(2.159) (1.399)
countryChad 5.737** 8.767***
(2.161) (1.402)
countryChile 9.915*** 26.978***
(2.242) (1.502)
countryChina 21.271*** 23.856***
(2.160) (1.401)
countryColombia 10.920*** 24.119***
(2.209) (1.461)
countryComoros 10.205*** 14.206***
(2.163) (1.404)
countryCongo, Dem. Rep. 10.025*** 7.504***
(2.160) (1.401)
countryCongo, Rep. 1.375 12.998***
(2.198) (1.447)
countryCosta Rica 14.552*** 30.009***
(2.228) (1.484)
countryCote d'Ivoire 2.598 9.717***
(2.173) (1.417)
countryCroatia 9.463*** 29.147***
(2.270) (1.535)
countryCuba 13.513*** 30.590***
(2.243) (1.502)
countryCzech Republic 6.555** 29.954***
(2.314) (1.588)
countryDenmark 5.345* 32.209***
(2.361) (1.644)
countryDjibouti −2.834 7.160***
(2.188) (1.435)
countryDominican Republic 12.583*** 22.370***
(2.186) (1.433)
countryEcuador 6.361** 22.521***
(2.234) (1.492)
countryEgypt 6.577** 16.955***
(2.190) (1.438)
countryEl Salvador 5.535* 19.688***
(2.217) (1.471)
countryEquatorial Guinea 1.062 4.825***
(2.163) (1.404)
countryEritrea 12.711*** 9.142***
(2.162) (1.403)
countryEthiopia 11.529*** 7.670***
(2.163) (1.404)
countryFinland 6.477** 31.204***
(2.331) (1.609)
countryFrance 6.910** 32.424***
(2.342) (1.621)
countryGabon −11.429*** 10.006***
(2.290) (1.559)
countryGambia 8.599*** 7.171***
(2.159) (1.399)
countryGermany 5.064* 31.379***
(2.353) (1.635)
countryGhana 12.292*** 14.480***
(2.160) (1.400)
countryGreece 9.832*** 32.333***
(2.303) (1.574)
countryGuatemala 3.754+ 16.951***
(2.209) (1.461)
countryGuinea 6.163** 5.821***
(2.158) (1.398)
countryGuinea-Bissau 4.059+ 2.077
(2.160) (1.400)
countryHaiti 5.867** 11.674***
(2.168) (1.411)
countryHonduras 8.154*** 18.618***
(2.190) (1.438)
countryHong Kong, China 9.664*** 32.103***
(2.302) (1.574)
countryHungary 6.901** 28.202***
(2.288) (1.557)
countryIceland 8.393*** 34.485***
(2.350) (1.631)
countryIndia 13.971*** 15.432***
(2.159) (1.399)
countryIndonesia 10.675*** 15.939***
(2.167) (1.409)
countryIran 0.256 18.056***
(2.250) (1.511)
countryIraq −1.896 15.986***
(2.251) (1.512)
countryIreland 8.536*** 31.531***
(2.309) (1.582)
countryIsrael 9.395*** 32.194***
(2.306) (1.579)
countryItaly 8.460*** 32.368***
(2.321) (1.596)
countryJamaica 11.500*** 28.336***
(2.240) (1.500)
countryJapan 9.201*** 33.171***
(2.321) (1.597)
countryJordan 9.472*** 20.403***
(2.193) (1.442)
countryKenya 11.335*** 14.628***
(2.162) (1.402)
countryKorea, Dem. Rep. 15.650*** 24.573***
(2.182) (1.427)
countryKorea, Rep. 9.455*** 24.841***
(2.227) (1.483)
countryKuwait −10.344*** 25.242***
(2.504) (1.807)
countryLebanon 7.039** 25.219***
(2.254) (1.516)
countryLesotho 13.976*** 12.743***
(2.159) (1.399)
countryLiberia 7.804*** 5.414***
(2.160) (1.400)
countryLibya −2.924 18.152***
(2.285) (1.554)
countryMadagascar 5.475* 9.577***
(2.163) (1.405)
countryMalawi 9.266*** 6.376***
(2.161) (1.401)
countryMalaysia 10.309*** 24.353***
(2.216) (1.469)
countryMali 7.889*** 6.225***
(2.159) (1.399)
countryMauritania 9.907*** 14.094***
(2.164) (1.405)
countryMauritius 11.610*** 25.120***
(2.212) (1.464)
countryMexico 6.405** 24.735***
(2.255) (1.518)
countryMongolia 11.758*** 17.424***
(2.168) (1.410)
countryMontenegro 12.110*** 29.747***
(2.248) (1.509)
countryMorocco 9.573*** 18.563***
(2.182) (1.428)
countryMozambique 6.881** 3.491*
(2.162) (1.403)
countryMyanmar 22.143*** 16.778***
(2.167) (1.409)
countryNamibia 1.226 13.818***
(2.205) (1.456)
countryNepal 11.912*** 11.567***
(2.158) (1.398)
countryNetherlands 6.690** 33.498***
(2.360) (1.643)
countryNew Zealand 6.752** 32.094***
(2.340) (1.619)
countryNicaragua 7.015** 18.814***
(2.199) (1.449)
countryNiger 7.482*** 7.139***
(2.158) (1.398)
countryNigeria 0.236 5.232***
(2.166) (1.408)
countryNorway 5.266* 33.452***
(2.381) (1.666)
countryOman −2.695 17.453***
(2.275) (1.541)
countryPakistan 12.524*** 16.679***
(2.164) (1.405)
countryPanama 11.706*** 27.560***
(2.231) (1.488)
countryParaguay 16.062*** 27.361***
(2.196) (1.445)
countryPeru 2.468 18.574***
(2.233) (1.491)
countryPhilippines 13.968*** 22.075***
(2.178) (1.422)
countryPoland 10.312*** 29.376***
(2.263) (1.527)
countryPortugal 8.670*** 29.339***
(2.281) (1.548)
countryPuerto Rico 11.211*** 31.691***
(2.279) (1.546)
countryReunion 11.900*** 26.603***
(2.221) (1.476)
countryRomania 9.763*** 27.688***
(2.251) (1.512)
countryRwanda 5.802** 4.270**
(2.159) (1.399)
countrySao Tome and Principe 15.282*** 19.655***
(2.164) (1.405)
countrySaudi Arabia −9.374*** 16.662***
(2.350) (1.630)
countrySenegal 6.765** 12.200***
(2.167) (1.409)
countrySerbia 7.871*** 27.629***
(2.270) (1.536)
countrySierra Leone −3.283 −1.092
(2.160) (1.400)
countrySingapore 7.762*** 29.886***
(2.298) (1.569)
countrySlovak Republic 8.651*** 29.571***
(2.284) (1.552)
countrySlovenia 7.244** 30.133***
(2.307) (1.580)
countrySomalia 0.122 3.007*
(2.161) (1.401)
countrySouth Africa −4.901* 13.336***
(2.254) (1.516)
countrySpain 10.452*** 32.825***
(2.301) (1.573)
countrySri Lanka 21.770*** 27.967***
(2.170) (1.412)
countrySudan 2.888 9.729***
(2.172) (1.416)
countrySwaziland −1.101 9.650***
(2.192) (1.440)
countrySweden 7.988*** 34.140***
(2.351) (1.632)
countrySwitzerland 3.963+ 33.022***
(2.394) (1.682)
countrySyria 11.325*** 22.006***
(2.192) (1.440)
countryTaiwan 12.772*** 29.877***
(2.243) (1.503)
countryTanzania 9.881*** 10.351***
(2.159) (1.398)
countryThailand 14.436*** 23.195***
(2.181) (1.426)
countryTogo 10.646*** 13.519***
(2.161) (1.401)
countryTrinidad and Tobago 7.972*** 26.176***
(2.254) (1.516)
countryTunisia 10.108*** 21.293***
(2.195) (1.444)
countryTurkey 6.352** 19.863***
(2.212) (1.464)
countryUganda 10.085*** 10.132***
(2.158) (1.398)
countryUnited Kingdom 5.909* 31.912***
(2.349) (1.629)
countryUnited States 2.477 31.024***
(2.386) (1.673)
countryUruguay 12.138*** 30.162***
(2.252) (1.514)
countryVenezuela 4.388+ 25.434***
(2.285) (1.554)
countryVietnam 18.639*** 19.799***
(2.159) (1.399)
countryWest Bank and Gaza 8.657*** 20.743***
(2.201) (1.451)
countryYemen, Rep. 3.485 8.438***
(2.166) (1.407)
countryZambia 3.440 7.764***
(2.164) (1.405)
countryZimbabwe 17.592*** 15.542***
(2.160) (1.400)
factor(year)1957 1.356+ 2.246***
(0.815) (0.408)
factor(year)1962 2.496** 4.168***
(0.816) (0.413)
factor(year)1967 3.411*** 6.022***
(0.817) (0.421)
factor(year)1972 4.129*** 7.757***
(0.819) (0.435)
factor(year)1977 5.254*** 9.531***
(0.820) (0.445)
factor(year)1982 6.873*** 11.430***
(0.821) (0.450)
factor(year)1987 8.442*** 13.089***
(0.821) (0.452)
factor(year)1992 9.441*** 14.046***
(0.821) (0.451)
factor(year)1997 9.680*** 14.785***
(0.822) (0.460)
factor(year)2002 9.806*** 15.362***
(0.824) (0.470)
factor(year)2007 9.880*** 16.444***
(0.827) (0.492)
Num.Obs. 1704 1704 1704 1704
R2 0.652 0.846 0.720 0.936
RMSE 7.62 5.06 6.84 3.27
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

Código listo para llevar

library(tidyverse) # libreria muy usada para manipular los datos y hacer grficos
library(modelsummary)# para tablas
library(gapminder)   # datos del world bank
library(fixest)      # estimaciones de efectos fijos
library(broom)       # para revisar output de modelos

# Intro------------------------------------------------------
data(gapminder)   # crea un data.frame llamado gapminder

head(gapminder %>% 
       filter(country %in% c("Argentina","Paraguay","Ireland","Syria") & 
                year %in% c(1997,2002,2007)),12)

# Tengamos una data separada para Argentina
Argentina <- gapminder %>% 
  filter(country == "Argentina")

# Veamos la correlación entre 
# ingreso y expectativa de vida en 2007
p1<-gapminder %>% filter(year == 2007) %>%
  ggplot(., aes(x = log(gdpPercap), y = lifeExp)) +
  geom_point() + geom_smooth(method = 'lm') +
  geom_point(data = Argentina[Argentina$year == 2007,], 
             color = "red")

# Veamos la correlación entre 
# ingreso y expectativa de vida en toda la data
p2<-gapminder  %>%
  ggplot(., aes(x = log(gdpPercap), y = lifeExp)) +
  geom_point() + geom_smooth(method = 'lm') +
  geom_point(data = Argentina, 
             color = "red")

# Forma 1---------------------------------
# Minimos Cuadrados Agrupados
m1 <- feols(lifeExp ~ log_gdppc, 
            data = gapminder)
# Efectos fijos por pais
m2 <- feols(lifeExp ~ log_gdppc | country, 
            data = gapminder)
# Efectos fijos por año
m3 <- feols(lifeExp ~ log_gdppc | year, 
            data = gapminder)
# Ambos efectos fijos
m4 <- feols(lifeExp ~ log_gdppc | country + year, 
            data = gapminder)


# Forma 3---------------------------------
# Minimos Cuadrados Agrupados
lm1 <- lm(lifeExp ~ log_gdppc, 
            data = gapminder)
# Efectos fijos por pais
lm2 <- lm(lifeExp ~ log_gdppc + country, 
            data = gapminder)
# Efectos fijos por año
lm3 <- lm(lifeExp ~ log_gdppc + factor(year), 
            data = gapminder)
# Ambos efectos fijos
lm4 <- lm(lifeExp ~ log_gdppc + country + factor(year), 
            data = gapminder)

msummary(list('MCOAg' = lm1, 'FE pais' = lm2,
              'FE año' = lm3, 'FE ambos' = lm4), 
         data = gapminder, stars = TRUE, 
         gof_omit = 'AIC|BIC|F|Lik|Adj|Pseudo')

Fin