Đề tài: The impact of competitive capacity on the return on asset of the Vietnam join commercial bank

cat("\014")  # Lệnh này gửi mã để clear console
rm(list = ls()) # xoá all các biến
  1. Import data
library(readxl)
data_100 <- read_excel("/Users/trieukimlanh/Library/CloudStorage/GoogleDrive-lanhtk@hub.edu.vn/My Drive/8. Huong dan Sinh Vien/NCKH/HD lấy data Fiinpro/data_100.xlsx")
View(data_100)
  1. Install and Import library
#install.packages("plm")
library(plm)
pdata = pdata.frame(data_100, index = c("BANK","YEAR"))
  1. Descriptive statistic
#str(pdata)
summary(pdata)
      BANK          YEAR         ROA             Tobin.s.Q     
 ABB    :  9   2014   :25   Min.   :0.008291   Min.   :0.0000  
 ACB    :  9   2015   :25   1st Qu.:0.453259   1st Qu.:0.0000  
 AGB    :  9   2016   :25   Median :0.697881   Median :0.8800  
 BID    :  9   2017   :25   Mean   :0.912096   Mean   :0.8591  
 BVB    :  9   2018   :25   3rd Qu.:1.248441   3rd Qu.:1.3600  
 CTG    :  9   2019   :25   Max.   :3.237989   Max.   :4.1400  
 (Other):171   (Other):75                                      
      Lern              CR              SIZE            CAP        
 Min.   :0.1194   Min.   :0.4667   Min.   :16.58   Min.   : 4.062  
 1st Qu.:0.4127   1st Qu.:1.3082   1st Qu.:18.25   1st Qu.: 6.200  
 Median :0.5172   Median :1.8000   Median :18.99   Median : 7.713  
 Mean   :0.5129   Mean   :1.9278   Mean   :19.03   Mean   : 8.558  
 3rd Qu.:0.6193   3rd Qu.:2.3644   3rd Qu.:19.84   3rd Qu.:10.121  
 Max.   :0.9617   Max.   :6.9121   Max.   :21.48   Max.   :22.030  
                                                                   
      LGR              CIR              GDP                  GDPG      
 Min.   :-14.23   Min.   : 3.827   Min.   :-0.0061064   Min.   :2.554  
 1st Qu.: 12.42   1st Qu.:38.069   1st Qu.:-0.0004253   1st Qu.:6.422  
 Median : 17.40   Median :48.281   Median : 0.0003740   Median :6.940  
 Mean   : 19.12   Mean   :48.712   Mean   : 0.0019054   Mean   :6.202  
 3rd Qu.: 24.22   3rd Qu.:58.730   3rd Qu.: 0.0008796   3rd Qu.:7.359  
 Max.   : 66.35   Max.   :88.059   Max.   : 0.0213082   Max.   :8.538  
                                                                       
     GDP_hh           lnGDP_hh         INF_0                 INF        
 Min.   :4937032   Min.   :15.41   Min.   :-8.455e-03   Min.   :0.6312  
 1st Qu.:5639401   1st Qu.:15.55   1st Qu.:-3.804e-03   1st Qu.:2.6682  
 Median :7009042   Median :15.76   Median : 5.503e-05   Median :3.1565  
 Mean   :6992348   Mean   :15.74   Mean   : 2.842e-03   Mean   :2.8280  
 3rd Qu.:8044386   3rd Qu.:15.90   3rd Qu.: 3.193e-03   3rd Qu.:3.5203  
 Max.   :9621372   Max.   :16.08   Max.   : 3.227e-02   Max.   :4.0846  
                                                                        
     ...17         
 Min.   :0.006312  
 1st Qu.:0.026682  
 Median :0.031565  
 Mean   :0.028280  
 3rd Qu.:0.035203  
 Max.   :0.040846  
                   
#install.packages("psych")
library(psych)
describe(pdata)
          vars   n       mean         sd     median    trimmed        mad
BANK*        1 225      13.00       7.23      13.00      13.00       8.90
YEAR*        2 225       5.00       2.59       5.00       5.00       2.97
ROA          3 225       0.91       0.69       0.70       0.83       0.50
Tobin.s.Q    4 225       0.86       0.90       0.88       0.74       1.30
Lern         5 225       0.51       0.15       0.52       0.52       0.15
CR           6 225       1.93       0.95       1.80       1.83       0.79
SIZE         7 225      19.03       1.18      18.99      19.02       1.17
CAP          8 225       8.56       3.22       7.71       8.13       2.72
LGR          9 225      19.12      11.76      17.40      18.10       8.70
CIR         10 225      48.71      14.55      48.28      48.43      15.49
GDP         11 225       0.00       0.01       0.00       0.00       0.00
GDPG        12 225       6.20       1.96       6.94       6.36       0.77
GDP_hh      13 225 6992348.50 1514496.58 7009042.13 6922616.22 2030629.94
lnGDP_hh    14 225      15.74       0.22      15.76      15.73       0.28
INF_0       15 225       0.00       0.01       0.00       0.00       0.01
INF         16 225       2.83       0.98       3.16       2.94       0.57
...17       17 225       0.03       0.01       0.03       0.03       0.01
                 min        max      range  skew kurtosis        se
BANK*           1.00      25.00      24.00  0.00    -1.22      0.48
YEAR*           1.00       9.00       8.00  0.00    -1.25      0.17
ROA             0.01       3.24       3.23  1.09     0.48      0.05
Tobin.s.Q       0.00       4.14       4.14  0.93     0.63      0.06
Lern            0.12       0.96       0.84 -0.11     0.19      0.01
CR              0.47       6.91       6.45  1.77     5.45      0.06
SIZE           16.58      21.48       4.90  0.06    -0.71      0.08
CAP             4.06      22.03      17.97  1.25     1.57      0.21
LGR           -14.23      66.35      80.58  0.96     2.12      0.78
CIR             3.83      88.06      84.23  0.11     0.19      0.97
GDP            -0.01       0.02       0.03  2.01     3.05      0.00
GDPG            2.55       8.54       5.98 -1.02    -0.45      0.13
GDP_hh    4937031.68 9621371.82 4684340.14  0.18    -1.18 100966.44
lnGDP_hh       15.41      16.08       0.67 -0.06    -1.31      0.01
INF_0          -0.01       0.03       0.04  1.80     2.28      0.00
INF             0.63       4.08       3.45 -1.03     0.24      0.07
...17           0.01       0.04       0.03 -1.03     0.24      0.00
#install.packages("pastecs")
library(pastecs)
stat.desc(pdata)
         BANK YEAR          ROA    Tobin.s.Q         Lern           CR
