Introduction

Banking has recently taken over the financial system. Its importance in aiding some countries’ economic prosperity develops. Good bank performance and profitability require a detailed understanding and management of the financial system itself. The objective of this study is to investigate into the relationship between financial indicators such as CAR (Capital Adequacy Ratio), NPL (Non-Performing Loan), NIM (Net Interest Margin), OER (Operational Efficiency Ratio), and LDR (Loan to Deposits Ratio) on bank profitability as measured by Return on Assets (ROA) pre and during COVID-19 Pandemic in Indonesia using data from 50 Indonesian commercial banks from 2019 to 2021. The significant threshold in this investigation is 5%.

Library

library(readxl)
library(ggplot2)
library("plm")
library("MASS")
library(lmtest)
library(car)
library(miscTools)

Data

This study’s population includes all commercial banks in Indonesia. The Financial Services Authority, commonly known as Otoritas Jasa Keuangan (OJK), documented a total of 107 commercial banks in Indonesia as of February 2021. To achieve a representative sample, this study used a purposive selection technique, which involved selecting individuals based on specific criteria. This study takes use of OJK financial report data. These conditions included the bank issuing consecutive financial statements from 2019 to 2021, operating without government liquidation during that time, and having bank reports available. A sample of fifty banks was chosen for this study based on these criteria.

# Read data
panel <- read_excel('Bank.xlsx')

# Descriptive statistics
summary(panel)  # Summary statistics for numeric variables
##        No            Year           ROA             CAR              NPL       
##  Min.   : 1.0   Min.   :2019   Min.   :0.020   Min.   : 13.69   Min.   :0.210  
##  1st Qu.:13.0   1st Qu.:2019   1st Qu.:0.745   1st Qu.: 20.93   1st Qu.:2.090  
##  Median :25.5   Median :2020   Median :1.360   Median : 23.88   Median :2.925  
##  Mean   :25.5   Mean   :2020   Mean   :1.536   Mean   : 28.67   Mean   :3.058  
##  3rd Qu.:38.0   3rd Qu.:2021   3rd Qu.:2.087   3rd Qu.: 29.89   3rd Qu.:3.910  
##  Max.   :50.0   Max.   :2021   Max.   :4.970   Max.   :201.57   Max.   :8.140  
##       NIM              OER              LDR        
##  Min.   : 0.470   Min.   : 34.13   Min.   : 29.67  
##  1st Qu.: 3.610   1st Qu.: 74.41   1st Qu.: 72.83  
##  Median : 4.450   Median : 81.96   Median : 82.55  
##  Mean   : 4.713   Mean   : 82.07   Mean   : 89.60  
##  3rd Qu.: 5.535   3rd Qu.: 91.45   3rd Qu.: 95.66  
##  Max.   :19.300   Max.   :132.39   Max.   :241.97
table(panel$Year)  # Frequency table for the 'Year' variable
## 
## 2019 2020 2021 
##   50   50   50

The following are the mean values for several financial indicators from 2019 to 2021: the ROA is 1.536%, the CAR is 28.67%, the NPL is 3.058%, the NIM is 4.713%, the OER is 82.07%, and the LDR is 89.60%.

# Subset the data for the years 2019-2021
subset_data <- subset(panel, Year >= 2019 & Year <= 2021)

# Find the row with the highest value
highest_roa_row <- subset_data[which.max(subset_data$ROA), "No"]
highest_car_row <- subset_data[which.max(subset_data$CAR), "No"]
highest_npl_row <- subset_data[which.max(subset_data$NPL), "No"]
highest_nim_row <- subset_data[which.max(subset_data$NIM), "No"]
highest_oer_row <- subset_data[which.max(subset_data$OER), "No"]
highest_ldr_row <- subset_data[which.max(subset_data$LDR), "No"]

