Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Nạp thư viện
library(readxl)
library(dplyr)
library(plm)
library(lmtest)
library(car)
library(sandwich)
library(corrplot)
library(psych)
library(stargazer)
library(brms)
library(MCMCglmm)

1. Đọc dữ liệu và chuẩn hóa dữ liệu

# Đọc file Excel vào R
data_raw <- read.csv("C:/Users/ADMIN/Downloads/DLPTB.csv")
# Kiểm tra tên cột và các giá trị đầu tiên trong dataset
head(data_raw)
##   Bank Year  GCR GLR     Size        CAR      COST      LOAN  X X.1 X.2 X.3 X.4
## 1  ACB 2015 2.21 300 8.304182 0.06347531 0.7336526 0.6561747 NA  NA  NA  NA  NA
## 2  ACB 2016 2.04 356 8.368623 0.06017915 0.6185637 0.6915603 NA  NA  NA  NA  NA
## 3  ACB 2017 1.89 411 8.452396 0.05539837 0.4925970 0.6837133 NA  NA  NA  NA  NA
## 4  ACB 2018 1.72 467 8.517636 0.06381955 0.4783098 0.6922564 NA  NA  NA  NA  NA
## 5  ACB 2019 1.57 522 8.583782 0.07236366 0.5702859 0.6940152 NA  NA  NA  NA  NA
## 6  ACB 2020 1.43 578 8.647901 0.07974300 0.4198083 0.6940556 NA  NA  NA  NA  NA
##   X.5 X.6 X.7 X.8 X.9 X.10 X.11 X.12 X.13 X.14 X.15 X.16 X.17
## 1  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## 2  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## 3  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## 4  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## 5  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## 6  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
# Giả sử tên cột trong file là Bank, Year, GCR, GLR, Size, CAR, COST, LOAN
# Kiểm tra kiểu dữ liệu của các cột
str(data_raw)
## 'data.frame':    112 obs. of  26 variables:
##  $ Bank: chr  "ACB" "ACB" "ACB" "ACB" ...
##  $ Year: int  2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 ...
##  $ GCR : num  2.21 2.04 1.89 1.72 1.57 1.43 1.31 1.17 1.04 0.92 ...
##  $ GLR : int  300 356 411 467 522 578 633 689 744 800 ...
##  $ Size: num  8.3 8.37 8.45 8.52 8.58 ...
##  $ CAR : num  0.0635 0.0602 0.0554 0.0638 0.0724 ...
##  $ COST: num  0.734 0.619 0.493 0.478 0.57 ...
##  $ LOAN: num  0.656 0.692 0.684 0.692 0.694 ...
##  $ X   : logi  NA NA NA NA NA NA ...
##  $ X.1 : logi  NA NA NA NA NA NA ...
##  $ X.2 : logi  NA NA NA NA NA NA ...
##  $ X.3 : logi  NA NA NA NA NA NA ...
##  $ X.4 : logi  NA NA NA NA NA NA ...
##  $ X.5 : logi  NA NA NA NA NA NA ...
##  $ X.6 : logi  NA NA NA NA NA NA ...
##  $ X.7 : logi  NA NA NA NA NA NA ...
##  $ X.8 : logi  NA NA NA NA NA NA ...
##  $ X.9 : logi  NA NA NA NA NA NA ...
##  $ X.10: logi  NA NA NA NA NA NA ...
##  $ X.11: logi  NA NA NA NA NA NA ...
##  $ X.12: logi  NA NA NA NA NA NA ...
##  $ X.13: logi  NA NA NA NA NA NA ...
##  $ X.14: logi  NA NA NA NA NA NA ...
##  $ X.15: logi  NA NA NA NA NA NA ...
##  $ X.16: logi  NA NA NA NA NA NA ...
##  $ X.17: logi  NA NA NA NA NA NA ...
# Chuyển các biến cần thiết thành kiểu dữ liệu phù hợp
data <- data_raw %>%
  mutate(
    Bank = as.factor(Bank),    # Chuyển thành factor
    Year = as.integer(Year),   # Chuyển năm thành kiểu số nguyên
    GLR = as.numeric(GLR),     # Đảm bảo GLR là số
    Size = as.numeric(Size),
    CAR = as.numeric(CAR),
    COST = as.numeric(COST),
    LOAN = as.numeric(LOAN),
    GCR = as.numeric(GCR)
  )