nbr.val    NA   NA 2.250000e+02 225.00000000 2.250000e+02 225.00000000
nbr.null   NA   NA 0.000000e+00  93.00000000 0.000000e+00   0.00000000
nbr.na     NA   NA 0.000000e+00   0.00000000 0.000000e+00   0.00000000
min        NA   NA 8.290915e-03   0.00000000 1.194070e-01   0.46669446
max        NA   NA 3.237989e+00   4.14000000 9.617302e-01   6.91208245
range      NA   NA 3.229698e+00   4.14000000 8.423232e-01   6.44538799
sum        NA   NA 2.052216e+02 193.30000000 1.153983e+02 433.74923581
median     NA   NA 6.978805e-01   0.88000000 5.171916e-01   1.80000000
mean       NA   NA 9.120960e-01   0.85911111 5.128813e-01   1.92777438
SE.mean    NA   NA 4.571522e-02   0.06007093 9.702705e-03   0.06327586
CI.mean    NA   NA 9.008692e-02   0.11837643 1.912026e-02   0.12469211
var        NA   NA 4.702233e-01   0.81191617 2.118206e-02   0.90086281
std.dev    NA   NA 6.857283e-01   0.90106391 1.455406e-01   0.94913793
coef.var   NA   NA 7.518160e-01   1.04883280 2.837705e-01   0.49234907
                 SIZE          CAP          LGR          CIR           GDP
nbr.val  2.250000e+02  225.0000000  225.0000000 2.250000e+02  2.250000e+02
nbr.null 0.000000e+00    0.0000000    0.0000000 0.000000e+00  0.000000e+00
nbr.na   0.000000e+00    0.0000000    0.0000000 0.000000e+00  0.000000e+00
min      1.657700e+01    4.0617705  -14.2284069 3.826981e+00 -6.106385e-03
max      2.147500e+01   22.0296782   66.3508780 8.805930e+01  2.130819e-02
range    4.898005e+00   17.9679077   80.5792849 8.423232e+01  2.741457e-02
sum      4.281840e+03 1925.4792751 4301.3069475 1.096017e+04  4.287136e-01
median   1.899492e+01    7.7132613   17.3951095 4.828084e+01  3.739628e-04
mean     1.903040e+01    8.5576857   19.1169198 4.871187e+01  1.905394e-03
SE.mean  7.853829e-02    0.2149925    0.7841980 9.702705e-01  4.797020e-04
CI.mean  1.547684e-01    0.4236666    1.5453492 1.912026e+00  9.453060e-04
var      1.387859e+00   10.3999015  138.3674676 2.118206e+02  5.177565e-05
std.dev  1.178074e+00    3.2248878   11.7629702 1.455406e+01  7.195530e-03
coef.var 6.190487e-02    0.3768411    0.6153172 2.987785e-01  3.776401e+00
                 GDPG       GDP_hh     lnGDP_hh         INF_0         INF
nbr.val   225.0000000 2.250000e+02 2.250000e+02  2.250000e+02 225.0000000
nbr.null    0.0000000 0.000000e+00 0.000000e+00  0.000000e+00   0.0000000
nbr.na      0.0000000 0.000000e+00 0.000000e+00  0.000000e+00   0.0000000
min         2.5540000 4.937032e+06 1.541227e+01 -8.454664e-03   0.6312009
max         8.5380000 9.621372e+06 1.607950e+01  3.227257e-02   4.0845545
range       5.9840000 4.684340e+06 6.672226e-01  4.072723e-02   3.4533536
sum      1395.5000000 1.573278e+09 3.540740e+03  6.395346e-01 636.2967394
median      6.9400000 7.009042e+06 1.576271e+01  5.502772e-05   3.1565075
mean        6.2022222 6.992349e+06 1.573662e+01  2.842376e-03   2.8279855
SE.mean     0.1304023 1.009664e+05 1.461552e-02  7.526782e-04   0.0655637
CI.mean     0.2569722 1.989656e+05 2.880150e-02  1.483236e-03   0.1292005
var         3.8260714 2.293700e+12 4.806300e-02  1.274680e-04   0.9671846
std.dev     1.9560346 1.514497e+06 2.192327e-01  1.129017e-02   0.9834554
coef.var    0.3153764 2.165934e-01 1.393137e-02  3.972090e+00   0.3477583
                ...17
nbr.val  2.250000e+02
nbr.null 0.000000e+00
nbr.na   0.000000e+00
min      6.312009e-03
max      4.084554e-02
range    3.453354e-02
sum      6.362967e+00
median   3.156507e-02
mean     2.827986e-02
SE.mean  6.556370e-04
CI.mean  1.292005e-03
var      9.671846e-05
std.dev  9.834554e-03
coef.var 3.477583e-01
  1. Plot
plot(pdata$ROA)

library(gplots)
plotmeans(ROA ~ BANK, main="Heterogenerity across BANK", data = pdata)

plotmeans(ROA ~ YEAR, main="Heterogenerity across YEAR", data = pdata)

plotmeans(GDP ~ YEAR, main="Heterogenerity across YEAR", data = pdata)

plotmeans(GDPG ~ YEAR, main="Heterogenerity across YEAR", data = pdata)

plotmeans(GDP_hh ~ YEAR, main="Heterogenerity across YEAR", data = pdata)

  1. Ma trận tương quan Pearson và p-value
