En la resolución de este ejercicio debe plantearse un modelo del tipo:

\[GDPcon_{i,t} = \alpha_i + \beta_1 RENcon_{i,t} + \beta_2 ENEcP_{i,t} + \beta_3 CARB_{i,t} + \beta_4 ENEcon_{i,t} + \sigma_1 RD_{i,t} + \sigma_2 DEBgob_{i,t} + \sigma_3 PMmn_{i,t} + \sigma_4 Wealth_{i,t} + \epsilon_{i,t}\]

Ejercicio 1.

Cargamos las variables necesarias de la base de datos

if (!require("readxl")) install.packages("readxl", dependencies = TRUE)
## Loading required package: readxl
library(readxl)

if (!require("dplyr")) install.packages("dplyr", dependencies = TRUE)
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(dplyr)

df <- read_excel("df.xlsx")

df <- df %>% 
  filter(Year >= 1990 & Year <= 2021)

Ejercicio 2

# Calcular estadísticos descriptivos
stats <- df %>%
  summarise(
    Min_GDPcur = min(GDPPcur, na.rm = TRUE),
    Max_GDPcur = max(GDPPcur, na.rm = TRUE),
    Mean_GDPcur = mean(GDPPcur, na.rm = TRUE),
    SD_GDPcur = sd(GDPPcur, na.rm = TRUE),
    
    Min_GDPcon = min(GDPPcon, na.rm = TRUE),
    Max_GDPcon = max(GDPPcon, na.rm = TRUE),
    Mean_GDPcon = mean(GDPPcon, na.rm = TRUE),
    SD_GDPcon = sd(GDPPcon, na.rm = TRUE),
    
    Min_RENcon = min(RENcon, na.rm = TRUE),
    Max_RENcon = max(RENcon, na.rm = TRUE),
    Mean_RENcon = mean(RENcon, na.rm = TRUE),
    SD_RENcon = sd(RENcon, na.rm = TRUE),
    
    Min_ENEcP = min(ENEcP, na.rm = TRUE),
    Max_ENEcP = max(ENEcP, na.rm = TRUE),
    Mean_ENEcP = mean(ENEcP, na.rm = TRUE),
    SD_ENEcP = sd(ENEcP, na.rm = TRUE),
    
    Min_CARB = min(CARB, na.rm = TRUE),
    Max_CARB = max(CARB, na.rm = TRUE),
    Mean_CARB = mean(CARB, na.rm = TRUE),
    SD_CARB = sd(CARB, na.rm = TRUE),
    
    Min_ENEcon = min(ENEcon, na.rm = TRUE),
    Max_ENEcon = max(ENEcon, na.rm = TRUE),
    Mean_ENEcon = mean(ENEcon, na.rm = TRUE),
    SD_ENEcon = sd(ENEcon, na.rm = TRUE),
    
    Min_ID = min(ID, na.rm = TRUE),
    Max_ID = max(ID, na.rm = TRUE),
    Mean_ID = mean(ID, na.rm = TRUE),
    SD_ID = sd(ID, na.rm = TRUE),
    
    Min_DEBgob = min(DEBgob, na.rm = TRUE),
    Max_DEBgob = max(DEBgob, na.rm = TRUE),
    Mean_DEBgob = mean(DEBgob, na.rm = TRUE),
    SD_DEBgob = sd(DEBgob, na.rm = TRUE),
    
    Min_PMmn = min(PMmean, na.rm = TRUE),
    Max_PMmn = max(PMmean, na.rm = TRUE),
    Mean_PMmn = mean(PMmean, na.rm = TRUE),
    SD_PMmn = sd(PMmean, na.rm = TRUE),
    
    Min_Wealth = min(Wealth, na.rm = TRUE),
    Max_Wealth = max(Wealth, na.rm = TRUE),
    Mean_Wealth = mean(Wealth, na.rm = TRUE),
    SD_Wealth = sd(Wealth, na.rm = TRUE)
  )