# Print the row with the highest value
print(highest_roa_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    35
# PT BANK BISNIS INTERNASIONAL
print(highest_car_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    35
# PT BANK BISNIS INTERNASIONAL
print(highest_npl_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    28
# PT BANK BNP PARIBAS INDONESIA
print(highest_nim_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    42
# PT BANK AMAR INDONESIA
print(highest_oer_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    26
# PT BANK MIZUHO INDONESIA
print(highest_ldr_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    35
# PT BANK BISNIS INTERNASIONAL

# Find the row with the lowest value
lowest_roa_row <- subset_data[which.min(subset_data$ROA), "No"]
lowest_car_row <- subset_data[which.min(subset_data$CAR), "No"]
lowest_npl_row <- subset_data[which.min(subset_data$NPL), "No"]
lowest_nim_row <- subset_data[which.min(subset_data$NIM), "No"]
lowest_oer_row <- subset_data[which.min(subset_data$OER), "No"]
lowest_ldr_row <- subset_data[which.min(subset_data$LDR), "No"]

# Print the rows with the lowest values for each variable
print(lowest_roa_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    42
# PT BANK AMAR INDONESIA
print(lowest_car_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    33
# PT BANK MASPION INDONESIA
print(lowest_npl_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    24
# PT BANK NATIONALNOBU
print(lowest_nim_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    21
# PT BANK MAYAPADA INTERNATIONAL, Tbk
print(lowest_oer_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    35
# PT BANK BISNIS INTERNASIONAL
print(lowest_ldr_row)
## # A tibble: 1 × 1
##      No
##   <dbl>
## 1    40
# PT BANK INA PERDANA

Further investigation reveals the highest values for each indicator, as well as the banks that hold these positions. The greatest ROA, CAR, and LDR are displayed by PT BANK BISNIS INTERNASIONAL. The highest NPL is held by PT BANK BNP PARIBAS INDONESIA, the highest NIM is held by PT BANK AMAR INDONESIA, and the highest OER is held by PT BANK MIZUHO INDONESIA. The lowest values for each indicator and the related banks, on the other hand, are as follows: The lowest ROA is held by PT BANK AMAR INDONESIA, the lowest CAR is held by PT BANK MASPION INDONESIA, the lowest NPL is held by PT BANK MAYAPADA INTERNATIONAL, Tbk, the lowest NIM is held by PT INTERNATIONAL BUSINESS BANK, and the lowest LDR is held by PT BANK INA PERDANA.

# Calculate the average ROA for each year
avg_roa <- aggregate(ROA ~ Year, data = subset_data, FUN = mean)

# Create a bar plot to visualize the trend of ROA over time with color
ggplot(avg_roa, aes(x = Year, y = ROA, fill = Year)) +
  geom_bar(stat = "identity") +
  labs(x = "Year", y = "ROA") +
  ggtitle("Trend of ROA over 2019-2021") +
  scale_fill_gradient(low = "blue", high = "red")

ROA in Indonesia fell in 2020 and then began to rise gradually in 2021. The Covid 19 epidemic happened during this time era.

# Calculate the average values for each variable by year
avg_variables <- aggregate(cbind(ROA, CAR, NPL, NIM, OER, LDR) ~ Year, data = subset_data, FUN = mean)

# Reshape the data from wide to long format
avg_variables_long <- tidyr::gather(avg_variables, Variable, Value, -Year)

# Create separate line plots for each variable with custom colors
ggplot(avg_variables_long, aes(x = Year, y = Value, color = Year)) +
  geom_line() +
  labs(x = "Year", y = "Value") +
  ggtitle("Trends of Financial Indicators over 2019-2021") +
  facet_wrap(~ Variable, nrow = 2, scales = "free_y") +
  scale_color_gradient(low = "blue", high = "red")

CAR increased from 2019 to 2021. In contrast, both the LDR and the NIM fell within the same period. Furthermore, the NPL and OER showed an initial increase from 2019 to 2020, followed by a drop in 2021. In contrast, the ROA showed a reduction from 2019 to 2020, then an upward trajectory from 2020 to 2021.

General model

# Pool
pool <- plm(ROA ~ CAR+NPL+NIM+OER+LDR,data=panel,index=c("No", "Year"),model="pooling")
summary(pool)
## Pooling Model
## 
## Call:
## plm(formula = ROA ~ CAR + NPL + NIM + OER + LDR, data = panel, 
##     model = "pooling", index = c("No", "Year"))
## 
## Balanced Panel: n = 50, T = 3, N = 150
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -1.414103 -0.239501 -0.038223  0.208793  2.337275 
## 
## Coefficients:
##               Estimate Std. Error  t-value  Pr(>|t|)    
## (Intercept)  6.0284042  0.3194653  18.8703 < 2.2e-16 ***
## CAR         -0.0022988  0.0023808  -0.9656 0.3358878    
## NPL         -0.0949388  0.0280927  -3.3795 0.0009347 ***
## NIM          0.1601487  0.0185003   8.6565 8.883e-15 ***
## OER         -0.0609711  0.0033421 -18.2436 < 2.2e-16 ***
## LDR          0.0012571  0.0012453   1.0095 0.3144448    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    163.49
## Residual Sum of Squares: 32.031
## R-Squared:      0.80408
## Adj. R-Squared: 0.79728
## F-statistic: 118.201 on 5 and 144 DF, p-value: < 2.22e-16
# FEM in time
FEM_time <- plm(ROA ~ CAR+NPL+NIM+OER+LDR,data=panel,index=c("No", "Year"),model="within",effect="time")
summary(FEM_time)
## Oneway (time) effect Within Model
## 
## Call:
## plm(formula = ROA ~ CAR + NPL + NIM + OER + LDR, data = panel, 
##     effect = "time", model = "within", index = c("No", "Year"))
## 
## Balanced Panel: n = 50, T = 3, N = 150
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -1.373620 -0.201869 -0.017975  0.158058  2.360422 
## 
## Coefficients:
##        Estimate  Std. Error  t-value  Pr(>|t|)    
## CAR -0.00088122  0.00245356  -0.3592 0.7200108    
## NPL -0.09466231  0.02773537  -3.4131 0.0008373 ***
## NIM  0.15414241  0.01853316   8.3171 6.673e-14 ***
## OER -0.06159541  0.00332410 -18.5299 < 2.2e-16 ***
## LDR  0.00034859  0.00130460   0.2672 0.7896998    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    161.93
## Residual Sum of Squares: 30.768
## R-Squared:      0.80999
## Adj. R-Squared: 0.80063
## F-statistic: 121.069 on 5 and 142 DF, p-value: < 2.22e-16
fixef(FEM_time)
##   2019   2020   2021 
## 6.2265 6.2081 6.0089
# FEM in individual
FEM_ind <- plm(ROA ~ CAR+NPL+NIM+OER+LDR,data=panel,index=c("No", "Year"),model="within",effect="individual")
summary(FEM_ind)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = ROA ~ CAR + NPL + NIM + OER + LDR, data = panel, 
##     effect = "individual", model = "within", index = c("No", 
##         "Year"))
## 
## Balanced Panel: n = 50, T = 3, N = 150
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -0.7040521 -0.1509721 -0.0073735  0.1339928  1.1729250 
## 
## Coefficients:
##        Estimate  Std. Error t-value  Pr(>|t|)    
## CAR  0.00066369  0.00323529  0.2051  0.837901    
## NPL -0.05115957  0.04464550 -1.1459  0.254712    
## NIM  0.22680824  0.04969186  4.5643 1.499e-05 ***
## OER -0.03727279  0.00485663 -7.6746 1.451e-11 ***
## LDR  0.00642186  0.00225700  2.8453  0.005435 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    29.626
## Residual Sum of Squares: 12.449
## R-Squared:      0.5798
## Adj. R-Squared: 0.34095
## F-statistic: 26.2164 on 5 and 95 DF, p-value: < 2.22e-16
fixef(FEM_ind)
##      1      2      3      4      5      6      7      8      9     10     11 
## 3.6185 3.5349 3.0834 4.1182 3.2575 2.9360 3.2346 4.6178 2.6507 3.3436 2.9926 
##     12     13     14     15     16     17     18     19     20     21     22 
## 3.3266 3.1084 2.8574 2.7993 2.7914 3.6517 2.5756 2.6244 3.1768 2.8411 2.8677 
##     23     24     25     26     27     28     29     30     31     32     33 
## 2.7132 2.7202 3.4499 3.0488 3.2677 3.3764 2.9359 3.8459 2.4232 2.7475 3.0554 
##     34     35     36     37     38     39     40     41     42     43     44 
## 2.6527 3.0334 3.4925 2.8544 3.5085 3.5742 3.0315 2.1800 1.1468 3.3295 2.9730 
##     45     46     47     48     49     50 
## 3.8577 3.0593 3.0556 2.8277 3.3935 2.8192
# REM
REM <- plm(ROA ~ CAR+NPL+NIM+OER+LDR,data=panel,index=c("No", "Year"),model="random")
summary(REM)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = ROA ~ CAR + NPL + NIM + OER + LDR, data = panel, 
##     model = "random", index = c("No", "Year"))
## 
## Balanced Panel: n = 50, T = 3, N = 150
## 
## Effects:
##                  var std.dev share
## idiosyncratic 0.1310  0.3620 0.743
## individual    0.0454  0.2131 0.257
## theta: 0.2997
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -1.228737 -0.188630 -0.042897  0.163814  1.978986 
## 
## Coefficients:
##               Estimate Std. Error  z-value  Pr(>|z|)    
## (Intercept)  5.3796014  0.3495934  15.3882 < 2.2e-16 ***
## CAR         -0.0017625  0.0025563  -0.6895  0.490529    
## NPL         -0.0936579  0.0310262  -3.0187  0.002539 ** 
## NIM          0.1686293  0.0217116   7.7668  8.05e-15 ***
## OER         -0.0552371  0.0036397 -15.1763 < 2.2e-16 ***
## LDR          0.0025845  0.0013972   1.8497  0.064352 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    95.27
## Residual Sum of Squares: 24.217
## R-Squared:      0.74581
## Adj. R-Squared: 0.73699
## Chisq: 422.509 on 5 DF, p-value: < 2.22e-16
ranef(REM)
##            1            2            3            4            5            6 
##  0.244866490  0.115626093 -0.009710094  0.269711049  0.092461638 -0.056086716 
##            7            8            9           10           11           12 
##  0.124643886  0.543247298 -0.088361935  0.095118268 -0.018302286  0.003587388 
##           13           14           15           16           17           18 
##  0.077208521 -0.103229556  0.145985277 -0.054040327  0.220777651 -0.187345239 
##           19           20           21           22           23           24 
## -0.115505731  0.010528798 -0.164705119 -0.119540083 -0.133462915 -0.213598683 
##           25           26           27           28           29           30 
##  0.110523904 -0.015896941  0.002290931  0.006622518 -0.281983544  0.238248471 
##           31           32           33           34           35           36 
## -0.077794523 -0.073322840 -0.050254089 -0.263709452  0.050288139  0.058239988 
##           37           38           39           40           41           42 
## -0.125680180  0.202361343  0.155493165 -0.035062417 -0.341549619 -0.488847797 
##           43           44           45           46           47           48 
##  0.009128907 -0.046071299  0.264613396  0.025075219  0.039837432 -0.066241795 
##           49           50 
##  0.099113949 -0.075296543

Model selection

# Hausman test
phtest(FEM_time,REM)
## 
##  Hausman Test
## 
## data:  ROA ~ CAR + NPL + NIM + OER + LDR
## chisq = 169.61, df = 5, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
phtest(FEM_ind,REM)
## 
##  Hausman Test
## 
## data:  ROA ~ CAR + NPL + NIM + OER + LDR
## chisq = 60.829, df = 5, p-value = 8.19e-12
## alternative hypothesis: one model is inconsistent
# The appropriate one is fixed

# Fixed vs PLM 
# Chow test
pFtest(FEM_time,pool)
## 
##  F test for time effects
## 
## data:  ROA ~ CAR + NPL + NIM + OER + LDR
## F = 2.9142, df1 = 2, df2 = 142, p-value = 0.0575
## alternative hypothesis: significant effects
# The appropriate one is pooled

pFtest(FEM_ind,pool)
## 
##  F test for individual effects
## 
## data:  ROA ~ CAR + NPL + NIM + OER + LDR
## F = 3.0497, df1 = 49, df2 = 95, p-value = 1.638e-06
## alternative hypothesis: significant effects
# The appropriate one is FEM individual

# Pool vs REM
# LM test
plmtest(pool,type=c("bp"))
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  ROA ~ CAR + NPL + NIM + OER + LDR
## chisq = 3.7696, df = 1, p-value = 0.05219
## alternative hypothesis: significant effects
# The appropriate one is pooled

The most appropriate model is pooled

OLS estimate

# Residual form of the selected model
# Normality assumption
residuals <- pool$residuals
shapiro.test(residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals
## W = 0.91697, p-value = 1.359e-07
hist(residuals)

# Against the null hypothesis of normality

# Heterogeneity assumption
bptest(pool)
## 
##  studentized Breusch-Pagan test
## 
## data:  pool
## BP = 8.3503, df = 5, p-value = 0.138
# No significant evidence of heteroscedasticity

# VIF
vif(pool)
##      CAR      NPL      NIM      OER      LDR 
## 1.292222 1.223156 1.042828 1.308571 1.180191
# VIF < 10 means that there is no multicollinearity

Final

# Tackle the problem of normality
# Robust regression
robust <- rlm(ROA ~ CAR + NPL + NIM + OER + LDR , data=panel)

# To see the P-value
coeftest(robust)
## 
## z test of coefficients:
## 
##                Estimate  Std. Error  z value  Pr(>|z|)    
## (Intercept)  6.92075568  0.19199966  36.0457 < 2.2e-16 ***
## CAR         -0.00368109  0.00143086  -2.5726  0.010093 *  
## NPL         -0.04349668  0.01688382  -2.5762  0.009988 ** 
## NIM          0.15330034  0.01111874  13.7876 < 2.2e-16 ***
## OER         -0.07236549  0.00200858 -36.0281 < 2.2e-16 ***
## LDR          0.00074318  0.00074843   0.9930  0.320720    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# All significant except LDR 

# To see the R-square
r_squared <- rSquared(panel$ROA,robust$residuals)
r_squared
##           [,1]
## [1,] 0.7867281
# To see the adjusted R-squared
# Calculate the number of observations
n <- nrow(panel)

# Calculate the number of predictors (excluding the intercept)
p <- length(coef(robust)) - 1

# Calculate the adjusted R-squared
adjusted_r_squared <- 1 - (1 - r_squared) * (n - 1) / (n - p - 1)

# View the adjusted R-squared
adjusted_r_squared
##           [,1]
## [1,] 0.7793228
# To see the F-statistic
model_summary <- summary(robust)

# Calculate the F-statistic
num_pred <- length(coef(robust)) - 1
df_residual <- model_summary$df[2]
df_total <- nrow(panel) - 1

f_statistic <- (model_summary$sigma^2) / num_pred /
  (model_summary$sigma^2 / df_residual)

# Calculate p-value for F-statistic
p_value_f_statistic <- 1 - pf(f_statistic, num_pred, df_residual)

# Print F-statistic and its p-value
print(f_statistic)
## [1] 28.8
print(p_value_f_statistic)
## [1] 0

CONCLUSIONS

CAR, NPL, and OER all have a negative impact on ROA. Meanwhile, NIM has a significant positive effect on ROA. LDR, on the other hand, does not influence ROA. This could imply that banks with larger capital ratios are more likely to participate in lower-risk businesses with lower rewards. Following that, the bank’s resources are locked up in loans that are not generating income, possibly as a result of economic turmoil or other circumstances affecting borrower repayment ability. If expenses are not linked with revenue growth, a bank with high OER may struggle to maintain profitability. A higher NIM indicates that a bank earns more interest on loans and investments than it pays on deposits. Furthermore, the regression model has a high capacity for explanation, as evidenced by the high R-squared and adjusted R-squared values. Subsequently, the F-statistics low p-value suggests that the model is statistically significant. As a result, the model’s predictor variables are jointly significant On ROA.