# install.packages("Hmisc")  # Để tính toán ma trận tương quan kèm p-value
# install.packages("psych")  # Để tính toán ma trận tương quan
# install.packages("dplyr")  # Để thao tác với dữ liệu
library(Hmisc)
library(psych)
library(dplyr)
cor_results <- rcorr(as.matrix(data_100[, c("ROA", "Tobin's Q", "Lern", "CR", "SIZE","CAP", "LGR", "CIR", "GDPG", "INF")]))
  # Ma trận tương quan
cor_matrix <- cor_results$r
p_matrix <- cor_results$P
  # Khởi tạo ma trận kết quả
cor_with_stars <- matrix("", nrow = nrow(cor_matrix), ncol = ncol(cor_matrix))
  # Duyệt qua từng phần tử của ma trận tương quan
for (i in 1:nrow(cor_matrix)) {
  for (j in 1:ncol(cor_matrix)) {
    cor_value <- cor_matrix[i, j]
    p_value <- p_matrix[i, j]
    
    if (is.na(p_value)) {
      cor_with_stars[i, j] <- round(cor_value, 4)
    } else if (p_value < 0.01) {
      cor_with_stars[i, j] <- paste0(round(cor_value, 4), "***")
    } else if (p_value < 0.05) {
      cor_with_stars[i, j] <- paste0(round(cor_value, 4), "**")
    } else if (p_value < 0.1) {
      cor_with_stars[i, j] <- paste0(round(cor_value, 4), "*")
    } else {
      cor_with_stars[i, j] <- round(cor_value, 4)
    }
  }
}
  # Chuyển ma trận kết quả thành dạng data.frame để dễ đọc
cor_with_stars_df <- as.data.frame(cor_with_stars)
  # Đặt tên các cột và dòng cho ma trận kết quả
colnames(cor_with_stars_df) <- colnames(cor_matrix)
rownames(cor_with_stars_df) <- rownames(cor_matrix)
  # Hiển thị kết quả
print(cor_with_stars_df)
                 ROA  Tobin's Q       Lern         CR       SIZE        CAP
ROA                1  0.4253***  0.5847*** -0.1988***  0.3818***  0.3062***
Tobin's Q  0.4253***          1  0.3917*** -0.2095***  0.5137***    -0.0847
Lern       0.5847***  0.3917***          1 -0.1752***  0.5098***     0.0099
CR        -0.1988*** -0.2095*** -0.1752***          1 -0.2032***   0.1604**
SIZE       0.3818***  0.5137***  0.5098*** -0.2032***          1 -0.4581***
CAP        0.3062***    -0.0847     0.0099   0.1604** -0.4581***          1
LGR           0.0845 -0.1748***    -0.0512 -0.2059***    -0.0548 -0.1853***
CIR       -0.5847*** -0.3917***      -1***  0.1752*** -0.5098***    -0.0099
GDPG         -0.1009 -0.3419***   -0.1274*     0.0405     -0.087     0.0114
INF           0.0598    -0.0402     -0.005     0.0488     0.0099    -0.0367
                 LGR        CIR       GDPG       INF
ROA           0.0845 -0.5847***    -0.1009    0.0598
Tobin's Q -0.1748*** -0.3917*** -0.3419***   -0.0402
Lern         -0.0512      -1***   -0.1274*    -0.005
CR        -0.2059***  0.1752***     0.0405    0.0488
SIZE         -0.0548 -0.5098***     -0.087    0.0099
CAP       -0.1853***    -0.0099     0.0114   -0.0367
LGR                1     0.0512    0.1125* -0.1522**
CIR           0.0512          1    0.1274*     0.005
GDPG         0.1125*    0.1274*          1  0.1698**
INF        -0.1522**      0.005   0.1698**         1
# tạo vector biến
vars <- c("ROA", "Tobin.s.Q", "Lern", "CR", "SIZE","CAP", "LGR", "CIR", "GDPG", "INF")
#install.packages("ggcorrplot")
library(ggcorrplot)

# Tính ma trận
corr <- round(cor(pdata[, vars], use = "complete.obs"), 3)
corr
             ROA Tobin.s.Q   Lern     CR   SIZE    CAP    LGR    CIR   GDPG
ROA        1.000     0.425  0.585 -0.199  0.382  0.306  0.084 -0.585 -0.101
Tobin.s.Q  0.425     1.000  0.392 -0.209  0.514 -0.085 -0.175 -0.392 -0.342
Lern       0.585     0.392  1.000 -0.175  0.510  0.010 -0.051 -1.000 -0.127
CR        -0.199    -0.209 -0.175  1.000 -0.203  0.160 -0.206  0.175  0.041
SIZE       0.382     0.514  0.510 -0.203  1.000 -0.458 -0.055 -0.510 -0.087
CAP        0.306    -0.085  0.010  0.160 -0.458  1.000 -0.185 -0.010  0.011
LGR        0.084    -0.175 -0.051 -0.206 -0.055 -0.185  1.000  0.051  0.113
CIR       -0.585    -0.392 -1.000  0.175 -0.510 -0.010  0.051  1.000  0.127
GDPG      -0.101    -0.342 -0.127  0.041 -0.087  0.011  0.113  0.127  1.000
INF        0.060    -0.040 -0.005  0.049  0.010 -0.037 -0.152  0.005  0.170
             INF
ROA        0.060
Tobin.s.Q -0.040
Lern      -0.005
CR         0.049
SIZE       0.010
CAP       -0.037
LGR       -0.152
CIR        0.005
GDPG       0.170
INF        1.000
# Vẽ biểu đồ nhiệt
ggcorrplot(corr, 
           hc.order = TRUE, 
           type = "lower",      # Chỉ hiện một nửa dưới của ma trận cho gọn
           lab = TRUE,          # Hiển thị số ngay trên biểu đồ
           outline.col = "white",
           title = "Ma trận tương quan Pearson",
           colors = c("#6D9EC1", "white", "#E46726"))

  1. Vẽ biểu đồ phân tán giữa BPT và BĐL chính