# Kiểm tra lại kiểu dữ liệu sau khi chuyển đổi
str(data)
## 'data.frame':    112 obs. of  26 variables:
##  $ Bank: Factor w/ 12 levels "","ACB","Agribank",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Year: int  2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 ...
##  $ GCR : num  2.21 2.04 1.89 1.72 1.57 1.43 1.31 1.17 1.04 0.92 ...
##  $ GLR : num  300 356 411 467 522 578 633 689 744 800 ...
##  $ Size: num  8.3 8.37 8.45 8.52 8.58 ...
##  $ CAR : num  0.0635 0.0602 0.0554 0.0638 0.0724 ...
##  $ COST: num  0.734 0.619 0.493 0.478 0.57 ...
##  $ LOAN: num  0.656 0.692 0.684 0.692 0.694 ...
##  $ X   : logi  NA NA NA NA NA NA ...
##  $ X.1 : logi  NA NA NA NA NA NA ...
##  $ X.2 : logi  NA NA NA NA NA NA ...
##  $ X.3 : logi  NA NA NA NA NA NA ...
##  $ X.4 : logi  NA NA NA NA NA NA ...
##  $ X.5 : logi  NA NA NA NA NA NA ...
##  $ X.6 : logi  NA NA NA NA NA NA ...
##  $ X.7 : logi  NA NA NA NA NA NA ...
##  $ X.8 : logi  NA NA NA NA NA NA ...
##  $ X.9 : logi  NA NA NA NA NA NA ...
##  $ X.10: logi  NA NA NA NA NA NA ...
##  $ X.11: logi  NA NA NA NA NA NA ...
##  $ X.12: logi  NA NA NA NA NA NA ...
##  $ X.13: logi  NA NA NA NA NA NA ...
##  $ X.14: logi  NA NA NA NA NA NA ...
##  $ X.15: logi  NA NA NA NA NA NA ...
##  $ X.16: logi  NA NA NA NA NA NA ...
##  $ X.17: logi  NA NA NA NA NA NA ...

2. Chuyển dữ liệu sang dạng panel (panel data)

# Chuyển đổi dữ liệu sang dạng panel để sử dụng với plm (package cho dữ liệu panel)
pdata <- pdata.frame(data, index = c("Bank", "Year"))
# Kiểm tra lại cấu trúc của dữ liệu panel
head(pdata)
##          Bank Year  GCR GLR     Size        CAR      COST      LOAN  X X.1 X.2
## -NA           <NA>   NA  NA       NA         NA        NA        NA NA  NA  NA
## -NA.1         <NA>   NA  NA       NA         NA        NA        NA NA  NA  NA
## ACB-2015  ACB 2015 2.21 300 8.304182 0.06347531 0.7336526 0.6561747 NA  NA  NA
## ACB-2016  ACB 2016 2.04 356 8.368623 0.06017915 0.6185637 0.6915603 NA  NA  NA
## ACB-2017  ACB 2017 1.89 411 8.452396 0.05539837 0.4925970 0.6837133 NA  NA  NA
## ACB-2018  ACB 2018 1.72 467 8.517636 0.06381955 0.4783098 0.6922564 NA  NA  NA
##          X.3 X.4 X.5 X.6 X.7 X.8 X.9 X.10 X.11 X.12 X.13 X.14 X.15 X.16 X.17
## -NA       NA  NA  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## -NA.1     NA  NA  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## ACB-2015  NA  NA  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## ACB-2016  NA  NA  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## ACB-2017  NA  NA  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA
## ACB-2018  NA  NA  NA  NA  NA  NA  NA   NA   NA   NA   NA   NA   NA   NA   NA

