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)
# Đọ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 ...
# 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
# 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
## ---------------------------------------
# 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)
# 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
# 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
# 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
# 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
# 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.
# 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.
# 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.
# 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.
# 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.
# 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.
# 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
# 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)
# 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