# Imprimir resultados
print(stats)
## # A tibble: 1 × 40
##   Min_GDPcur Max_GDPcur Mean_GDPcur SD_GDPcur Min_GDPcon Max_GDPcon Mean_GDPcon
##        <dbl>      <dbl>       <dbl>     <dbl>      <dbl>      <dbl>       <dbl>
## 1      4512.    135379.      28670.    18082.     10246.    137821.      41282.
## # ℹ 33 more variables: SD_GDPcon <dbl>, Min_RENcon <dbl>, Max_RENcon <dbl>,
## #   Mean_RENcon <dbl>, SD_RENcon <dbl>, Min_ENEcP <dbl>, Max_ENEcP <dbl>,
## #   Mean_ENEcP <dbl>, SD_ENEcP <dbl>, Min_CARB <dbl>, Max_CARB <dbl>,
## #   Mean_CARB <dbl>, SD_CARB <dbl>, Min_ENEcon <dbl>, Max_ENEcon <dbl>,
## #   Mean_ENEcon <dbl>, SD_ENEcon <dbl>, Min_ID <dbl>, Max_ID <dbl>,
## #   Mean_ID <dbl>, SD_ID <dbl>, Min_DEBgob <dbl>, Max_DEBgob <dbl>,
## #   Mean_DEBgob <dbl>, SD_DEBgob <dbl>, Min_PMmn <dbl>, Max_PMmn <dbl>, …

#Solución dada por chatGPT

if (!require("dplyr")) install.packages("dplyr", dependencies = TRUE)
library(dplyr)

stats <- df %>%
  summarise(across(
    c(GDPPcur, GDPPcon, RENcon, ENEcP, CARB, ENEcon, ID, DEBgob, PMmean, Wealth),
    list(
      Min = \(x) min(x, na.rm = TRUE),
      Max = \(x) max(x, na.rm = TRUE),
      Mean = \(x) mean(x, na.rm = TRUE),
      SD = \(x) sd(x, na.rm = TRUE)
    )
  ))

stats
## # A tibble: 1 × 40
##   GDPPcur_Min GDPPcur_Max GDPPcur_Mean GDPPcur_SD GDPPcon_Min GDPPcon_Max
##         <dbl>       <dbl>        <dbl>      <dbl>       <dbl>       <dbl>
## 1       4512.     135379.       28670.     18082.      10246.     137821.
## # ℹ 34 more variables: GDPPcon_Mean <dbl>, GDPPcon_SD <dbl>, RENcon_Min <dbl>,
## #   RENcon_Max <dbl>, RENcon_Mean <dbl>, RENcon_SD <dbl>, ENEcP_Min <dbl>,
## #   ENEcP_Max <dbl>, ENEcP_Mean <dbl>, ENEcP_SD <dbl>, CARB_Min <dbl>,
## #   CARB_Max <dbl>, CARB_Mean <dbl>, CARB_SD <dbl>, ENEcon_Min <dbl>,
## #   ENEcon_Max <dbl>, ENEcon_Mean <dbl>, ENEcon_SD <dbl>, ID_Min <dbl>,
## #   ID_Max <dbl>, ID_Mean <dbl>, ID_SD <dbl>, DEBgob_Min <dbl>,
## #   DEBgob_Max <dbl>, DEBgob_Mean <dbl>, DEBgob_SD <dbl>, PMmean_Min <dbl>, …

Ejercicio 3.

Gráfico 1

if (!require("ggplot2")) install.packages("ggplot2", dependencies = TRUE)
## Loading required package: ggplot2
library(ggplot2)

# Crear el gráfico de dispersión
ggplot(df, aes(x = GDPPcon, y = ENEppp, color = Country)) +
  geom_point(alpha = 0.7) +  # Puntos semi-transparentes
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") + # Línea de tendencia
  scale_x_log10(labels = scales::label_number()) +  # Transformación logarítmica en el eje X para mejor visualización
  labs(title = "",
       x = "GDPpc PPA",
       y = "Use of energy",
       color = "Country") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 169 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 169 rows containing missing values (`geom_point()`).

Cálculo de las correlaciones de la figura 1

# Calcular la correlación por país
corrF1 <- df %>%
  group_by(Country) %>%
  summarise(correlation = cor(GDPPcon, ENEppp, method = "pearson", use = "complete.obs"))