3. Thống kê mô tả và ma trận tương quan

3.1. Thống kê mô tả các biến

# Thống kê mô tả các biến trong dữ liệu (trung bình, độ lệch chuẩn, min, max)
summary(data[c("GCR", "GLR", "Size", "CAR", "COST", "LOAN")])
##       GCR             GLR              Size             CAR          
##  Min.   :0.660   Min.   : 137.0   Min.   : 7.803   Min.   :0.004503  
##  1st Qu.:1.093   1st Qu.: 300.0   1st Qu.: 9.129   1st Qu.:0.060292  
##  Median :1.460   Median : 472.0   Median :18.873   Median :0.077151  
##  Mean   :1.615   Mean   : 564.6   Mean   :15.634   Mean   :0.083856  
##  3rd Qu.:2.103   3rd Qu.: 704.0   3rd Qu.:19.682   3rd Qu.:0.102062  
##  Max.   :3.420   Max.   :2100.0   Max.   :21.458   Max.   :0.169732  
##  NA's   :2       NA's   :2        NA's   :2        NA's   :2         
##       COST              LOAN       
##  Min.   :0.04321   Min.   :0.5979  
##  1st Qu.:0.38953   1st Qu.:0.7400  
##  Median :0.45337   Median :0.8795  
##  Mean   :0.48351   Mean   :0.8269  
##  3rd Qu.:0.55260   3rd Qu.:0.9092  
##  Max.   :0.91500   Max.   :0.9506  
##  NA's   :2         NA's   :2
# Cung cấp thống kê chi tiết hơn với package 'psych'
describe(data[c("GCR", "GLR", "Size", "CAR", "COST", "LOAN")])
##      vars   n   mean     sd median trimmed    mad    min     max   range  skew
## GCR     1 110   1.62   0.63   1.46    1.56   0.65   0.66    3.42    2.76  0.69
## GLR     2 110 564.59 374.55 472.00  504.57 295.78 137.00 2100.00 1963.00  1.75
## Size    3 110  15.63   5.28  18.87   15.91   2.18   7.80   21.46   13.66 -0.52
## CAR     4 110   0.08   0.03   0.08    0.08   0.03   0.00    0.17    0.17  0.64
## COST    5 110   0.48   0.14   0.45    0.47   0.12   0.04    0.91    0.87  0.64
## LOAN    6 110   0.83   0.10   0.88    0.83   0.07   0.60    0.95    0.35 -0.55
##      kurtosis    se
## GCR     -0.36  0.06
## GLR      3.69 35.71
## Size    -1.66  0.50
## CAR      0.20  0.00
## COST     0.92  0.01
## LOAN    -1.23  0.01
# Lựa chọn cột cần thiết cho bảng mô tả
data_selected <- data[c("GCR", "GLR", "Size", "CAR", "COST", "LOAN")]

# Kiểm tra dữ liệu đã chọn
head(data_selected)
##    GCR GLR     Size        CAR      COST      LOAN
## 1 2.21 300 8.304182 0.06347531 0.7336526 0.6561747
## 2 2.04 356 8.368623 0.06017915 0.6185637 0.6915603
## 3 1.89 411 8.452396 0.05539837 0.4925970 0.6837133
## 4 1.72 467 8.517636 0.06381955 0.4783098 0.6922564
## 5 1.57 522 8.583782 0.07236366 0.5702859 0.6940152
## 6 1.43 578 8.647901 0.07974300 0.4198083 0.6940556
# Tạo bảng thống kê mô tả cho các cột đã chọn
stargazer(data_selected, type = "text", summary.stat = c("mean", "sd", "min", "max"), 
          title = "Thống kê mô tả các biến", out = "summary_table.txt")
## 
## Thống kê mô tả các biến
## =======================================
## Statistic  Mean   St. Dev.  Min   Max  
## ---------------------------------------
## GCR        1.615   0.634   0.660 3.420 
## GLR       564.591 374.552   137  2,100 
## Size      15.634   5.281   7.803 21.458
## CAR        0.084   0.032   0.005 0.170 
## COST       0.484   0.142   0.043 0.915 
## LOAN       0.827   0.101   0.598 0.951 
## ---------------------------------------