library(ggplot2)
# Chuyển pdata thành data.frame thông thường
ggplot(as.data.frame(pdata), aes(x = Lern, y = ROA)) +
  geom_point(aes(color = factor(YEAR))) +
  geom_smooth(method = "lm", span = 0.75, color = "black", se = TRUE) + 
  theme_minimal()

ggplot(as.data.frame(pdata), aes(x = Lern, y = ROA)) +
  geom_point(aes(color = factor(YEAR))) +
  geom_smooth(method = "loess", span = 0.75, color = "black", se = TRUE) + 
  theme_minimal()

ggplot(as.data.frame(pdata), aes(x = Lern, y = ROA)) +
  geom_point() +
  geom_smooth(method = "lm", formula = y ~ x, color = "blue", se = FALSE) +  # Đường thẳng
  geom_smooth(method = "lm", formula = y ~ poly(x, 2), color = "blue", se = FALSE) +  # Đường thẳng

  geom_smooth(method = "loess", color = "red", se = FALSE) + # Đường cong
  theme_minimal()

  1. Run Pooled OLS model

Loại bỏ CIR vì nó tương quan -1 với Lern

#install.packages("plm")
library(plm)
pooledmethod=plm(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF,data = pdata,model = "pooling")
summary(pooledmethod)
Pooling Model

Call:
plm(formula = ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF, 
    data = pdata, model = "pooling")

Balanced Panel: n = 25, T = 9, N = 225

Residuals:
     Min.   1st Qu.    Median   3rd Qu.      Max. 
-1.344045 -0.297374 -0.032088  0.313267  1.166687 

Coefficients:
              Estimate Std. Error t-value  Pr(>|t|)    
(Intercept) -6.3872700  0.6946648 -9.1948 < 2.2e-16 ***
Lern         1.5430401  0.2498929  6.1748 3.220e-09 ***
CR          -0.0672159  0.0325731 -2.0635  0.040251 *  
SIZE         0.2731303  0.0349238  7.8207 2.262e-13 ***
CAP          0.1241319  0.0111724 11.1106 < 2.2e-16 ***
LGR          0.0142265  0.0026904  5.2878 3.014e-07 ***
GDPG        -0.0249453  0.0155039 -1.6090  0.109076    
INF          0.0920217  0.0308226  2.9855  0.003156 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Total Sum of Squares:    105.33
Residual Sum of Squares: 41.757
R-Squared:      0.60356
Adj. R-Squared: 0.59078
F-statistic: 47.1966 on 7 and 217 DF, p-value: < 2.22e-16
  1. Multicollinearity Test
# Chuyển đổi mô hình plm sang lm
lm_model <- lm(formula(pooledmethod), data = model.frame(pooledmethod))
# Tính VIF
library(car)
vif_values <- round(vif(lm_model),4)
  # Chuyển sang data.frame
vif_df <- data.frame(
  Variable = names(vif_values),
  VIF = as.numeric(vif_values)
)
  # Thêm 1/VIF
vif_df$Tolerance <- round(1 / vif_df$VIF,4)
  # Tính VIF trung bình
mean_vif <- mean(vif_df$VIF)
  # Thêm dòng Mean VIF
vif_df <- rbind(
  vif_df,
  data.frame(
    Variable = "Mean VIF",
    VIF = mean_vif,
    `Tolerance` = " "
  )
)
print("Kiểm định đa cộng tuyến, kết quả hệ số VIF")
[1] "Kiểm định đa cộng tuyến, kết quả hệ số VIF"
print(vif_df)
  Variable      VIF Tolerance
1     Lern 1.539800    0.6494
2       CR 1.112600    0.8988
3     SIZE 1.970500    0.5075
4      CAP 1.511100    0.6618
5      LGR 1.165900    0.8577
6     GDPG 1.070600    0.9341
7      INF 1.069600    0.9349
8 Mean VIF 1.348586          
  1. Tương quan và p-value giữa BPT vs BĐL
# Chọn biến phụ thuộc và các biến độc lập
dep_var <- pdata$ROA
ind_vars <- pdata[, c("Lern", "CR", "SIZE", "CAP", "LGR", "GDPG", "INF")]

# Xử lý dữ liệu để đảm bảo không có giá trị thiếu đồng nhất
complete_cases <- complete.cases(dep_var, ind_vars)
dep_var <- dep_var[complete_cases]
ind_vars <- ind_vars[complete_cases, ]

# Khởi tạo các vector để lưu hệ số tương quan và p-value
correlations <- numeric(ncol(ind_vars))
p_values <- numeric(ncol(ind_vars))

# Tính toán hệ số tương quan và p-value cho từng biến độc lập
for (i in seq_along(correlations)) {
  test <- cor.test(dep_var, ind_vars[, i], method = "pearson")
  correlations[i] <- test$estimate
  p_values[i] <- test$p.value
}

# Tạo data frame để hiển thị kết quả
cor_results_df <- data.frame(
  Variable = colnames(ind_vars),
  Correlation = correlations,
  P_Value = p_values
)

# Hiển thị kết quả
print("Hệ số tương quan và P-Value giữa biến phụ thuộc và các biến độc lập:")
[1] "Hệ số tương quan và P-Value giữa biến phụ thuộc và các biến độc lập:"
cor_results_df$Correlation <- round(cor_results_df$Correlation, 4)
cor_results_df$P_Value <- round(cor_results_df$P_Value, 4)
print(cor_results_df)
  Variable Correlation P_Value
1     Lern      0.5847  0.0000
2       CR     -0.1988  0.0027
3     SIZE      0.3818  0.0000
4      CAP      0.3062  0.0000
5      LGR      0.0845  0.2069
6     GDPG     -0.1009  0.1312
7      INF      0.0598  0.3721
  1. Run FEM
femmethod=plm(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF,data = pdata,model = "within")
summary(femmethod)
Oneway (individual) effect Within Model

Call:
plm(formula = ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF, 
    data = pdata, model = "within")

Balanced Panel: n = 25, T = 9, N = 225

Residuals:
      Min.    1st Qu.     Median    3rd Qu.       Max. 
