# =============================================================================
# STATISTIQUES DESCRIPTIVES - Panel Macroprudentiel
# 161 pays × 25 ans (2000-2024) | 4025 observations
# =============================================================================
# --- 1. PACKAGES ---
# install.packages(c("readxl", "dplyr", "psych", "ggplot2", "tidyr", "knitr"))
library(readxl)
library(dplyr)
library(psych)
library(ggplot2)
library(tidyr)
# --- 2. IMPORTATION ---
df_raw <- read_excel("Copie_Panel_X.xlsx", sheet = 1, skip = 3)
# Renommage des colonnes
colnames(df_raw) <- c(
"Pays", "Statut", "Annee", "Cle_panel",
"Credit_growth", "LTV", "DSTI", "LLP_DP", "CCB", "LVR",
"SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX",
"MPI", "BORROWER",
"GDP_growth", "Inflation", "Unemployment", "GDPpc_log",
"Credit_PIB", "Market_Rate",
"Crisis", "COVID", "FINANCIAL"
)
# Nettoyage : lignes valides uniquement
df <- df_raw %>%
filter(!is.na(Annee), !is.na(Pays), Annee != "Annee") %>%
mutate(Annee = as.integer(Annee))
cat("Dimensions :", nrow(df), "observations x", ncol(df), "variables\n")
Dimensions : 4025 observations x 27 variables
cat("Pays :", n_distinct(df$Pays), "| Années :", min(df$Annee), "-", max(df$Annee), "\n\n")
Pays : 161 | Années : 2000 - 2024
# --- 3. APERÇU GENERAL ---
glimpse(df)
Rows: 4,025
Columns: 27
$ Pays <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghani…
$ Statut <chr> "Developpement", "Developpement", "Developpement", "Developpement", …
$ Annee <int> 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 20…
$ Cle_panel <chr> "AFG_2000", "AFG_2001", "AFG_2002", "AFG_2003", "AFG_2004", "AFG_200…
$ Credit_growth <dbl> NA, NA, NA, NA, NA, NA, NA, 65.823, 38.767, 38.916, 36.722, -61.790,…
$ LTV <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ DSTI <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LLP_DP <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ CCB <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LVR <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ SIFI <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ CONC <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LFC <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ RR_FCD <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LCG <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ TAX <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ MPI <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ BORROWER <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ GDP_growth <dbl> NA, -9.4319741, 28.6000012, 8.8322778, 1.4141180, 11.2297148, 5.3574…
$ Inflation <dbl> NA, NA, NA, NA, NA, 12.68626872, 6.78459655, 8.68057079, 26.41866415…
$ Unemployment <dbl> 7.897, 7.973, 7.867, 7.844, 7.794, 7.878, 7.897, 7.841, 7.879, 7.808…
$ GDPpc_log <dbl> 5.731133, 5.624444, 5.823460, 5.846646, 5.824930, 5.896165, 5.907426…
$ Credit_PIB <dbl> NA, NA, NA, NA, NA, NA, 4.8429, 6.8400, 9.3883, 10.5841, 11.5750, 4.…
$ Market_Rate <dbl> NA, NA, NA, NA, NA, NA, NA, 2.500, 6.106, 10.254, 6.119, 5.401, 2.12…
$ Crisis <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ COVID <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,…
$ FINANCIAL <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
# --- 4. STATISTIQUES DESCRIPTIVES GLOBALES ---
## 4a. Variables continues : macroéconomiques
vars_macro <- c("GDP_growth", "Inflation", "Unemployment", "GDPpc_log",
"Credit_PIB", "Market_Rate", "Credit_growth")
cat("\n====== VARIABLES MACROÉCONOMIQUES ======\n")
====== VARIABLES MACROÉCONOMIQUES ======
df %>%
select(all_of(vars_macro)) %>%
describe() %>%
print()
vars n mean sd median trimmed mad min max range skew
GDP_growth 1 3289 3.63 5.07 3.80 3.75 3.16 -36.66 63.33 99.99 0.27
Inflation 2 3187 6.64 15.36 3.68 4.53 3.57 -16.86 359.09 375.95 12.38
Unemployment 3 3219 7.65 5.53 6.15 6.92 4.28 0.10 37.32 37.22 1.50
GDPpc_log 4 3293 8.58 1.43 8.49 8.58 1.66 5.49 11.63 6.14 0.07
Credit_PIB 5 3325 54.90 45.52 41.00 48.11 35.82 0.38 301.02 300.64 1.41
Market_Rate 6 1414 6.14 6.90 4.47 5.04 3.66 -0.65 88.14 88.79 4.76
Credit_growth 7 2915 4.52 19.18 3.76 3.91 11.92 -97.83 196.68 294.51 0.97
kurtosis se
GDP_growth 19.04 0.09
Inflation 210.75 0.27
Unemployment 3.01 0.10
GDPpc_log -0.86 0.02
Credit_PIB 2.03 0.79
Market_Rate 41.55 0.18
Credit_growth 10.66 0.36
## 4b. Variables d'instruments macroprudentiels (binaires 0/1)
vars_mpi <- c("LTV", "DSTI", "LLP_DP", "CCB", "LVR",
"SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX")
cat("\n====== INSTRUMENTS MACROPRUDENTIELS (taux d'activation) ======\n")
====== INSTRUMENTS MACROPRUDENTIELS (taux d'activation) ======
df %>%
select(all_of(vars_mpi)) %>%
summarise(across(everything(), ~ mean(.x, na.rm = TRUE))) %>%
pivot_longer(everything(), names_to = "Instrument", values_to = "Taux_activation") %>%
mutate(Taux_activation = round(Taux_activation * 100, 1)) %>%
arrange(desc(Taux_activation)) %>%
print()
# A tibble: 11 × 2
Instrument Taux_activation
<chr> <dbl>
1 SIFI 12
2 DSTI 10.8
3 LTV 8.1
4 CONC 7.6
5 CCB 7.2
6 LLP_DP 6.4
7 LVR 4.6
8 RR_FCD 3.8
9 TAX 2.1
10 LFC 1.7
11 LCG 1
## 4c. Indices composites
cat("\n====== INDICES COMPOSITES ======\n")
====== INDICES COMPOSITES ======
df %>%
select(MPI, BORROWER, FINANCIAL) %>%
describe() %>%
print()
vars n mean sd median trimmed mad min max range skew kurtosis se
MPI 1 4025 0.65 1.23 0 0.35 0 0 8 8 2.16 4.52 0.02
BORROWER 2 4025 0.19 0.56 0 0.01 0 0 2 2 2.76 5.89 0.01
FINANCIAL 3 4025 0.46 0.90 0 0.25 0 0 6 6 2.19 4.82 0.01
## 4d. Variables binaires (crise, COVID)
cat("\n====== VARIABLES INDICATRICES ======\n")
====== VARIABLES INDICATRICES ======
df %>%
summarise(
Pct_Crisis = round(mean(Crisis, na.rm = TRUE) * 100, 2),
Pct_COVID = round(mean(COVID, na.rm = TRUE) * 100, 2)
) %>%
print()
# A tibble: 1 × 2
Pct_Crisis Pct_COVID
<dbl> <dbl>
1 2.21 8
# --- 5. STATISTIQUES PAR GROUPE (Statut de développement) ---
cat("\n====== STATS PAR STATUT (Développement / Émergent / Avancé) ======\n")
====== STATS PAR STATUT (Développement / Émergent / Avancé) ======
df %>%
group_by(Statut) %>%
summarise(
N = n(),
GDP_growth_m = round(mean(GDP_growth, na.rm = TRUE), 2),
Inflation_m = round(mean(Inflation, na.rm = TRUE), 2),
Credit_PIB_m = round(mean(Credit_PIB, na.rm = TRUE), 2),
MPI_moyen = round(mean(MPI, na.rm = TRUE), 2),
FINANCIAL_m = round(mean(FINANCIAL, na.rm = TRUE), 2),
Pct_Crisis = round(mean(Crisis, na.rm = TRUE) * 100, 1)
) %>%
print()
# A tibble: 3 × 8
Statut N GDP_growth_m Inflation_m Credit_PIB_m MPI_moyen FINANCIAL_m Pct_Crisis
<chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Avance 750 2.4 2.37 104. 1.25 0.86 2.7
2 Developpement 925 4.41 8.25 25.8 0.2 0.15 1.9
3 Emergent 2350 3.77 7.79 50.1 0.64 0.46 2.2
# --- 6. EVOLUTION TEMPORELLE ---
cat("\n====== ÉVOLUTION ANNUELLE MOYENNE ======\n")
====== ÉVOLUTION ANNUELLE MOYENNE ======
evolution <- df %>%
group_by(Annee) %>%
summarise(
MPI_moy = round(mean(MPI, na.rm = TRUE), 3),
GDP_growth_moy = round(mean(GDP_growth, na.rm = TRUE), 2),
Credit_PIB_moy = round(mean(Credit_PIB, na.rm = TRUE), 2),
N_obs = n()
)
print(evolution)
# A tibble: 25 × 5
Annee MPI_moy GDP_growth_moy Credit_PIB_moy N_obs
<int> <dbl> <dbl> <dbl> <int>
1 2000 0.106 4.79 39.2 161
2 2001 0.106 3.49 46.1 161
3 2002 0.087 3.81 45.2 161
4 2003 0.149 4 46 161
5 2004 0.242 5.92 46.5 161
6 2005 0.174 5.05 49.4 161
7 2006 0.224 6.36 51.4 161
8 2007 0.261 6.2 54.7 161
9 2008 0.379 4.42 56.0 161
10 2009 0.335 -0.03 57.3 161
# ℹ 15 more rows
# ℹ Use `print(n = ...)` to see more rows
# --- 7. VALEURS MANQUANTES ---
cat("\n====== VALEURS MANQUANTES (%) ======\n")
====== VALEURS MANQUANTES (%) ======
df %>%
summarise(across(everything(), ~ round(mean(is.na(.x)) * 100, 1))) %>%
pivot_longer(everything(), names_to = "Variable", values_to = "Pct_NA") %>%
filter(Pct_NA > 0) %>%
arrange(desc(Pct_NA)) %>%
print()
# A tibble: 7 × 2
Variable Pct_NA
<chr> <dbl>
1 Market_Rate 64.9
2 Credit_growth 27.6
3 Inflation 20.8
4 Unemployment 20
5 GDP_growth 18.3
6 GDPpc_log 18.2
7 Credit_PIB 17.4
# --- 8. GRAPHIQUES ---
## 8a. Distribution de GDP_growth
p1 <- ggplot(df, aes(x = GDP_growth)) +
geom_histogram(binwidth = 1, fill = "#2C7BB6", color = "white", alpha = 0.8) +
labs(title = "Distribution de la croissance du PIB",
x = "Croissance du PIB (%)", y = "Fréquence") +
theme_minimal()
print(p1)

## 8b. MPI moyen par statut au fil du temps
p2 <- df %>%
group_by(Annee, Statut) %>%
summarise(MPI_moy = mean(MPI, na.rm = TRUE), .groups = "drop") %>%
ggplot(aes(x = Annee, y = MPI_moy, color = Statut)) +
geom_line(linewidth = 1) +
labs(title = "Évolution de l'indice MPI moyen par groupe",
x = "Année", y = "MPI moyen (0-11)", color = "Statut") +
theme_minimal()
print(p2)

## 8c. Taux d'activation des instruments MPI
df %>%
select(all_of(vars_mpi)) %>%
summarise(across(everything(), ~ mean(.x, na.rm = TRUE) * 100)) %>%
pivot_longer(everything(), names_to = "Instrument", values_to = "Pct") %>%
ggplot(aes(x = reorder(Instrument, Pct), y = Pct, fill = Pct)) +
geom_col() +
coord_flip() +
scale_fill_gradient(low = "#D7E9F7", high = "#1A5276") +
labs(title = "Taux d'activation des instruments macroprudentiels (%)",
x = "", y = "% d'observations actives", fill = "%") +
theme_minimal() +
theme(legend.position = "none") -> p3
print(p3)

## 8d. Boxplot GDP growth par statut
p4 <- ggplot(df, aes(x = Statut, y = GDP_growth, fill = Statut)) +
geom_boxplot(outlier.alpha = 0.3) +
labs(title = "Croissance du PIB par statut de développement",
x = "Statut", y = "Croissance du PIB (%)") +
theme_minimal() +
theme(legend.position = "none")
print(p4)

cat("\n✅ Analyse terminée.\n")
✅ Analyse terminée.
# =============================================================================
# TABLEAU DE STATISTIQUES DESCRIPTIVES
# Variables macro + Instruments MPI
# =============================================================================
library(readxl)
library(dplyr)
library(tidyr)
# --- IMPORTATION & NETTOYAGE ---
df_raw <- read_excel("Copie_Panel_X.xlsx", sheet = 1, skip = 3)
colnames(df_raw) <- c(
"Pays", "Statut", "Annee", "Cle_panel",
"Credit_growth", "LTV", "DSTI", "LLP_DP", "CCB", "LVR",
"SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX",
"MPI", "BORROWER",
"GDP_growth", "Inflation", "Unemployment", "GDPpc_log",
"Credit_PIB", "Market_Rate",
"Crisis", "COVID", "FINANCIAL"
)
df <- df_raw %>%
filter(!is.na(Annee), !is.na(Pays), Annee != "Annee") %>%
mutate(Annee = as.integer(Annee))
# --- VARIABLES SELECTIONNEES ---
vars_macro <- c("GDP_growth", "Inflation", "Unemployment",
"GDPpc_log", "Credit_PIB", "Market_Rate", "Credit_growth")
vars_mpi <- c("LTV", "DSTI", "LLP_DP", "CCB", "LVR",
"SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX")
# --- FONCTION : stats pour une variable ---
stats_var <- function(x) {
c(
N = sum(!is.na(x)),
Moyenne = round(mean(x, na.rm = TRUE), 3),
Ecart_type = round(sd(x, na.rm = TRUE), 3),
Min = round(min(x, na.rm = TRUE), 3),
P25 = round(quantile(x, 0.25, na.rm = TRUE), 3),
Mediane = round(median(x, na.rm = TRUE), 3),
P75 = round(quantile(x, 0.75, na.rm = TRUE), 3),
Max = round(max(x, na.rm = TRUE), 3),
NA_pct = round(mean(is.na(x)) * 100, 1)
)
}
# --- TABLEAU VARIABLES MACRO ---
tableau_macro <- do.call(rbind, lapply(vars_macro, function(v) {
stats_var(df[[v]])
}))
rownames(tableau_macro) <- vars_macro
cat("\n========================================================\n")
========================================================
cat(" STATISTIQUES DESCRIPTIVES — VARIABLES MACROÉCONOMIQUES\n")
STATISTIQUES DESCRIPTIVES — VARIABLES MACROÉCONOMIQUES
cat("========================================================\n")
========================================================
print(tableau_macro)
N Moyenne Ecart_type Min P25.25% Mediane P75.75% Max NA_pct
GDP_growth 3289 3.632 5.071 -36.657 1.636 3.803 5.908 63.335 18.3
Inflation 3187 6.638 15.358 -16.860 1.803 3.683 7.446 359.093 20.8
Unemployment 3219 7.650 5.532 0.100 3.740 6.147 10.344 37.320 20.0
GDPpc_log 3293 8.583 1.433 5.493 7.485 8.490 9.759 11.630 18.2
Credit_PIB 3325 54.900 45.524 0.383 21.470 40.996 75.509 301.019 17.4
Market_Rate 1414 6.136 6.896 -0.654 2.291 4.471 7.620 88.140 64.9
Credit_growth 2915 4.522 19.180 -97.827 -4.130 3.761 11.988 196.680 27.6
# --- TABLEAU INSTRUMENTS MPI ---
tableau_mpi <- do.call(rbind, lapply(vars_mpi, function(v) {
x <- df[[v]]
c(
N = sum(!is.na(x)),
Moyenne = round(mean(x, na.rm = TRUE), 3),
Ecart_type = round(sd(x, na.rm = TRUE), 3),
Min = round(min(x, na.rm = TRUE), 3),
Mediane = round(median(x, na.rm = TRUE), 3),
Max = round(max(x, na.rm = TRUE), 3),
Taux_activation_pct = round(mean(x == 1, na.rm = TRUE) * 100, 1),
NA_pct = round(mean(is.na(x)) * 100, 1)
)
}))
rownames(tableau_mpi) <- vars_mpi
cat("\n========================================================\n")
========================================================
cat(" STATISTIQUES DESCRIPTIVES — INSTRUMENTS MPI (0/1)\n")
STATISTIQUES DESCRIPTIVES — INSTRUMENTS MPI (0/1)
cat("========================================================\n")
========================================================
print(tableau_mpi)
N Moyenne Ecart_type Min Mediane Max Taux_activation_pct NA_pct
LTV 4025 0.081 0.273 0 0 1 8.1 0
DSTI 4025 0.108 0.311 0 0 1 10.8 0
LLP_DP 4025 0.064 0.244 0 0 1 6.4 0
CCB 4025 0.072 0.258 0 0 1 7.2 0
LVR 4025 0.046 0.209 0 0 1 4.6 0
SIFI 4025 0.120 0.326 0 0 1 12.0 0
CONC 4025 0.076 0.265 0 0 1 7.6 0
LFC 4025 0.017 0.131 0 0 1 1.7 0
RR_FCD 4025 0.038 0.192 0 0 1 3.8 0
LCG 4025 0.010 0.098 0 0 1 1.0 0
TAX 4025 0.021 0.143 0 0 1 2.1 0
# =============================================================================
# MODÈLE DE BASE — RÉGRESSION PANEL (VERSION CORRIGÉE)
# Yi,t = a*Yi,t-1 + b*MPI(t-1) + mu_i + lambda_t + e(i,t)
# Y = Credit_growth | Effets fixes pays + année
# =============================================================================
library(readxl)
library(dplyr)
library(plm)
library(lmtest)
library(sandwich)
# --- 1. IMPORTATION & NETTOYAGE ---
df_raw <- read_excel("Copie_Panel_X.xlsx", sheet = 1, skip = 3)
colnames(df_raw) <- c(
"Pays", "Statut", "Annee", "Cle_panel",
"Credit_growth", "LTV", "DSTI", "LLP_DP", "CCB", "LVR",
"SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX",
"MPI", "BORROWER",
"GDP_growth", "Inflation", "Unemployment", "GDPpc_log",
"Credit_PIB", "Market_Rate",
"Crisis", "COVID", "FINANCIAL"
)
df <- df_raw %>%
filter(!is.na(Annee), !is.na(Pays), Annee != "Annee") %>%
mutate(Annee = as.integer(Annee))
# --- 2. CRÉATION DES LAGS (correction : dplyr::lag forcé) ---
df <- df %>%
arrange(Pays, Annee) %>%
group_by(Pays) %>%
mutate(
L_Credit_growth = dplyr::lag(Credit_growth, 1), # Yi,t-1
L_MPI = dplyr::lag(MPI, 1) # MPI(t-1)
) %>%
ungroup()
cat("Observations totales :", nrow(df), "\n")
Observations totales : 4025
cat("Observations complètes (sans NA) :",
sum(complete.cases(df[, c("Credit_growth", "L_Credit_growth", "L_MPI")])), "\n\n")
Observations complètes (sans NA) : 2767
# Vérification rapide : les deux colonnes ne doivent PAS être identiques
cat("Vérification lag — corrélation Credit_growth vs L_Credit_growth :",
round(cor(df$Credit_growth, df$L_Credit_growth, use = "complete.obs"), 3),
"(doit être < 1)\n\n")
Vérification lag — corrélation Credit_growth vs L_Credit_growth : 0.407 (doit être < 1)
# --- 3. DÉCLARATION DU PANEL ---
pdf <- pdata.frame(df, index = c("Pays", "Annee"))
# --- 4. MODÈLE DE BASE ---
modele_base <- plm(
Credit_growth ~ L_Credit_growth + L_MPI,
data = pdf,
model = "within",
effect = "twoways"
)
cat("======================================================\n")
======================================================
cat(" MODÈLE DE BASE — Effets fixes pays + année (within)\n")
MODÈLE DE BASE — Effets fixes pays + année (within)
cat("======================================================\n")
======================================================
summary(modele_base)
Twoways effects Within Model
Call:
plm(formula = Credit_growth ~ L_Credit_growth + L_MPI, data = pdf,
effect = "twoways", model = "within")
Unbalanced Panel: n = 146, T = 2-23, N = 2767
Residuals:
Min. 1st Qu. Median 3rd Qu. Max.
-85.662206 -6.167051 0.068461 5.698592 157.680534
Coefficients:
Estimate Std. Error t-value Pr(>|t|)
L_Credit_growth 0.258089 0.018049 14.2993 <2e-16 ***
L_MPI -0.063680 0.310963 -0.2048 0.8378
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Total Sum of Squares: 662510
Residual Sum of Squares: 614150
R-Squared: 0.072986
Adj. R-Squared: 0.012661
F-statistic: 102.235 on 2 and 2597 DF, p-value: < 2.22e-16
# --- 5. ERREURS ROBUSTES CLUSTÉRISÉES PAR PAYS ---
cat("\n======================================================\n")
======================================================
cat(" RÉSULTATS AVEC ERREURS ROBUSTES (cluster = pays)\n")
RÉSULTATS AVEC ERREURS ROBUSTES (cluster = pays)
cat("======================================================\n")
======================================================
coeftest(modele_base,
vcov = vcovHC(modele_base, type = "HC1", cluster = "group"))
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
L_Credit_growth 0.25809 0.04851 5.3203 1.124e-07 ***
L_MPI -0.06368 0.25597 -0.2488 0.8036
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# --- 6. TEST EFFETS FIXES ---
cat("\n--- Test de significativité des effets fixes ---\n")
--- Test de significativité des effets fixes ---
pFtest(modele_base,
plm(Credit_growth ~ L_Credit_growth + L_MPI,
data = pdf, model = "pooling"))
F test for twoways effects
data: Credit_growth ~ L_Credit_growth + L_MPI
F = 4.5097, df1 = 167, df2 = 2597, p-value < 2.2e-16
alternative hypothesis: significant effects
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpgYGB7cn0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMgLSBQYW5lbCBNYWNyb3BydWRlbnRpZWwKIyAxNjEgcGF5cyDDlyAyNSBhbnMgKDIwMDAtMjAyNCkgfCA0MDI1IG9ic2VydmF0aW9ucwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIC0tLSAxLiBQQUNLQUdFUyAtLS0KIyBpbnN0YWxsLnBhY2thZ2VzKGMoInJlYWR4bCIsICJkcGx5ciIsICJwc3ljaCIsICJnZ3Bsb3QyIiwgInRpZHlyIiwgImtuaXRyIikpCgpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShkcGx5cikKbGlicmFyeShwc3ljaCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHlyKQoKCiMgLS0tIDIuIElNUE9SVEFUSU9OIC0tLQpkZl9yYXcgPC0gcmVhZF9leGNlbCgiQ29waWVfUGFuZWxfWC54bHN4Iiwgc2hlZXQgPSAxLCBza2lwID0gMykKCiMgUmVub21tYWdlIGRlcyBjb2xvbm5lcwpjb2xuYW1lcyhkZl9yYXcpIDwtIGMoCiAgIlBheXMiLCAiU3RhdHV0IiwgIkFubmVlIiwgIkNsZV9wYW5lbCIsCiAgIkNyZWRpdF9ncm93dGgiLCAiTFRWIiwgIkRTVEkiLCAiTExQX0RQIiwgIkNDQiIsICJMVlIiLAogICJTSUZJIiwgIkNPTkMiLCAiTEZDIiwgIlJSX0ZDRCIsICJMQ0ciLCAiVEFYIiwKICAiTVBJIiwgIkJPUlJPV0VSIiwKICAiR0RQX2dyb3d0aCIsICJJbmZsYXRpb24iLCAiVW5lbXBsb3ltZW50IiwgIkdEUHBjX2xvZyIsCiAgIkNyZWRpdF9QSUIiLCAiTWFya2V0X1JhdGUiLAogICJDcmlzaXMiLCAiQ09WSUQiLCAiRklOQU5DSUFMIgopCgojIE5ldHRveWFnZSA6IGxpZ25lcyB2YWxpZGVzIHVuaXF1ZW1lbnQKZGYgPC0gZGZfcmF3ICU+JQogIGZpbHRlcighaXMubmEoQW5uZWUpLCAhaXMubmEoUGF5cyksIEFubmVlICE9ICJBbm5lZSIpICU+JQogIG11dGF0ZShBbm5lZSA9IGFzLmludGVnZXIoQW5uZWUpKQoKY2F0KCJEaW1lbnNpb25zIDoiLCBucm93KGRmKSwgIm9ic2VydmF0aW9ucyB4IiwgbmNvbChkZiksICJ2YXJpYWJsZXNcbiIpCmNhdCgiUGF5cyA6Iiwgbl9kaXN0aW5jdChkZiRQYXlzKSwgInwgQW5uw6llcyA6IiwgbWluKGRmJEFubmVlKSwgIi0iLCBtYXgoZGYkQW5uZWUpLCAiXG5cbiIpCgoKIyAtLS0gMy4gQVBFUsOHVSBHRU5FUkFMIC0tLQpnbGltcHNlKGRmKQoKCiMgLS0tIDQuIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMgR0xPQkFMRVMgLS0tCgojIyA0YS4gVmFyaWFibGVzIGNvbnRpbnVlcyA6IG1hY3Jvw6ljb25vbWlxdWVzCnZhcnNfbWFjcm8gPC0gYygiR0RQX2dyb3d0aCIsICJJbmZsYXRpb24iLCAiVW5lbXBsb3ltZW50IiwgIkdEUHBjX2xvZyIsCiAgICAgICAgICAgICAgICAiQ3JlZGl0X1BJQiIsICJNYXJrZXRfUmF0ZSIsICJDcmVkaXRfZ3Jvd3RoIikKCmNhdCgiXG49PT09PT0gVkFSSUFCTEVTIE1BQ1JPw4lDT05PTUlRVUVTID09PT09PVxuIikKZGYgJT4lCiAgc2VsZWN0KGFsbF9vZih2YXJzX21hY3JvKSkgJT4lCiAgZGVzY3JpYmUoKSAlPiUKICBwcmludCgpCgojIyA0Yi4gVmFyaWFibGVzIGQnaW5zdHJ1bWVudHMgbWFjcm9wcnVkZW50aWVscyAoYmluYWlyZXMgMC8xKQp2YXJzX21waSA8LSBjKCJMVFYiLCAiRFNUSSIsICJMTFBfRFAiLCAiQ0NCIiwgIkxWUiIsCiAgICAgICAgICAgICAgIlNJRkkiLCAiQ09OQyIsICJMRkMiLCAiUlJfRkNEIiwgIkxDRyIsICJUQVgiKQoKY2F0KCJcbj09PT09PSBJTlNUUlVNRU5UUyBNQUNST1BSVURFTlRJRUxTICh0YXV4IGQnYWN0aXZhdGlvbikgPT09PT09XG4iKQpkZiAlPiUKICBzZWxlY3QoYWxsX29mKHZhcnNfbXBpKSkgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIH4gbWVhbigueCwgbmEucm0gPSBUUlVFKSkpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIkluc3RydW1lbnQiLCB2YWx1ZXNfdG8gPSAiVGF1eF9hY3RpdmF0aW9uIikgJT4lCiAgbXV0YXRlKFRhdXhfYWN0aXZhdGlvbiA9IHJvdW5kKFRhdXhfYWN0aXZhdGlvbiAqIDEwMCwgMSkpICU+JQogIGFycmFuZ2UoZGVzYyhUYXV4X2FjdGl2YXRpb24pKSAlPiUKICBwcmludCgpCgojIyA0Yy4gSW5kaWNlcyBjb21wb3NpdGVzCmNhdCgiXG49PT09PT0gSU5ESUNFUyBDT01QT1NJVEVTID09PT09PVxuIikKZGYgJT4lCiAgc2VsZWN0KE1QSSwgQk9SUk9XRVIsIEZJTkFOQ0lBTCkgJT4lCiAgZGVzY3JpYmUoKSAlPiUKICBwcmludCgpCgojIyA0ZC4gVmFyaWFibGVzIGJpbmFpcmVzIChjcmlzZSwgQ09WSUQpCmNhdCgiXG49PT09PT0gVkFSSUFCTEVTIElORElDQVRSSUNFUyA9PT09PT1cbiIpCmRmICU+JQogIHN1bW1hcmlzZSgKICAgIFBjdF9DcmlzaXMgID0gcm91bmQobWVhbihDcmlzaXMsICBuYS5ybSA9IFRSVUUpICogMTAwLCAyKSwKICAgIFBjdF9DT1ZJRCAgID0gcm91bmQobWVhbihDT1ZJRCwgICBuYS5ybSA9IFRSVUUpICogMTAwLCAyKQogICkgJT4lCiAgcHJpbnQoKQoKCiMgLS0tIDUuIFNUQVRJU1RJUVVFUyBQQVIgR1JPVVBFIChTdGF0dXQgZGUgZMOpdmVsb3BwZW1lbnQpIC0tLQpjYXQoIlxuPT09PT09IFNUQVRTIFBBUiBTVEFUVVQgKETDqXZlbG9wcGVtZW50IC8gw4ltZXJnZW50IC8gQXZhbmPDqSkgPT09PT09XG4iKQoKZGYgJT4lCiAgZ3JvdXBfYnkoU3RhdHV0KSAlPiUKICBzdW1tYXJpc2UoCiAgICBOICAgICAgICAgICAgID0gbigpLAogICAgR0RQX2dyb3d0aF9tICA9IHJvdW5kKG1lYW4oR0RQX2dyb3d0aCwgIG5hLnJtID0gVFJVRSksIDIpLAogICAgSW5mbGF0aW9uX20gICA9IHJvdW5kKG1lYW4oSW5mbGF0aW9uLCAgIG5hLnJtID0gVFJVRSksIDIpLAogICAgQ3JlZGl0X1BJQl9tICA9IHJvdW5kKG1lYW4oQ3JlZGl0X1BJQiwgIG5hLnJtID0gVFJVRSksIDIpLAogICAgTVBJX21veWVuICAgICA9IHJvdW5kKG1lYW4oTVBJLCAgICAgICAgIG5hLnJtID0gVFJVRSksIDIpLAogICAgRklOQU5DSUFMX20gICA9IHJvdW5kKG1lYW4oRklOQU5DSUFMLCAgIG5hLnJtID0gVFJVRSksIDIpLAogICAgUGN0X0NyaXNpcyAgICA9IHJvdW5kKG1lYW4oQ3Jpc2lzLCAgICAgIG5hLnJtID0gVFJVRSkgKiAxMDAsIDEpCiAgKSAlPiUKICBwcmludCgpCgoKIyAtLS0gNi4gRVZPTFVUSU9OIFRFTVBPUkVMTEUgLS0tCmNhdCgiXG49PT09PT0gw4lWT0xVVElPTiBBTk5VRUxMRSBNT1lFTk5FID09PT09PVxuIikKCmV2b2x1dGlvbiA8LSBkZiAlPiUKICBncm91cF9ieShBbm5lZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgTVBJX21veSAgICAgICAgICA9IHJvdW5kKG1lYW4oTVBJLCAgICAgICAgIG5hLnJtID0gVFJVRSksIDMpLAogICAgR0RQX2dyb3d0aF9tb3kgICA9IHJvdW5kKG1lYW4oR0RQX2dyb3d0aCwgIG5hLnJtID0gVFJVRSksIDIpLAogICAgQ3JlZGl0X1BJQl9tb3kgICA9IHJvdW5kKG1lYW4oQ3JlZGl0X1BJQiwgIG5hLnJtID0gVFJVRSksIDIpLAogICAgTl9vYnMgICAgICAgICAgICA9IG4oKQogICkKcHJpbnQoZXZvbHV0aW9uKQoKCiMgLS0tIDcuIFZBTEVVUlMgTUFOUVVBTlRFUyAtLS0KY2F0KCJcbj09PT09PSBWQUxFVVJTIE1BTlFVQU5URVMgKCUpID09PT09PVxuIikKZGYgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIH4gcm91bmQobWVhbihpcy5uYSgueCkpICogMTAwLCAxKSkpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlZhcmlhYmxlIiwgdmFsdWVzX3RvID0gIlBjdF9OQSIpICU+JQogIGZpbHRlcihQY3RfTkEgPiAwKSAlPiUKICBhcnJhbmdlKGRlc2MoUGN0X05BKSkgJT4lCiAgcHJpbnQoKQoKCiMgLS0tIDguIEdSQVBISVFVRVMgLS0tCgojIyA4YS4gRGlzdHJpYnV0aW9uIGRlIEdEUF9ncm93dGgKcDEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IEdEUF9ncm93dGgpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLCBmaWxsID0gIiMyQzdCQjYiLCBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44KSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gZGUgbGEgY3JvaXNzYW5jZSBkdSBQSUIiLAogICAgICAgeCA9ICJDcm9pc3NhbmNlIGR1IFBJQiAoJSkiLCB5ID0gIkZyw6lxdWVuY2UiKSArCiAgdGhlbWVfbWluaW1hbCgpCnByaW50KHAxKQoKIyMgOGIuIE1QSSBtb3llbiBwYXIgc3RhdHV0IGF1IGZpbCBkdSB0ZW1wcwpwMiA8LSBkZiAlPiUKICBncm91cF9ieShBbm5lZSwgU3RhdHV0KSAlPiUKICBzdW1tYXJpc2UoTVBJX21veSA9IG1lYW4oTVBJLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBBbm5lZSwgeSA9IE1QSV9tb3ksIGNvbG9yID0gU3RhdHV0KSkgKwogIGdlb21fbGluZShsaW5ld2lkdGggPSAxKSArCiAgbGFicyh0aXRsZSA9ICLDiXZvbHV0aW9uIGRlIGwnaW5kaWNlIE1QSSBtb3llbiBwYXIgZ3JvdXBlIiwKICAgICAgIHggPSAiQW5uw6llIiwgeSA9ICJNUEkgbW95ZW4gKDAtMTEpIiwgY29sb3IgPSAiU3RhdHV0IikgKwogIHRoZW1lX21pbmltYWwoKQpwcmludChwMikKCiMjIDhjLiBUYXV4IGQnYWN0aXZhdGlvbiBkZXMgaW5zdHJ1bWVudHMgTVBJCmRmICU+JQogIHNlbGVjdChhbGxfb2YodmFyc19tcGkpKSAlPiUKICBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfiBtZWFuKC54LCBuYS5ybSA9IFRSVUUpICogMTAwKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiSW5zdHJ1bWVudCIsIHZhbHVlc190byA9ICJQY3QiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKEluc3RydW1lbnQsIFBjdCksIHkgPSBQY3QsIGZpbGwgPSBQY3QpKSArCiAgZ2VvbV9jb2woKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICIjRDdFOUY3IiwgaGlnaCA9ICIjMUE1Mjc2IikgKwogIGxhYnModGl0bGUgPSAiVGF1eCBkJ2FjdGl2YXRpb24gZGVzIGluc3RydW1lbnRzIG1hY3JvcHJ1ZGVudGllbHMgKCUpIiwKICAgICAgIHggPSAiIiwgeSA9ICIlIGQnb2JzZXJ2YXRpb25zIGFjdGl2ZXMiLCBmaWxsID0gIiUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIC0+IHAzCnByaW50KHAzKQoKIyMgOGQuIEJveHBsb3QgR0RQIGdyb3d0aCBwYXIgc3RhdHV0CnA0IDwtIGdncGxvdChkZiwgYWVzKHggPSBTdGF0dXQsIHkgPSBHRFBfZ3Jvd3RoLCBmaWxsID0gU3RhdHV0KSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLmFscGhhID0gMC4zKSArCiAgbGFicyh0aXRsZSA9ICJDcm9pc3NhbmNlIGR1IFBJQiBwYXIgc3RhdHV0IGRlIGTDqXZlbG9wcGVtZW50IiwKICAgICAgIHggPSAiU3RhdHV0IiwgeSA9ICJDcm9pc3NhbmNlIGR1IFBJQiAoJSkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCnByaW50KHA0KQoKY2F0KCJcbuKchSBBbmFseXNlIHRlcm1pbsOpZS5cbiIpCmBgYAoKYGBge3J9CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUQUJMRUFVIERFIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMKIyBWYXJpYWJsZXMgbWFjcm8gKyBJbnN0cnVtZW50cyBNUEkKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCgojIC0tLSBJTVBPUlRBVElPTiAmIE5FVFRPWUFHRSAtLS0KZGZfcmF3IDwtIHJlYWRfZXhjZWwoIkNvcGllX1BhbmVsX1gueGxzeCIsIHNoZWV0ID0gMSwgc2tpcCA9IDMpCgpjb2xuYW1lcyhkZl9yYXcpIDwtIGMoCiAgIlBheXMiLCAiU3RhdHV0IiwgIkFubmVlIiwgIkNsZV9wYW5lbCIsCiAgIkNyZWRpdF9ncm93dGgiLCAiTFRWIiwgIkRTVEkiLCAiTExQX0RQIiwgIkNDQiIsICJMVlIiLAogICJTSUZJIiwgIkNPTkMiLCAiTEZDIiwgIlJSX0ZDRCIsICJMQ0ciLCAiVEFYIiwKICAiTVBJIiwgIkJPUlJPV0VSIiwKICAiR0RQX2dyb3d0aCIsICJJbmZsYXRpb24iLCAiVW5lbXBsb3ltZW50IiwgIkdEUHBjX2xvZyIsCiAgIkNyZWRpdF9QSUIiLCAiTWFya2V0X1JhdGUiLAogICJDcmlzaXMiLCAiQ09WSUQiLCAiRklOQU5DSUFMIgopCgpkZiA8LSBkZl9yYXcgJT4lCiAgZmlsdGVyKCFpcy5uYShBbm5lZSksICFpcy5uYShQYXlzKSwgQW5uZWUgIT0gIkFubmVlIikgJT4lCiAgbXV0YXRlKEFubmVlID0gYXMuaW50ZWdlcihBbm5lZSkpCgoKIyAtLS0gVkFSSUFCTEVTIFNFTEVDVElPTk5FRVMgLS0tCnZhcnNfbWFjcm8gPC0gYygiR0RQX2dyb3d0aCIsICJJbmZsYXRpb24iLCAiVW5lbXBsb3ltZW50IiwKICAgICAgICAgICAgICAgICJHRFBwY19sb2ciLCAiQ3JlZGl0X1BJQiIsICJNYXJrZXRfUmF0ZSIsICJDcmVkaXRfZ3Jvd3RoIikKCnZhcnNfbXBpIDwtIGMoIkxUViIsICJEU1RJIiwgIkxMUF9EUCIsICJDQ0IiLCAiTFZSIiwKICAgICAgICAgICAgICAiU0lGSSIsICJDT05DIiwgIkxGQyIsICJSUl9GQ0QiLCAiTENHIiwgIlRBWCIpCgoKIyAtLS0gRk9OQ1RJT04gOiBzdGF0cyBwb3VyIHVuZSB2YXJpYWJsZSAtLS0Kc3RhdHNfdmFyIDwtIGZ1bmN0aW9uKHgpIHsKICBjKAogICAgTiAgICAgICA9IHN1bSghaXMubmEoeCkpLAogICAgTW95ZW5uZSA9IHJvdW5kKG1lYW4oeCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICBFY2FydF90eXBlID0gcm91bmQoc2QoeCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICBNaW4gICAgID0gcm91bmQobWluKHgsIG5hLnJtID0gVFJVRSksIDMpLAogICAgUDI1ICAgICA9IHJvdW5kKHF1YW50aWxlKHgsIDAuMjUsIG5hLnJtID0gVFJVRSksIDMpLAogICAgTWVkaWFuZSA9IHJvdW5kKG1lZGlhbih4LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgIFA3NSAgICAgPSByb3VuZChxdWFudGlsZSh4LCAwLjc1LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgIE1heCAgICAgPSByb3VuZChtYXgoeCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICBOQV9wY3QgID0gcm91bmQobWVhbihpcy5uYSh4KSkgKiAxMDAsIDEpCiAgKQp9CgoKIyAtLS0gVEFCTEVBVSBWQVJJQUJMRVMgTUFDUk8gLS0tCnRhYmxlYXVfbWFjcm8gPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHZhcnNfbWFjcm8sIGZ1bmN0aW9uKHYpIHsKICBzdGF0c192YXIoZGZbW3ZdXSkKfSkpCnJvd25hbWVzKHRhYmxlYXVfbWFjcm8pIDwtIHZhcnNfbWFjcm8KCmNhdCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCIgIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMg4oCUIFZBUklBQkxFUyBNQUNST8OJQ09OT01JUVVFU1xuIikKY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKcHJpbnQodGFibGVhdV9tYWNybykKCgojIC0tLSBUQUJMRUFVIElOU1RSVU1FTlRTIE1QSSAtLS0KdGFibGVhdV9tcGkgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHZhcnNfbXBpLCBmdW5jdGlvbih2KSB7CiAgeCA8LSBkZltbdl1dCiAgYygKICAgIE4gICAgICAgICAgPSBzdW0oIWlzLm5hKHgpKSwKICAgIE1veWVubmUgICAgPSByb3VuZChtZWFuKHgsIG5hLnJtID0gVFJVRSksIDMpLAogICAgRWNhcnRfdHlwZSA9IHJvdW5kKHNkKHgsIG5hLnJtID0gVFJVRSksIDMpLAogICAgTWluICAgICAgICA9IHJvdW5kKG1pbih4LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgIE1lZGlhbmUgICAgPSByb3VuZChtZWRpYW4oeCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICBNYXggICAgICAgID0gcm91bmQobWF4KHgsIG5hLnJtID0gVFJVRSksIDMpLAogICAgVGF1eF9hY3RpdmF0aW9uX3BjdCA9IHJvdW5kKG1lYW4oeCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwLCAxKSwKICAgIE5BX3BjdCAgICAgPSByb3VuZChtZWFuKGlzLm5hKHgpKSAqIDEwMCwgMSkKICApCn0pKQpyb3duYW1lcyh0YWJsZWF1X21waSkgPC0gdmFyc19tcGkKCmNhdCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCIgIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMg4oCUIElOU1RSVU1FTlRTIE1QSSAoMC8xKVxuIikKY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKcHJpbnQodGFibGVhdV9tcGkpCmBgYApgYGB7cn0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1PRMOITEUgREUgQkFTRSDigJQgUsOJR1JFU1NJT04gUEFORUwgKFZFUlNJT04gQ09SUklHw4lFKQojIFlpLHQgPSBhKllpLHQtMSArIGIqTVBJKHQtMSkgKyBtdV9pICsgbGFtYmRhX3QgKyBlKGksdCkKIyBZID0gQ3JlZGl0X2dyb3d0aCB8IEVmZmV0cyBmaXhlcyBwYXlzICsgYW5uw6llCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBsbSkKbGlicmFyeShsbXRlc3QpCmxpYnJhcnkoc2FuZHdpY2gpCgoKIyAtLS0gMS4gSU1QT1JUQVRJT04gJiBORVRUT1lBR0UgLS0tCmRmX3JhdyA8LSByZWFkX2V4Y2VsKCJDb3BpZV9QYW5lbF9YLnhsc3giLCBzaGVldCA9IDEsIHNraXAgPSAzKQoKY29sbmFtZXMoZGZfcmF3KSA8LSBjKAogICJQYXlzIiwgIlN0YXR1dCIsICJBbm5lZSIsICJDbGVfcGFuZWwiLAogICJDcmVkaXRfZ3Jvd3RoIiwgIkxUViIsICJEU1RJIiwgIkxMUF9EUCIsICJDQ0IiLCAiTFZSIiwKICAiU0lGSSIsICJDT05DIiwgIkxGQyIsICJSUl9GQ0QiLCAiTENHIiwgIlRBWCIsCiAgIk1QSSIsICJCT1JST1dFUiIsCiAgIkdEUF9ncm93dGgiLCAiSW5mbGF0aW9uIiwgIlVuZW1wbG95bWVudCIsICJHRFBwY19sb2ciLAogICJDcmVkaXRfUElCIiwgIk1hcmtldF9SYXRlIiwKICAiQ3Jpc2lzIiwgIkNPVklEIiwgIkZJTkFOQ0lBTCIKKQoKZGYgPC0gZGZfcmF3ICU+JQogIGZpbHRlcighaXMubmEoQW5uZWUpLCAhaXMubmEoUGF5cyksIEFubmVlICE9ICJBbm5lZSIpICU+JQogIG11dGF0ZShBbm5lZSA9IGFzLmludGVnZXIoQW5uZWUpKQoKCiMgLS0tIDIuIENSw4lBVElPTiBERVMgTEFHUyAoY29ycmVjdGlvbiA6IGRwbHlyOjpsYWcgZm9yY8OpKSAtLS0KZGYgPC0gZGYgJT4lCiAgYXJyYW5nZShQYXlzLCBBbm5lZSkgJT4lCiAgZ3JvdXBfYnkoUGF5cykgJT4lCiAgbXV0YXRlKAogICAgTF9DcmVkaXRfZ3Jvd3RoID0gZHBseXI6OmxhZyhDcmVkaXRfZ3Jvd3RoLCAxKSwgICMgWWksdC0xCiAgICBMX01QSSAgICAgICAgICAgPSBkcGx5cjo6bGFnKE1QSSwgMSkgICAgICAgICAgICAgICMgTVBJKHQtMSkKICApICU+JQogIHVuZ3JvdXAoKQoKY2F0KCJPYnNlcnZhdGlvbnMgdG90YWxlcyA6IiwgbnJvdyhkZiksICJcbiIpCmNhdCgiT2JzZXJ2YXRpb25zIGNvbXBsw6h0ZXMgKHNhbnMgTkEpIDoiLAogICAgc3VtKGNvbXBsZXRlLmNhc2VzKGRmWywgYygiQ3JlZGl0X2dyb3d0aCIsICJMX0NyZWRpdF9ncm93dGgiLCAiTF9NUEkiKV0pKSwgIlxuXG4iKQoKIyBWw6lyaWZpY2F0aW9uIHJhcGlkZSA6IGxlcyBkZXV4IGNvbG9ubmVzIG5lIGRvaXZlbnQgUEFTIMOqdHJlIGlkZW50aXF1ZXMKY2F0KCJWw6lyaWZpY2F0aW9uIGxhZyDigJQgY29ycsOpbGF0aW9uIENyZWRpdF9ncm93dGggdnMgTF9DcmVkaXRfZ3Jvd3RoIDoiLAogICAgcm91bmQoY29yKGRmJENyZWRpdF9ncm93dGgsIGRmJExfQ3JlZGl0X2dyb3d0aCwgdXNlID0gImNvbXBsZXRlLm9icyIpLCAzKSwKICAgICIoZG9pdCDDqnRyZSA8IDEpXG5cbiIpCgoKIyAtLS0gMy4gRMOJQ0xBUkFUSU9OIERVIFBBTkVMIC0tLQpwZGYgPC0gcGRhdGEuZnJhbWUoZGYsIGluZGV4ID0gYygiUGF5cyIsICJBbm5lZSIpKQoKCiMgLS0tIDQuIE1PRMOITEUgREUgQkFTRSAtLS0KbW9kZWxlX2Jhc2UgPC0gcGxtKAogIENyZWRpdF9ncm93dGggfiBMX0NyZWRpdF9ncm93dGggKyBMX01QSSwKICBkYXRhICAgPSBwZGYsCiAgbW9kZWwgID0gIndpdGhpbiIsCiAgZWZmZWN0ID0gInR3b3dheXMiCikKCmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQpjYXQoIiAgTU9Ew4hMRSBERSBCQVNFIOKAlCBFZmZldHMgZml4ZXMgcGF5cyArIGFubsOpZSAod2l0aGluKVxuIikKY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpCnN1bW1hcnkobW9kZWxlX2Jhc2UpCgoKIyAtLS0gNS4gRVJSRVVSUyBST0JVU1RFUyBDTFVTVMOJUklTw4lFUyBQQVIgUEFZUyAtLS0KY2F0KCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCIgIFLDiVNVTFRBVFMgQVZFQyBFUlJFVVJTIFJPQlVTVEVTIChjbHVzdGVyID0gcGF5cylcbiIpCmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQoKY29lZnRlc3QobW9kZWxlX2Jhc2UsCiAgICAgICAgIHZjb3YgPSB2Y292SEMobW9kZWxlX2Jhc2UsIHR5cGUgPSAiSEMxIiwgY2x1c3RlciA9ICJncm91cCIpKQoKCiMgLS0tIDYuIFRFU1QgRUZGRVRTIEZJWEVTIC0tLQpjYXQoIlxuLS0tIFRlc3QgZGUgc2lnbmlmaWNhdGl2aXTDqSBkZXMgZWZmZXRzIGZpeGVzIC0tLVxuIikKcEZ0ZXN0KG1vZGVsZV9iYXNlLAogICAgICAgcGxtKENyZWRpdF9ncm93dGggfiBMX0NyZWRpdF9ncm93dGggKyBMX01QSSwKICAgICAgICAgICBkYXRhID0gcGRmLCBtb2RlbCA9ICJwb29saW5nIikpCmBgYAoKCg==