3.2. Ma trận tương quan

# Tính toán ma trận tương quan của các biến
cor_mat <- cor(data[c("GCR", "GLR", "Size", "CAR", "COST", "LOAN")], use = "pairwise.complete.obs")
# In ma trận tương quan ra màn hình
cor_mat
##              GCR         GLR        Size         CAR        COST        LOAN
## GCR   1.00000000 -0.48091808 -0.09327006 -0.40104359  0.32455513  0.03369638
## GLR  -0.48091808  1.00000000 -0.33396770  0.02882955  0.10991625 -0.39658949
## Size -0.09327006 -0.33396770  1.00000000  0.51996507  0.07509060  0.92074891
## CAR  -0.40104359  0.02882955  0.51996507  1.00000000 -0.04303499  0.29487546
## COST  0.32455513  0.10991625  0.07509060 -0.04303499  1.00000000  0.10438026
## LOAN  0.03369638 -0.39658949  0.92074891  0.29487546  0.10438026  1.00000000
# Vẽ biểu đồ ma trận tương quan (heatmap)
corrplot(cor_mat, method = "color", addCoef.col = "black",
         tl.col = "black", tl.cex = 0.8, number.cex = 0.7)

4. Kiểm tra đa cộng tuyến – VIF

# Kiểm tra đa cộng tuyến bằng VIF (Variance Inflation Factor)
ols_for_vif <- lm(GCR ~ GLR + Size + CAR + COST + LOAN, data = data)
vif(ols_for_vif)
##       GLR      Size       CAR      COST      LOAN 
##  1.263316 11.831165  2.027017  1.051891  9.648488
# Nếu VIF lớn hơn 10, có thể xảy ra đa cộng tuyến

5. Ước lượng mô hình: Pooled OLS, FEM, REM

5.1. Pooled OLS

# Mô hình Pooled OLS (chưa kiểm soát sự khác biệt ngân hàng)
pool <- plm(GCR ~ GLR + Size + CAR + COST + LOAN, data = pdata, model = "pooling")
summary(pool)
## Pooling Model
## 
## Call:
## plm(formula = GCR ~ GLR + Size + CAR + COST + LOAN, data = pdata, 
##     model = "pooling")
## 
## Balanced Panel: n = 11, T = 10, N = 110
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -0.810539 -0.247146 -0.033084  0.191022  1.513780 
## 
## Coefficients:
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)  1.98930967  0.79547562  2.5008  0.013953 *  
## GLR         -0.00096418  0.00012804 -7.5303 1.921e-11 ***
## Size        -0.02401998  0.02779186 -0.8643  0.389422    
## CAR         -5.47577632  1.91874576 -2.8538  0.005214 ** 
## COST         1.73295504  0.30903651  5.6076 1.702e-07 ***
## LOAN         0.20233937  1.31201951  0.1542  0.877735    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    43.814
## Residual Sum of Squares: 20.638
## R-Squared:      0.52897
## Adj. R-Squared: 0.50632
## F-statistic: 23.3581 on 5 and 104 DF, p-value: 1.1498e-15

5.2. Fixed Effects Model (FEM)

# Mô hình FEM (kiểm soát sự khác biệt cố hữu của từng ngân hàng)
fem <- plm(GCR ~ GLR + Size + CAR + COST + LOAN, data = pdata, model = "within")
summary(fem)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = GCR ~ GLR + Size + CAR + COST + LOAN, data = pdata, 
##     model = "within")
## 
## Balanced Panel: n = 11, T = 10, N = 110
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -0.3649109 -0.0650023  0.0013497  0.0751641  0.3701092 
## 
## Coefficients:
##         Estimate  Std. Error t-value  Pr(>|t|)    
## GLR  -0.00107323  0.00011419 -9.3984 3.496e-15 ***
## Size -0.18432563  0.05884003 -3.1327   0.00231 ** 
## CAR  -2.12164213  0.94958466 -2.2343   0.02783 *  
## COST  0.29203245  0.14545163  2.0078   0.04754 *  
## LOAN -0.81970550  0.50289126 -1.6300   0.10645    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    8.9406
## Residual Sum of Squares: 1.7641
## R-Squared:      0.80269
## Adj. R-Squared: 0.7712
## F-statistic: 76.4816 on 5 and 94 DF, p-value: < 2.22e-16