# Ver las correlaciones por país
print(corrF1)
## # A tibble: 27 × 2
##    Country correlation
##    <chr>         <dbl>
##  1 AUT          -0.849
##  2 BEL          -0.906
##  3 BGR          -0.945
##  4 CYP          -0.728
##  5 CZE          -0.955
##  6 DEU          -0.983
##  7 DNK          -0.900
##  8 ESP          -0.438
##  9 EST          -0.850
## 10 FIN          -0.927
## # ℹ 17 more rows

Figura 2

# Crear el gráfico de dispersión
ggplot(df, aes(x = GDPPcon, y = ENEcP, color = Country)) +
  geom_point(alpha = 0.7) +  # Puntos semi-transparentes
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") + # Línea de tendencia
  scale_x_log10(labels = scales::label_number()) +  # Transformación logarítmica en el eje X para mejor visualización
  labs(title = "",
       x = "GDPpc PPA",
       y = "Energy intensity / GDP per capita",
       color = "Country") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Cálculo de las correlaciones de la figura 2

# Calcular la correlación por país
corrF1 <- df %>%
  group_by(Country) %>%
  summarise(correlation = cor(GDPPcon, ENEppp, method = "pearson", use = "complete.obs"))

# Ver las correlaciones por país
print(corrF1)
## # A tibble: 27 × 2
##    Country correlation
##    <chr>         <dbl>
##  1 AUT          -0.849
##  2 BEL          -0.906
##  3 BGR          -0.945
##  4 CYP          -0.728
##  5 CZE          -0.955
##  6 DEU          -0.983
##  7 DNK          -0.900
##  8 ESP          -0.438
##  9 EST          -0.850
## 10 FIN          -0.927
## # ℹ 17 more rows

Ejercicio 4.

if (!require("plm")) install.packages("plm", dependencies = TRUE)
## Loading required package: plm
## 
## Attaching package: 'plm'
## The following objects are masked from 'package:dplyr':
## 
##     between, lag, lead
library(plm)
dfp <- pdata.frame(df, index = c("Country", "Year"))
modo <- plm(log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + log(ENEcon) + log(ID) + log(DEBgob) +  
                  log(PMmean) + log(Wealth), 
                data = dfp, 
                model = "pooling")

# Resumen del modelo
summary(modo)
## Pooling Model
## 
## Call:
## plm(formula = log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + 
##     log(ENEcon) + log(ID) + log(DEBgob) + log(PMmean) + log(Wealth), 
##     data = dfp, model = "pooling")
## 
## Unbalanced Panel: n = 27, T = 9-21, N = 531
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -0.310470 -0.061960 -0.010138  0.047616  0.350726 
## 
## Coefficients:
##                Estimate  Std. Error  t-value  Pr(>|t|)    
## (Intercept) -3.05554584  0.42298033  -7.2238 1.801e-12 ***
## log(RENcon)  0.02637690  0.00791877   3.3309 0.0009268 ***
## log(ENEcP)  -1.02588843  0.02132472 -48.1079 < 2.2e-16 ***
## log(CARB)    0.00741805  0.00787182   0.9424 0.3464471    
## log(ENEcon)  1.23996755  0.02621826  47.2940 < 2.2e-16 ***
## log(ID)     -0.13879165  0.01361262 -10.1958 < 2.2e-16 ***
## log(DEBgob)  0.00011054  0.00745128   0.0148 0.9881691    
## log(PMmean)  0.04600466  0.01827898   2.5168 0.0121410 *  
## log(Wealth)  0.17640532  0.05583778   3.1592 0.0016734 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    93.575
## Residual Sum of Squares: 5.7581
## R-Squared:      0.93847
## Adj. R-Squared: 0.93752
## F-statistic: 995.137 on 8 and 522 DF, p-value: < 2.22e-16
  1. Efectos fijos.
modw <- plm(log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + log(ENEcon) + log(ID) + log(DEBgob) +  log(PMmean) + log(Wealth), 
             data = dfp, 
             model = "within")