-0.7968566 -0.1397072 -0.0078042  0.1560232  0.7006910 

Coefficients:
       Estimate Std. Error t-value  Pr(>|t|)    
Lern  1.3564870  0.2460345  5.5134 1.119e-07 ***
CR   -0.0868840  0.0255356 -3.4025 0.0008119 ***
SIZE  0.6626068  0.0570234 11.6199 < 2.2e-16 ***
CAP   0.0939526  0.0103363  9.0896 < 2.2e-16 ***
LGR   0.0040720  0.0019849  2.0515 0.0415686 *  
GDPG  0.0045750  0.0091409  0.5005 0.6172926    
INF   0.0561183  0.0178690  3.1405 0.0019516 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Total Sum of Squares:    48.871
Residual Sum of Squares: 12.227
R-Squared:      0.74982
Adj. R-Squared: 0.70964
F-statistic: 82.6352 on 7 and 193 DF, p-value: < 2.22e-16
  1. Run REM
remmethod=plm(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF,data = pdata,model = "random")
summary(remmethod)
Oneway (individual) effect Random Effect Model 
   (Swamy-Arora's transformation)

Call:
plm(formula = ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF, 
    data = pdata, model = "random")

Balanced Panel: n = 25, T = 9, N = 225

Effects:
                  var std.dev share
idiosyncratic 0.06335 0.25170 0.501
individual    0.06306 0.25112 0.499
theta: 0.6831

Residuals:
     Min.   1st Qu.    Median   3rd Qu.      Max. 
-0.979693 -0.172607 -0.028308  0.183901  0.725912 

Coefficients:
              Estimate Std. Error z-value  Pr(>|z|)    
(Intercept) -8.8538770  0.8968398 -9.8723 < 2.2e-16 ***
Lern         1.6571107  0.2530055  6.5497 5.765e-11 ***
CR          -0.0900505  0.0279245 -3.2248  0.001261 ** 
SIZE         0.4191628  0.0471186  8.8959 < 2.2e-16 ***
CAP          0.1049769  0.0108845  9.6446 < 2.2e-16 ***
LGR          0.0037174  0.0021651  1.7170  0.085983 .  
GDPG        -0.0058674  0.0103216 -0.5685  0.569725    
INF          0.0635789  0.0203715  3.1210  0.001802 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Total Sum of Squares:    54.541
Residual Sum of Squares: 17.933
R-Squared:      0.67119
Adj. R-Squared: 0.66058
Chisq: 442.958 on 7 DF, p-value: < 2.22e-16
  1. Xem kết quả 3 mô hình
# install.packages("stargazer")
library(stargazer)
stargazer(pooledmethod, femmethod, remmethod,
          type = "text",   # hoặc "html", "latex"
          title = "So sánh 3 mô hình",
          column.labels = c("Pooled OLS", "FEM", "REM"),
          digits = 4)

So sánh 3 mô hình
==========================================================================
                                  Dependent variable:                     
             -------------------------------------------------------------
                                          ROA                             
                    Pooled OLS                  FEM                REM    
                       (1)                      (2)                (3)    
--------------------------------------------------------------------------
Lern                1.5430***                1.3565***          1.6571*** 
                     (0.2499)                 (0.2460)          (0.2530)  
                                                                          
CR                  -0.0672**                -0.0869***        -0.0901*** 
                     (0.0326)                 (0.0255)          (0.0279)  
                                                                          
SIZE                0.2731***                0.6626***          0.4192*** 
                     (0.0349)                 (0.0570)          (0.0471)  
                                                                          
CAP                 0.1241***                0.0940***          0.1050*** 
                     (0.0112)                 (0.0103)          (0.0109)  
                                                                          
LGR                 0.0142***                 0.0041**           0.0037*  
                     (0.0027)                 (0.0020)          (0.0022)  
                                                                          
GDPG                 -0.0249                   0.0046            -0.0059  
                     (0.0155)                 (0.0091)          (0.0103)  
                                                                          
INF                 0.0920***                0.0561***          0.0636*** 
                     (0.0308)                 (0.0179)          (0.0204)  
                                                                          
Constant            -6.3873***                                 -8.8539*** 
                     (0.6947)                                   (0.8968)  
                                                                          
--------------------------------------------------------------------------
Observations           225                      225                225    
R2                    0.6036                   0.7498            0.6712   
Adjusted R2           0.5908                   0.7096            0.6606   
F Statistic  47.1966*** (df = 7; 217) 82.6352*** (df = 7; 193) 442.9578***
==========================================================================
Note:                                          *p<0.1; **p<0.05; ***p<0.01
  1. Poolability test

  2. Test for individual and time effect for panel data

plmtest(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF,data = pdata,effect = "twoways",type = "ghm")

    Lagrange Multiplier Test - two-ways effects (Gourieroux, Holly and
    Monfort)

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
chibarsq = 226.32, df0 = 0.00, df1 = 1.00, df2 = 2.00, w0 = 0.25, w1 =
0.50, w2 = 0.25, p-value < 2.2e-16
alternative hypothesis: significant effects
plmtest(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF,data = pdata,effect = "twoways",type = "bp")

    Lagrange Multiplier Test - two-ways effects (Breusch-Pagan)

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
chisq = 226.32, df = 2, p-value < 2.2e-16
alternative hypothesis: significant effects
  1. Choose between Pooled OLS and FEM

Giả thuyết H0: Pooled OLS là nhất quán; H1: FEM là nhất quán => nếu MH nhất quán, khi kích thước mẫu càng lớn thì MH càng chính xác => nên chọn MH nào “consistent”

Đọc kết quả Kiểm định F: p-value < 0.05 => bác bỏ H0, chọn H1 => chọn FEM

pFtest(femmethod,pooledmethod)

    F test for individual effects

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
F = 19.422, df1 = 24, df2 = 193, p-value < 2.2e-16
alternative hypothesis: significant effects
  1. Choose between REM and PooledOLS
plmtest(remmethod, type = "bp")

    Lagrange Multiplier Test - (Breusch-Pagan)

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
chisq = 179.6, df = 1, p-value < 2.2e-16
alternative hypothesis: significant effects
  1. Choose between FEM and REM

Giả thuyết H0: REM is consistent; H1: chọn FEM

Đọc kết quả Kiểm định Hausman: p-value < 0.05 => bác bỏ H0, chọn H1 => chọn FEM

phtest(femmethod,remmethod)

    Hausman Test

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
chisq = 52.469, df = 7, p-value = 4.719e-09
alternative hypothesis: one model is inconsistent
  1. Kiểm định FEM 2 chiều
# 1. Ước lượng mô hình FEM 2 chiều (Two-ways effects)
fem2 <- plm(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF, data = pdata, model = "within", effect = "twoways")

# 2. Sử dụng hàm pFtest để so sánh
pFtest(fem2, femmethod)

    F test for twoways effects

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
F = 1.7322, df1 = 6, df2 = 187, p-value = 0.1156
alternative hypothesis: significant effects
# đọc p-value < 0.05 => FEM 2 chiều phù hợp
  1. Kiểm tra phụ thuộc chéo (Pesaran’s Cross-Sectional Dependence Test) với phương pháp Lagrange Multiplier (Breusch-Pagan LM test), xác định liệu các đơn vị quan sát (ví dụ: các quốc gia, công ty, khu vực) có tương tác với nhau hay không. Giả thuyết H0: không có sự phụ thuộc chéo.

Đọc KQ: p-value<0.05 => bác bỏ H0 => kết luận: có sự phụ thuộc chéo.

  # test phụ thuộc chéo mô hình pooledOLS bỏ tùy chọn model
pcdtest(
  ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF,
  data = pdata, model = "within", effect = "individual",
  test = "lm"
)

    Breusch-Pagan LM test for cross-sectional dependence in panels

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
chisq = 439.71, df = 300, p-value = 2.486e-07
alternative hypothesis: cross-sectional dependence
  # test phụ thuộc chéo mô hình fem
pcdtest(femmethod, test = "lm")

    Breusch-Pagan LM test for cross-sectional dependence in panels

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
chisq = 439.71, df = 300, p-value = 2.486e-07
alternative hypothesis: cross-sectional dependence
  1. Pesaran’s Cross-Sectional Dependence Test với phương pháp CD test
pcdtest(femmethod, test = ("cd"))

    Pesaran CD test for cross-sectional dependence in panels

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
z = 0.54546, p-value = 0.5854
alternative hypothesis: cross-sectional dependence
  1. Panel Unit Root Testing

kiểm tra tính ổn định của dữ liệu bảng (kiểm tra tính dừng của data); H0: có nghiệm đơn vị trong biến (biến không dừng); H1: biến dừng

Ram = data.frame((split(data_100$ROA,data_100$BANK)))
purtest(Ram, pmax = 2,exo = "intercept", test = "levinlin")

    Levin-Lin-Chu Unit-Root Test (ex. var.: Individual Intercepts)

data:  Ram
z = 2.0029, p-value = 0.9774
alternative hypothesis: stationarity

đọc kết quả p-value < 0.05 => chọn H1: chuỗi dừng ; kết quả của Kiểm định Levin-Lin-Chu hiện tại chuỗi không dừng. Kiểm định tiếp bằng Kiểm định Maddala-Wu

purtest(Ram, pmax = 2,exo = "intercept", test = "madwu")

    Maddala-Wu Unit-Root Test (ex. var.: Individual Intercepts)

data:  Ram
chisq = 172.4, df = 50, p-value = 2.3e-15
alternative hypothesis: stationarity

kết quả kiểm định Maddala-Wu, p-value < 0.05 => chuỗi dừng.

21.1. Panel Durbin Watson test for Autocorrelation

Kiểm định hiện tượng tự tương quan của REM. Ho: không có tự tương quan trong sai số

đọc kết quả p-value < 0.05 => chọn H1 => MH có hiện tượng tự tương quan sai số.

#pdwtest(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF,data = pdata,model = "random")

21.2. Wooldridge Test for Autocorrelation of FEM

H0: không có tự tương quan, đọc kết quả, p-value < 0.05, chọn H1, nghĩa là có tự tương quan

pbgtest(femmethod) # Kiểm định Breusch-Godfrey

    Breusch-Godfrey/Wooldridge test for serial correlation in panel models

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
chisq = 47.904, df = 9, p-value = 2.662e-07
alternative hypothesis: serial correlation in idiosyncratic errors
# hoặc
pwartest(femmethod) # Kiểm định Wooldridge cho dữ liệu bảng

    Wooldridge's test for serial correlation in FE panels

data:  femmethod
F = 51.534, df1 = 1, df2 = 198, p-value = 1.386e-11
alternative hypothesis: serial correlation

22.1. Testing of Homoscedasticity in Panel Data

Kiểm định hiện tượng PSSS thay đổi FEM; H0: phương sai sai số không đổi

#install.packages("lmtest")
# FEM 1 chiều
library(lmtest)
bptest(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF,data = pdata,studentize = F)

    Breusch-Pagan test

data:  ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF
BP = 29.773, df = 7, p-value = 0.0001045
# FEM 2 chiều
#bptest(ROA~Lern+CR+SIZE+CAP+LGR+GDPG+INF + factor(BANK) + factor(YEAR), 
      # data = pdata, studentize = TRUE)

đọc kết quả Kiểm định Breusch-Pagan, p-value < 0.05 => chọn H1 => PSSS có thay đổi.

Như vậy, MH hiện tại có hiện tượng tự tương quan và PSSS thay đổi.

22.2. Kiểm định hiện tượng PSSS thay đổi REM; H0: PSSS không đổi; H1: PSSS thay đổi.

library(lmtest)
library(sandwich)
library(plm)
#bptest(remmethod, studentize = FALSE)

đọc kết quả: p-value < 0.05 => bác bỏ H0, chọn H1 => PSSS thay đổi.

  1. Controlling off Heteroscedasticity and autocorrelation of Panel Data

Với panel MH nếu các cùng trong 1 quốc gia, biến GDPG, INF giống nhau giữa các NH theo từng năm nên khi chạy FEM 2 chiều sẽ bị triệt tiêu trong MH

Vẫn nên dùng FEM 1 chiều nếu muốn biến GDPG, INF xuất hiện (và bản thân các biến này thể hiện sự khác biệt về thời gian giữa các NH nếu nó có ý nghĩa thống kê)

#install.packages("lmtest")
#install.packages("sandwich")
library(lmtest)
library(sandwich)
library(plm)
coeftest(femmethod,vcovHC(femmethod,method = "arellano")) # Clustered Robust Standard Errors) PSSS+TTQ

t test of coefficients:

       Estimate Std. Error t value  Pr(>|t|)    
Lern  1.3564870  0.3634783  3.7320 0.0002498 ***
CR   -0.0868840  0.0331481 -2.6211 0.0094632 ** 
SIZE  0.6626068  0.0759782  8.7210 1.270e-15 ***
CAP   0.0939526  0.0144772  6.4897 7.077e-10 ***
LGR   0.0040720  0.0017262  2.3590 0.0193237 *  
GDPG  0.0045750  0.0070406  0.6498 0.5165908    
INF   0.0561183  0.0092002  6.0997 5.694e-09 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(femmethod, vcov = vcovSCC(femmethod, type = "HC1")) # SCC (Driscoll-Kraay) combo PSSS+TTQ+phụ thuộc chéo

t test of coefficients:

       Estimate Std. Error t value  Pr(>|t|)    
Lern  1.3564870  0.1880461  7.2136 1.210e-11 ***
CR   -0.0868840  0.0213779 -4.0642 7.011e-05 ***
SIZE  0.6626068  0.0478169 13.8572 < 2.2e-16 ***
CAP   0.0939526  0.0142266  6.6040 3.785e-10 ***
LGR   0.0040720  0.0023806  1.7105   0.08877 .  
GDPG  0.0045750  0.0066979  0.6831   0.49539    
INF   0.0561183  0.0113186  4.9581 1.555e-06 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#coeftest(femmethod,vcovHC) ## If there is heteroscedasticity

nếu là REM, khắc phục: coeftest(remmethod,vcovHC(remmethod,type = “HC1”))

=> có thể dùng kết quả sau khi khắc phục PSSS thay đổi và tự tương quan. Không cần chạy GLS.

  1. RUN GLS
library(nlme)

gls_model <- gls(ROA ~ Lern+CR+SIZE+CAP+LGR+GDPG+INF, data = pdata, correlation = corAR1()) # kiểm soát hiện tượng tự tương quan bậc 1 (AR(1))
summary(gls_model)
Generalized least squares fit by REML
  Model: ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF 
  Data: pdata 
       AIC      BIC    logLik
  128.0807 161.8797 -54.04037

Correlation Structure: AR(1)
 Formula: ~1 
 Parameter estimate(s):
      Phi 
0.8129392 

Coefficients:
                Value Std.Error   t-value p-value
(Intercept) -6.316691 0.7893935 -8.001954  0.0000
Lern         1.549274 0.2538544  6.103004  0.0000
CR          -0.081000 0.0257935 -3.140316  0.0019
SIZE         0.291259 0.0414646  7.024277  0.0000
CAP          0.099619 0.0120227  8.285954  0.0000
LGR         -0.000228 0.0016790 -0.135747  0.8921
GDPG         0.021529 0.0080511  2.674090  0.0081
INF          0.025684 0.0136154  1.886399  0.0606

 Correlation: 
     (Intr) Lern   CR     SIZE   CAP    LGR    GDPG  
Lern  0.465                                          
CR   -0.238  0.096                                   
SIZE -0.968 -0.596  0.146                            
CAP  -0.527 -0.330  0.048  0.442                     
LGR  -0.203 -0.014  0.216  0.122  0.195              
GDPG  0.100  0.026  0.020 -0.147 -0.119 -0.061       
INF  -0.122  0.030 -0.112  0.066  0.075  0.138 -0.097

Standardized residuals:
        Min          Q1         Med          Q3         Max 
-2.33896846 -0.67242032 -0.01786849  0.64068978  2.20960857 

Residual standard error: 0.4831327 
Degrees of freedom: 225 total; 217 residual
  1. Run FGLS của FEM
# Chạy PGLS với cấu trúc hiệu ứng cá nhân
fgls_model <- pggls(ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF, 
                    data = pdata, 
                    model = "within", 
                    effect = "individual")

summary(fgls_model)
Oneway (individual) effect Within FGLS model

Call:
pggls(formula = ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF, 
    data = pdata, effect = "individual", model = "within")

Balanced Panel: n = 25, T = 9, N = 225

Residuals:
       Min.     1st Qu.      Median     3rd Qu.        Max. 
-0.79741201 -0.16073420  0.00293314  0.15982636  0.77250433 

Coefficients:
        Estimate  Std. Error z-value  Pr(>|z|)    
Lern  1.40414354  0.20929707  6.7089 1.962e-11 ***
CR   -0.07766684  0.01922601 -4.0397 5.353e-05 ***
SIZE  0.56395314  0.06623492  8.5144 < 2.2e-16 ***
CAP   0.08787694  0.01198686  7.3311 2.283e-13 ***
LGR   0.00042327  0.00126436  0.3348    0.7378    
GDPG  0.00890537  0.00669216  1.3307    0.1833    
INF   0.04364214  0.00820647  5.3180 1.049e-07 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Total Sum of Squares: 105.33
Residual Sum of Squares: 12.682
Multiple R-squared: 0.8796

In kết quả mô hình FEM và FEM_DK

library(stargazer)
library(sandwich)
library(lmtest)

# 1. Tính SE cho FEM Gốc
se_goc <- sqrt(diag(vcov(femmethod)))

# 2. Tính SE cho FEM Arellano (Clustered Robust)
se_arellano <- sqrt(diag(vcovHC(femmethod, method = "arellano")))

# 3. Tính SE cho FEM Driscoll-Kraay (SCC)
se_scc <- sqrt(diag(vcovSCC(femmethod, type = "HC1")))

# 4. In bảng so sánh
stargazer(femmethod, femmethod, femmethod,
          type = "text",
          title = "So sánh các phương pháp điều chỉnh sai số chuẩn cho FEM",
          column.labels = c("FEM Gốc", "FEM (Arellano)", "FEM (SCC/DK)"),
          se = list(se_goc, se_arellano, se_scc),
          digits = 4)

So sánh các phương pháp điều chỉnh sai số chuẩn cho FEM
================================================================
                                   Dependent variable:          
                          --------------------------------------
                                           ROA                  
                           FEM Gốc   FEM (Arellano) FEM (SCC/DK)
                             (1)          (2)           (3)     
----------------------------------------------------------------
Lern                      1.3565***    1.3565***     1.3565***  
                           (0.2460)     (0.3635)      (0.1880)  
                                                                
CR                        -0.0869***   -0.0869***    -0.0869*** 
                           (0.0255)     (0.0331)      (0.0214)  
                                                                
SIZE                      0.6626***    0.6626***     0.6626***  
                           (0.0570)     (0.0760)      (0.0478)  
                                                                
CAP                       0.0940***    0.0940***     0.0940***  
                           (0.0103)     (0.0145)      (0.0142)  
                                                                
LGR                        0.0041**     0.0041**      0.0041*   
                           (0.0020)     (0.0017)      (0.0024)  
                                                                
GDPG                        0.0046       0.0046        0.0046   
                           (0.0091)     (0.0070)      (0.0067)  
                                                                
INF                       0.0561***    0.0561***     0.0561***  
                           (0.0179)     (0.0092)      (0.0113)  
                                                                
----------------------------------------------------------------
Observations                 225          225           225     
R2                          0.7498       0.7498        0.7498   
Adjusted R2                 0.7096       0.7096        0.7096   
F Statistic (df = 7; 193) 82.6352***   82.6352***    82.6352*** 
================================================================
Note:                                *p<0.1; **p<0.05; ***p<0.01
# Nếu bạn chưa cài, hãy chạy: 
# install.packages("texreg")
# 1. Trích xuất hệ số từ fgls_model
# Trích xuất hệ số (Coefficients)
fgls_coef <- coef(fgls_model)

# Trích xuất sai số chuẩn (SE) trực tiếp từ ma trận hiệp phương sai
fgls_se <- sqrt(diag(vcov(fgls_model)))

# Kiểm tra lại xem chúng đã là vector chưa
print(fgls_coef)
        Lern           CR         SIZE          CAP          LGR         GDPG 
 1.404143541 -0.077666839  0.563953141  0.087876941  0.000423268  0.008905373 
         INF 
 0.043642141 
print(fgls_se)
       Lern          CR        SIZE         CAP         LGR        GDPG 
0.209297073 0.019226012 0.066234918 0.011986857 0.001264360 0.006692156 
        INF 
0.008206470 
# 2. Sử dụng stargazer với mô hình 'dummy' (giả)
# Chúng ta sẽ in một bảng 'lm' giả có cùng số hệ số để stargazer vẽ khung
# Sau đó dùng tham số override để ghi đè số liệu thật vào
dummy_model <- lm(ROA ~ Lern + CR + SIZE + CAP + LGR + GDPG + INF, data = pdata)

stargazer(dummy_model, dummy_model, dummy_model, dummy_model,
          type = "text",
          title = "So sánh 4 mô hình (Kết quả đã được ghi đè)",
          column.labels = c("FEM Gốc", "FEM (Arellano)", "FEM (SCC)", "FEM (FGLS)"),
          # Ghi đè hệ số thật (Estimate)
          coef = list(coef(femmethod), coef(femmethod), coef(femmethod), fgls_coef),
          # Ghi đè sai số chuẩn thật (SE)
          se = list(se_goc, se_arellano, se_scc, fgls_se),
          digits = 4)

So sánh 4 mô hình (Kết quả đã được ghi đè)
==============================================================================
                                             Dependent variable:              
                               -----------------------------------------------
                                                     ROA                      
                                FEM Gốc   FEM (Arellano) FEM (SCC)  FEM (FGLS)
                                  (1)          (2)          (3)        (4)    
------------------------------------------------------------------------------
Lern                           1.3565***    1.3565***    1.3565***  1.4041*** 
                                (0.2460)     (0.3635)     (0.1880)   (0.2093) 
                                                                              
CR                             -0.0869***   -0.0869***   -0.0869*** -0.0777***
                                (0.0255)     (0.0331)     (0.0214)   (0.0192) 
                                                                              
SIZE                           0.6626***    0.6626***    0.6626***  0.5640*** 
                                (0.0570)     (0.0760)     (0.0478)   (0.0662) 
                                                                              
CAP                            0.0940***    0.0940***    0.0940***  0.0879*** 
                                (0.0103)     (0.0145)     (0.0142)   (0.0120) 
                                                                              
LGR                             0.0041**     0.0041**     0.0041*     0.0004  
                                (0.0020)     (0.0017)     (0.0024)   (0.0013) 
                                                                              
GDPG                             0.0046       0.0046       0.0046     0.0089  
                                (0.0091)     (0.0070)     (0.0067)   (0.0067) 
                                                                              
INF                            0.0561***    0.0561***    0.0561***  0.0436*** 
                                (0.0179)     (0.0092)     (0.0113)   (0.0082) 
                                                                              
Constant                                                                      
                                                                              
                                                                              
------------------------------------------------------------------------------
Observations                      225          225          225        225    
R2                               0.6036       0.6036       0.6036     0.6036  
Adjusted R2                      0.5908       0.5908       0.5908     0.5908  
Residual Std. Error (df = 217)   0.4387       0.4387       0.4387     0.4387  
F Statistic (df = 7; 217)      47.1966***   47.1966***   47.1966*** 47.1966***
==============================================================================
Note:                                              *p<0.1; **p<0.05; ***p<0.01