5.3. Random Effects Model (REM)

# Mô hình REM (giả định không có sự tương quan giữa yếu tố cố hữu và biến độc lập)
rem <- plm(GCR ~ GLR + Size + CAR + COST + LOAN, data = pdata, model = "random")
summary(rem)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = GCR ~ GLR + Size + CAR + COST + LOAN, data = pdata, 
##     model = "random")
## 
## Balanced Panel: n = 11, T = 10, N = 110
## 
## Effects:
##                   var std.dev share
## idiosyncratic 0.01877 0.13699 0.068
## individual    0.25677 0.50672 0.932
## theta: 0.9148
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -0.306676 -0.078607 -0.014809  0.071824  0.458577 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept)  3.4913e+00  5.5681e-01   6.2702 3.607e-10 ***
## GLR         -1.2345e-03  8.8959e-05 -13.8775 < 2.2e-16 ***
## Size        -5.7008e-02  2.6827e-02  -2.1250  0.033584 *  
## CAR         -2.2478e+00  9.6765e-01  -2.3230  0.020181 *  
## COST         4.3563e-01  1.3921e-01   3.1293  0.001752 ** 
## LOAN        -3.7461e-01  4.7810e-01  -0.7835  0.433309    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    9.1936
## Residual Sum of Squares: 2.0547
## R-Squared:      0.77651
## Adj. R-Squared: 0.76577
## Chisq: 361.349 on 5 DF, p-value: < 2.22e-16

6. Kiểm định lựa chọn mô hình: F, LM, Hausman

6.1. F-test: Pooled vs FEM

# Kiểm định F để so sánh Pooled OLS và Fixed Effects
pFtest(fem, pool)
## 
##  F test for individual effects
## 
## data:  GCR ~ GLR + Size + CAR + COST + LOAN
## F = 100.57, df1 = 10, df2 = 94, p-value < 2.2e-16
## alternative hypothesis: significant effects

Nếu p-value < 0.05 → FEM tốt hơn Pooled → dữ liệu phù hợp panel.

6.2. LM test: Pooled vs REM

# Kiểm định LM để so sánh Pooled OLS và Random Effects
plmtest(pool, type = "bp")
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  GCR ~ GLR + Size + CAR + COST + LOAN
## chisq = 285.52, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects

Nếu p-value < 0.05 → REM tốt hơn Pooled.

6.3. Hausman test: FEM vs REM

# Kiểm định Hausman để so sánh Fixed Effects và Random Effects
phtest(fem, rem)
## 
##  Hausman Test
## 
## data:  GCR ~ GLR + Size + CAR + COST + LOAN
## chisq = 3.6986, df = 5, p-value = 0.5936
## alternative hypothesis: one model is inconsistent

Nếu p-value < 0.05 → chọn FEM; Nếu p-value > 0.05 → chọn REM.

7. Kiểm định khuyết tật mô hình

7.1. Phương sai thay đổi (Heteroskedasticity)

# Kiểm tra phương sai thay đổi bằng kiểm định Breusch-Pagan
bptest(fem)
## 
##  studentized Breusch-Pagan test
## 
## data:  fem
## BP = 32.163, df = 5, p-value = 5.515e-06

p-value < 0.05 → có heteroskedasticity.

7.2. Tự tương quan (Autocorrelation)

# Kiểm tra tự tương quan bằng Breusch–Godfrey test
pbgtest(fem)
## 
##  Breusch-Godfrey/Wooldridge test for serial correlation in panel models
## 
## data:  GCR ~ GLR + Size + CAR + COST + LOAN
## chisq = 67.015, df = 10, p-value = 1.666e-10
## alternative hypothesis: serial correlation in idiosyncratic errors