summary(modw)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + 
##     log(ENEcon) + log(ID) + log(DEBgob) + log(PMmean) + log(Wealth), 
##     data = dfp, model = "within")
## 
## Unbalanced Panel: n = 27, T = 9-21, N = 531
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -0.1123210 -0.0193024 -0.0002327  0.0150835  0.3355033 
## 
## Coefficients:
##                Estimate  Std. Error  t-value  Pr(>|t|)    
## log(RENcon)  0.01700706  0.00450656   3.7738 0.0001802 ***
## log(ENEcP)  -0.80263819  0.01449994 -55.3546 < 2.2e-16 ***
## log(CARB)    0.06423612  0.00976299   6.5796 1.201e-10 ***
## log(ENEcon)  1.03418090  0.02186577  47.2968 < 2.2e-16 ***
## log(ID)     -0.02395088  0.01062565  -2.2541 0.0246279 *  
## log(DEBgob) -0.00066482  0.00578529  -0.1149 0.9085592    
## log(PMmean) -0.16206316  0.02034588  -7.9654 1.136e-14 ***
## log(Wealth) -0.12779831  0.04470793  -2.8585 0.0044354 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    11.313
## Residual Sum of Squares: 0.68894
## R-Squared:      0.9391
## Adj. R-Squared: 0.93493
## F-statistic: 956.128 on 8 and 496 DF, p-value: < 2.22e-16
  1. Efectos variables
modr <- plm(log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + log(ENEcon) + log(ID) + log(DEBgob) +  log(PMmean) + log(Wealth), 
             data = dfp, 
             model = "random")

summary(modr)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + 
##     log(ENEcon) + log(ID) + log(DEBgob) + log(PMmean) + log(Wealth), 
##     data = dfp, model = "random")
## 
## Unbalanced Panel: n = 27, T = 9-21, N = 531
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 0.001389 0.037269 0.107
## individual    0.011550 0.107471 0.893
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.8852  0.9245  0.9245  0.9223  0.9245  0.9245 
## 
## Residuals:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -0.13666 -0.02056 -0.00103  0.00001  0.01569  0.33262 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept)  0.47713225  0.30236209   1.5780  0.114562    
## log(RENcon)  0.01715898  0.00447988   3.8302  0.000128 ***
## log(ENEcP)  -0.81097502  0.01440215 -56.3093 < 2.2e-16 ***
## log(CARB)    0.06131966  0.00947189   6.4739 9.553e-11 ***
## log(ENEcon)  1.03077055  0.02084275  49.4546 < 2.2e-16 ***
## log(ID)     -0.02691476  0.01046485  -2.5719  0.010114 *  
## log(DEBgob)  0.00076927  0.00570188   0.1349  0.892679    
## log(PMmean) -0.14880606  0.01945932  -7.6470 2.057e-14 ***
## log(Wealth) -0.11577995  0.04419593  -2.6197  0.008801 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    14.944
## Residual Sum of Squares: 0.7388
## R-Squared:      0.95056
## Adj. R-Squared: 0.94981
## Chisq: 7824.06 on 8 DF, p-value: < 2.22e-16
# Realizar el test de Hausman para mod2
ht <- phtest(modw, modr)
print(ht)
## 
##  Hausman Test
## 
## data:  log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + log(ENEcon) +  ...
## chisq = 16.813, df = 8, p-value = 0.03211
## alternative hypothesis: one model is inconsistent
plmtest(modo, type = "bp")
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + log(ENEcon) +  ...
## chisq = 2777.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects
#Si p < 0.05 → Los efectos individuales son significativos → Efectos aleatorios (RE) es mejor que OLS.
#Si p > 0.05 → No hay evidencia suficiente para rechazar OLS.
pFtest(modw, modo)
## 
##  F test for individual effects
## 
## data:  log(GDPPcon) ~ log(RENcon) + log(ENEcP) + log(CARB) + log(ENEcon) +  ...
## F = 140.36, df1 = 26, df2 = 496, p-value < 2.2e-16
## alternative hypothesis: significant effects
#Si p < 0.05 → Los efectos individuales son significativos → Efectos fijos es mejor que OLS.
#Si p > 0.05 → No hay evidencia suficiente para rechazar OLS.