p-value < 0.05 → có autocorrelation.

7.3. Phụ thuộc chéo (Cross-sectional dependence)

# Kiểm tra heteroskedasticity bằng Breusch-Pagan
bptest(fem)
## 
##  studentized Breusch-Pagan test
## 
## data:  fem
## BP = 32.163, df = 5, p-value = 5.515e-06
# Kiểm tra tự tương quan (autocorrelation)
pbgtest(fem)
## 
##  Breusch-Godfrey/Wooldridge test for serial correlation in panel models
## 
## data:  GCR ~ GLR + Size + CAR + COST + LOAN
## chisq = 67.015, df = 10, p-value = 1.666e-10
## alternative hypothesis: serial correlation in idiosyncratic errors
# Kiểm tra phụ thuộc chéo (cross-sectional dependence)
pcdtest(fem, test = "cd")
## 
##  Pesaran CD test for cross-sectional dependence in panels
## 
## data:  GCR ~ GLR + Size + CAR + COST + LOAN
## z = -1.2262, p-value = 0.2201
## alternative hypothesis: cross-sectional dependence

p-value < 0.05 → có cross-sectional dependence.

Lưu ý khi viết Khi viết Chương 4 nhaa: Báo p-value từng kiểm định và Kết luận mô hình vi phạm những giả định nào.

8. Ước lượng với sai số chuẩn robust (Driscoll–Kraay)

# Sử dụng Driscoll-Kraay standard errors cho mô hình FEM
coeftest(fem, vcov = vcovSCC(fem, type = "HC3", maxlag = 2))
## 
## t test of coefficients:
## 
##         Estimate  Std. Error  t value  Pr(>|t|)    
## GLR  -0.00107323  0.00010704 -10.0264 < 2.2e-16 ***
## Size -0.18432563  0.03609299  -5.1070 1.708e-06 ***
## CAR  -2.12164213  1.47037109  -1.4429  0.152364    
## COST  0.29203245  0.09077480   3.2171  0.001777 ** 
## LOAN -0.81970550  1.02036549  -0.8033  0.423802    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Nếu sử dụng REM:
coeftest(rem, vcov = vcovSCC(rem, type = "HC3", maxlag = 2))
## 
## t test of coefficients:
## 
##                Estimate  Std. Error t value  Pr(>|t|)    
## (Intercept)  3.49130761  0.88244176  3.9564 0.0001392 ***
## GLR         -0.00123453  0.00017145 -7.2004 9.751e-11 ***
## Size        -0.05700765  0.01427533 -3.9934 0.0001217 ***
## CAR         -2.24781618  1.38767179 -1.6198 0.1082936    
## COST         0.43563022  0.11667703  3.7336 0.0003082 ***
## LOAN        -0.37461369  0.97420394 -0.3845 0.7013685    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

9. GMM (nếu có nội sinh)

# Kiểm tra giá trị thiếu trong dữ liệu
sum(is.na(data_raw))  # Kiểm tra tổng số giá trị thiếu trong toàn bộ dữ liệu
## [1] 2030
# Loại bỏ các dòng có giá trị thiếu trong biến 'Year' và 'GCR' (hoặc thay thế bằng giá trị trung bình nếu cần)
data_clean <- data_raw %>% filter(!is.na(Year) & !is.na(GCR))

# Chuyển sang dữ liệu panel
pdata <- pdata.frame(data_clean, index = c("Bank", "Year"))

# Kiểm tra dữ liệu đã sạch chưa
sum(is.na(pdata))  # Kiểm tra lại các giá trị thiếu trong dữ liệu panel
## [1] 1980
# Chạy mô hình GMM (Arellano-Bond)
gmm_model <- pgmm(
  GCR ~ lag(GCR, 1) + GLR + Size + CAR + COST + LOAN | lag(GCR, 2:3),
  data = pdata, effect = "individual", model = "twosteps"
)

# Kiểm tra kết quả mô hình GMM
summary(gmm_model)
## Oneway (individual) effect Two-steps model Difference GMM 
## 
## Call:
## pgmm(formula = GCR ~ lag(GCR, 1) + GLR + Size + CAR + COST + 
##     LOAN | lag(GCR, 2:3), data = pdata, effect = "individual", 
##     model = "twosteps")
## 
## Balanced Panel: n = 11, T = 10, N = 110
## 
## Number of Observations Used: 88
## Residuals:
##       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
## -0.1499708 -0.0097562  0.0031291  0.0008825  0.0114871  0.1210720 
## 
## Coefficients:
##                Estimate  Std. Error z-value Pr(>|z|)    
## lag(GCR, 1)  9.6013e-01  2.8400e-02 33.8068   <2e-16 ***
## GLR          1.3570e-05  3.0763e-05  0.4411   0.6591    
## Size        -1.1479e-02  2.3671e-02 -0.4850   0.6277    
## CAR         -3.4095e-01  4.3994e-01 -0.7750   0.4384    
## COST         1.3012e-02  2.5025e-02  0.5200   0.6031    
## LOAN         5.4476e-02  1.4881e-01  0.3661   0.7143    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sargan test: chisq(14) = 6.099306 (p-value = 0.96393)
## Autocorrelation test (1): normal = -1.592848 (p-value = 0.11119)
## Autocorrelation test (2): normal = 0.3724358 (p-value = 0.70957)
## Wald test for coefficients: chisq(6) = 18951.38 (p-value = < 2.22e-16)

10. Mô hình Bayes (Bayesian Mixed Effects Model)

# Nạp thư viện cần thiết
library(brms)
library(plm)

# Đảm bảo dữ liệu đã được chuẩn hóa và chuyển sang panel
pdata <- pdata.frame(data, index = c("Bank", "Year"))

# Chạy mô hình Bayes (Bayesian Mixed Effects Model)
bayes_model <- brm(
  GCR ~ GLR + Size + CAR + COST + LOAN + (1 | Bank),  # Mô hình với yếu tố ngẫu nhiên cho từng ngân hàng
  data = pdata,                                          # Dữ liệu panel
  chains = 2,                                            # Số chuỗi MCMC
  iter = 2000,                                           # Số lần lặp
  warmup = 1000,                                         # Số lần lặp để đốt
  cores = 2,                                             # Số lõi CPU để chạy
  seed = 123                                              # Đặt seed để kết quả có thể tái lập
)

# Kiểm tra kết quả mô hình
summary(bayes_model)
##  Family: gaussian 
##   Links: mu = identity 
## Formula: GCR ~ GLR + Size + CAR + COST + LOAN + (1 | Bank) 
##    Data: pdata (Number of observations: 110) 
##   Draws: 2 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 2000
## 
## Multilevel Hyperparameters:
## ~Bank (Number of levels: 11) 
##               Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sd(Intercept)     0.65      0.21     0.38     1.13 1.01      505     1057
## 
## Regression Coefficients:
##           Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## Intercept     3.69      0.74     2.43     5.24 1.01      602      867
## GLR          -0.00      0.00    -0.00    -0.00 1.00     1811     1813
## Size         -0.07      0.04    -0.15    -0.01 1.01      544      825
## CAR          -2.24      0.96    -4.09    -0.38 1.00     1773     1548
## COST          0.42      0.14     0.14     0.70 1.00     1822     1200
## LOAN         -0.41      0.49    -1.36     0.54 1.00     1665     1440
## 
## Further Distributional Parameters:
##       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sigma     0.14      0.01     0.12     0.16 1.00     1516      882
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).
# Kiểm tra hội tụ (R-hat < 1.1 là tốt)
plot(bayes_model)

# Xem phân phối hậu nghiệm của hệ số GLR
posterior_summary(bayes_model, pars = "b_GLR")
##           Estimate    Est.Error         Q2.5        Q97.5
## b_GLR -0.001220244 9.555589e-05 -0.001412174 -0.001032639