Skip to contents

This vignette implements Part 3 of I-34.

Unit of observation: the loan bridge (a sequence of linked loans behind one household investment), decomposed into five common-start time segments for visualization; timing analysis uses asset definition agg_BS_1011.

Outputs at a glance

This vignette is visualization-focused: it renders figures and does not save a packaged dataset. Figures are written under res/res_bridge_timing/ when the corresponding ls_save_res flag is set to TRUE (all default FALSE); on-page display is controlled separately by bl_img_print_on_page.

Load libraries, etc.

library(PrjThaiHFID)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)
library(readr)

# controls
verbose <- TRUE
it_row_print <- 50
it_file_code <- 308063
bl_img_print_on_page <- TRUE

# storage path
# here::here() resolves to vignettes/ under Quarto (temporary _quarto.yml);
# find the package root explicitly so paths resolve under Quarto and knitr.
spn_pkg_root <- rprojroot::find_root(rprojroot::has_file("DESCRIPTION"))
spn_res <- file.path(
  spn_pkg_root,
  "res", "res_bridge_timing",
  fsep = .Platform$file.sep
)
spt_res <- spn_res

# per-figure save flags (keys match the ls_plot element names); all default FALSE
ls_save_res <- list(
  `agg_BS_1011_st_bridge_forinf_d1m5_all_groups` = FALSE,
  `agg_BS_1011_st_bridge_forinf_d1m5_i-i-i` = FALSE,
  `agg_BS_1011_st_bridge_forinf_d1m5_f-i-f` = FALSE,
  `agg_BS_1011_st_bridge_forinf_d1m5_f-f-f` = FALSE,
  `agg_BS_1011_st_bridge_forinf_d1m5_f-mid` = FALSE,
  `agg_BS_1011_st_bridge_forinf_d1m5_i-mid-i2` = FALSE
)

Packaged data inputs

This vignette does not call the investment–loan–bridge gateway. It reads two objects from the package data/ folder (lazy-loaded via library(PrjThaiHFID)):

Object Role
tstm_roster_invest2loan2bridge Distinct-bridge invest–loan roster (Group D)
tstm_loans_bridges_type Triply linked loan bridges (Group A)

Provenance. Both are among the eight .rda files written by vignettes/ffv_invest_loan_bridge.qmd (issue #32), which runs ffp_hfid_invest_loan_linked_abc_investloan_char_gateway(). With bl_replace_data_output <- TRUE in that vignette, outputs overwrite canonical data/. See ?tstm_roster_invest2loan2bridge and R/data-res.R for variable definitions (MBF filters, three paper asset ivars, anonymized household IDs).

Refresh inputs and use them here

  1. Edit gateway parameters in ffv_invest_loan_bridge.qmd if needed (ar_st_vars_to_keep, month/size cuts, bl_replace_data_output).
  2. Render the bridge vignette (requires data/tstm_loans_panel.rda and data/tstm_asset_loan.rda): pkgdown::build_article("ffv_invest_loan_bridge")
  3. Reload the package so lazy data pick up the new files: devtools::load_all() or pkgfast from the repo root.
  4. Re-render this vignette (ffv_bridge_timing.qmd).

Analysis note. Packaged roster data include three asset ivars (agg_BS_1011, agg_BS_1012, agg_BS_1021). Below, ar_ivars is set to agg_BS_1011 only for the timing tables—that is an analysis choice, not the full ivar set in data/.

Pipeline structure

flowchart TD
  subgraph inputs [Packaged gateway outputs]
    roster[tstm_roster_invest2loan2bridge]
    bridges[tstm_loans_bridges_type]
  end
  subgraph prep [Load and merge]
    roster --> merge[merge roster with bridge type and width]
    bridges --> merge
    merge --> filt[filter NA and bridge-only rows]
  end
  subgraph classify [Linkage classifiers]
    filt --> cls[formal-informal triple categories d1m8 d1m5 etc]
  end
  subgraph segment [Bridge segments]
    cls --> bid[construct bridge id with common start at 1]
    bid --> seg[five segmented bridge components]
  end
  subgraph viz [Visualizations]
    seg --> fig[ggplot bridge-timing figures by linkage type]
    fig --> save[optional save to res_bridge_timing]
  end

Load bridge information

Load in all identified bridges, merge with bridge length information.

# 1a. Packaged gateway outputs (see "Packaged data inputs" above)
df_roster_invest2loan2bridge <- PrjThaiHFID::tstm_roster_invest2loan2bridge
df_loans_bridges_type <- PrjThaiHFID::tstm_loans_bridges_type
if (verbose) {
  print(glue::glue("f-{it_file_code}, 0bo1"))
  print(glue::glue("{dim(df_roster_invest2loan2bridge)}"))
  print(summary(df_roster_invest2loan2bridge))
  print(glue::glue("{dim(df_loans_bridges_type)}"))
  print(summary(df_loans_bridges_type))
}
#> f-308063, 0bo1
#> 10449
#> 91
#>     hhid_Num          ivars       hh_inv_asset_ctr      forinfm4    
#>  Min.   :1031   Length   :10449   Min.   :1.000    Length   :10449  
#>  1st Qu.:3155   N.unique :    3   1st Qu.:1.000    N.unique :    4  
#>  Median :5601   N.blank  :    0   Median :2.000    N.blank  :    0  
#>  Mean   :5531   Min.nchar:   11   Mean   :2.088    Min.nchar:    8  
#>  3rd Qu.:7705   Max.nchar:   11   3rd Qu.:3.000    Max.nchar:   15  
#>  Max.   :9996                     Max.   :8.000    NAs      :  874  
#>                                                                     
#>  hh_loan_id_nd   forinfm4_paired_1t2 hh_loan_id_nd_paired_1t2
#>  Min.   :   23   Length   :10449     Min.   :   24           
#>  1st Qu.: 5076   N.unique :    4     1st Qu.: 5158           
#>  Median :10127   N.blank  :    0     Median :10305           
#>  Mean   :10016   Min.nchar:    8     Mean   :10127           
#>  3rd Qu.:14957   Max.nchar:   15     3rd Qu.:15170           
#>  Max.   :19580   NAs      : 2798     Max.   :19581           
#>  NAs    :874                         NAs    :2798            
#>  forinfm4_paired_2t3 hh_loan_id_nd_paired_2t3 mth_inv_start    mth_inv_end    
#>  Length   :10449     Min.   :   25            Min.   : 14.0   Min.   : 14.00  
#>  N.unique :    4     1st Qu.: 5484            1st Qu.: 53.0   1st Qu.: 53.00  
#>  N.blank  :    0     Median :10316            Median : 77.0   Median : 77.00  
#>  Min.nchar:    8     Mean   :10238            Mean   : 76.7   Mean   : 76.78  
#>  Max.nchar:   15     3rd Qu.:15412            3rd Qu.: 98.0   3rd Qu.: 98.00  
#>  NAs      : 3419     Max.   :19582            Max.   :144.0   Max.   :144.00  
#>                      NAs    :3419                                             
#>    loan_start        loan_end      loan_start_paired_1t2 loan_end_paired_1t2
#>  Min.   :  8.00   Min.   : 11.00   Min.   : 11.00        Min.   : 11.00     
#>  1st Qu.: 50.00   1st Qu.: 66.00   1st Qu.: 62.00        1st Qu.: 73.00     
#>  Median : 74.00   Median : 89.00   Median : 82.00        Median : 95.00     
#>  Mean   : 74.46   Mean   : 90.49   Mean   : 84.54        Mean   : 96.25     
#>  3rd Qu.: 95.00   3rd Qu.:113.00   3rd Qu.:106.00        3rd Qu.:119.00     
#>  Max.   :144.00   Max.   :160.00   Max.   :160.00        Max.   :160.00     
#>  NAs    :874      NAs    :874      NAs    :1578          NAs    :1578       
#>  loan_start_paired_2t3 loan_end_paired_2t3 capital_prior      
#>  Min.   : 17.0         Min.   : 19.0       Min.   :        0  
#>  1st Qu.: 71.0         1st Qu.: 83.0       1st Qu.:    51044  
#>  Median : 90.0         Median :103.0       Median :   228080  
#>  Mean   : 92.3         Mean   :104.3       Mean   :  1026880  
#>  3rd Qu.:113.0         3rd Qu.:126.0       3rd Qu.:   718439  
#>  Max.   :159.0         Max.   :160.0       Max.   :141177726  
#>  NAs    :2365          NAs    :2365                           
#>   capital_end        capital_invest     loan_principal    loan_principal_last
#>  Min.   :    10000   Min.   :   10000   Min.   :    100   Min.   :      0    
#>  1st Qu.:    98282   1st Qu.:   24645   1st Qu.:  10000   1st Qu.:   4000    
#>  Median :   317238   Median :   47491   Median :  20000   Median :  15000    
#>  Mean   :  1154101   Mean   :  127221   Mean   :  40305   Mean   :  24175    
#>  3rd Qu.:   861308   3rd Qu.:  112140   3rd Qu.:  38490   3rd Qu.:  25000    
#>  Max.   :141635206   Max.   :11555926   Max.   :4100000   Max.   :1600000    
#>                                         NAs    :875       NAs    :874        
#>  loan_interest_monthly loan_principal_paired_1t2 loan_principal_last_paired_1t2
#>  Min.   :-1.000000     Min.   :    450           Min.   :      0               
#>  1st Qu.: 0.002466     1st Qu.:   5000           1st Qu.:   2500               
#>  Median : 0.004492     Median :  15000           Median :  11000               
#>  Mean   :-0.004855     Mean   :  25760           Mean   :  21618               
#>  3rd Qu.: 0.006293     3rd Qu.:  20000           3rd Qu.:  20000               
#>  Max.   : 0.462500     Max.   :2000000           Max.   :2000000               
#>  NAs    :875           NAs    :1578              NAs    :1578                  
#>  loan_interest_monthly_paired_1t2 loan_principal_paired_2t3
#>  Min.   :-1.000000                Min.   :    415          
#>  1st Qu.: 0.003274                1st Qu.:   5730          
#>  Median : 0.004844                Median :  16500          
#>  Mean   :-0.017256                Mean   :  28050          
#>  3rd Qu.: 0.006434                3rd Qu.:  29270          
#>  Max.   : 0.391941                Max.   :1600000          
#>  NAs    :1578                     NAs    :2365             
#>  loan_principal_last_paired_2t3 loan_interest_monthly_paired_2t3
#>  Min.   :      0                Min.   :-1.000000               
#>  1st Qu.:   3000                1st Qu.: 0.003182               
#>  Median :  15000                Median : 0.004492               
#>  Mean   :  23749                Mean   :-0.037408               
#>  3rd Qu.:  20000                3rd Qu.: 0.005938               
#>  Max.   :1600000                Max.   : 0.259921               
#>  NAs    :2365                   NAs    :2365                    
#>  bl_lender_type  bl_bridge_informal bl_loan_size    bl_loan_dura_a 
#>  Mode :logical   Mode :logical      Mode :logical   Mode :logical  
#>  FALSE:4304      FALSE:7105         FALSE:4104      FALSE:6289     
#>  TRUE :4567      TRUE :1766         TRUE :4766      TRUE :2582     
#>  NAs  :1578      NAs  :1578         NAs  :1579      NAs  :1578     
#>                                                                    
#>                                                                    
#>                                                                    
#>  bl_loan_dura_b  bl_loan_dura_c  bl_m1t2_formal  bl_p1t2_formal 
#>  Mode :logical   Mode :logical   Mode :logical   Mode :logical  
#>  FALSE:3426      FALSE:4477      FALSE:4928      FALSE:6405     
#>  TRUE :5445      TRUE :3607      TRUE :5521      TRUE :4044     
#>  NAs  :1578      NAs  :2365                                     
#>                                                                 
#>                                                                 
#>                                                                 
#>  bl_p2t3_formal  bl_m1t2_formal_avg bl_p1t2_formal_avg bl_p2t3_formal_avg
#>  Mode :logical   Min.   :0.0000     Min.   :0.0000     Min.   :0.0000    
#>  FALSE:5908      1st Qu.:0.2000     1st Qu.:0.0000     1st Qu.:0.0000    
#>  TRUE :4541      Median :0.5556     Median :0.3333     Median :0.4667    
#>                  Mean   :0.5284     Mean   :0.3870     Mean   :0.4346    
#>                  3rd Qu.:0.8750     3rd Qu.:0.7500     3rd Qu.:0.6667    
#>                  Max.   :1.0000     Max.   :1.0000     Max.   :1.0000    
#>                                                                          
#>  bl_jnt_m1t2_p1t2_formal bl_jnt_p1t2_p2t3_formal bl_jnt_m1t2_p1t2_informal
#>  Mode :logical           Mode :logical           Mode :logical            
#>  FALSE:7997              FALSE:7939              FALSE:7113               
#>  TRUE :2452              TRUE :2510              TRUE :3336               
#>                                                                           
#>                                                                           
#>                                                                           
#>                                                                           
#>  bl_jnt_p1t2_p2t3_informal bl_jnt_m1t2_p1t2_same bl_jnt_p1t2_p2t3_same
#>  Mode :logical             Mode :logical         Mode :logical        
#>  FALSE:6075                FALSE:5436            FALSE:4432           
#>  TRUE :4374                TRUE :2215            TRUE :2598           
#>                            NAs  :2798            NAs  :3419           
#>                                                                       
#>                                                                       
#>                                                                       
#>  bl_jnt_m1t2_p1t2_formal_avg bl_jnt_p1t2_p2t3_formal_avg
#>  Min.   :0.0000              Min.   :0.0000             
#>  1st Qu.:0.0000              1st Qu.:0.0000             
#>  Median :0.0000              Median :0.1250             
#>  Mean   :0.2347              Mean   :0.2402             
#>  3rd Qu.:0.4286              3rd Qu.:0.4444             
#>  Max.   :1.0000              Max.   :1.0000             
#>                                                         
#>  bl_jnt_m1t2_p1t2_informal_avg bl_jnt_p1t2_p2t3_informal_avg
#>  Min.   :0.0000                Min.   :0.0000               
#>  1st Qu.:0.0000                1st Qu.:0.1000               
#>  Median :0.2000                Median :0.3333               
#>  Mean   :0.3193                Mean   :0.4186               
#>  3rd Qu.:0.5000                3rd Qu.:0.7500               
#>  Max.   :1.0000                Max.   :1.0000               
#>                                                             
#>  bl_jnt_m1t2_p1t2_same_avg bl_jnt_p1t2_p2t3_same_avg bl_bri_only_baac
#>  Min.   :0.0000            Min.   :0.0000            Mode :logical   
#>  1st Qu.:0.0000            1st Qu.:0.2105            FALSE:9031      
#>  Median :0.2500            Median :0.3333            TRUE :102       
#>  Mean   :0.3012            Mean   :0.3744            NAs  :1316      
#>  3rd Qu.:0.5000            3rd Qu.:0.5000                            
#>  Max.   :1.0000            Max.   :1.0000                            
#>  NAs    :1719              NAs    :2275                              
#>  bl_bri_only_vilfund bl_bri_only_quasi bl_bri_only_informal bl_bri_has_baac
#>  Mode :logical       Mode :logical     Mode :logical        Mode :logical  
#>  FALSE:8538          FALSE:8473        FALSE:9021           FALSE:3914     
#>  TRUE :591           TRUE :285         TRUE :72             TRUE :3729     
#>  NAs  :1320          NAs  :1691        NAs  :1356           NAs  :2806     
#>                                                                            
#>                                                                            
#>                                                                            
#>  bl_bri_has_vilfund bl_bri_has_quasi bl_bri_has_informal bl_bri_only_baac_mean
#>  Mode :logical      Mode :logical    Mode :logical       Min.   :0.00000      
#>  FALSE:1807         FALSE:2631       FALSE:5342          1st Qu.:0.00000      
#>  TRUE :5867         TRUE :5425       TRUE :2308          Median :0.00000      
#>  NAs  :2775         NAs  :2393       NAs  :2799          Mean   :0.01118      
#>                                                          3rd Qu.:0.00000      
#>                                                          Max.   :1.00000      
#>                                                          NAs    :966          
#>  bl_bri_has_baac_mean bl_bri_only_vilfund_mean bl_bri_has_vilfund_mean
#>  Min.   :0.0000       Min.   :0.00000          Min.   :0.0000         
#>  1st Qu.:0.0000       1st Qu.:0.00000          1st Qu.:0.6500         
#>  Median :0.5385       Median :0.00000          Median :0.8500         
#>  Mean   :0.4885       Mean   :0.06663          Mean   :0.7724         
#>  3rd Qu.:0.8000       3rd Qu.:0.05556          3rd Qu.:1.0000         
#>  Max.   :1.0000       Max.   :1.00000          Max.   :1.0000         
#>  NAs    :1624         NAs    :977              NAs    :1628           
#>  bl_bri_only_quasi_mean bl_bri_has_quasi_mean bl_bri_only_informal_mean
#>  Min.   :0.00000        Min.   :0.0000        Min.   :0.000000         
#>  1st Qu.:0.00000        1st Qu.:0.5000        1st Qu.:0.000000         
#>  Median :0.00000        Median :0.7143        Median :0.000000         
#>  Mean   :0.03244        Mean   :0.6785        Mean   :0.007706         
#>  3rd Qu.:0.00000        3rd Qu.:1.0000        3rd Qu.:0.000000         
#>  Max.   :1.00000        Max.   :1.0000        Max.   :1.000000         
#>  NAs    :1107           NAs    :1366          NAs    :961              
#>  bl_bri_has_informal_mean bl_bridge_informal_mean bl_ibr_single  
#>  Min.   :0.0000           Min.   :0.0000          Mode :logical  
#>  1st Qu.:0.0000           1st Qu.:0.0000          FALSE:10261    
#>  Median :0.1818           Median :0.1111          TRUE :188      
#>  Mean   :0.3101           Mean   :0.2010                         
#>  3rd Qu.:0.5333           3rd Qu.:0.3333                         
#>  Max.   :1.0000           Max.   :1.0000                         
#>  NAs    :1814             NAs    :1177                           
#>      ll_gw1          ll_gw2          ll_gw3       hlin_m12_avg  
#>  Min.   : 0.00   Min.   : 0.00   Min.   : 1.00   Min.   :   23  
#>  1st Qu.:11.00   1st Qu.:10.00   1st Qu.:11.00   1st Qu.: 5078  
#>  Median :12.00   Median :12.00   Median :12.00   Median :10128  
#>  Mean   :13.75   Mean   :11.72   Mean   :12.02   Mean   :10016  
#>  3rd Qu.:13.00   3rd Qu.:12.00   3rd Qu.:12.00   3rd Qu.:14956  
#>  Max.   :48.00   Max.   :48.00   Max.   :48.00   Max.   :19580  
#>  NAs    :1578    NAs    :1578    NAs    :2365    NAs    :874    
#>   hlin_p12_avg    hlin_p23_avg   loan_start_min   loan_start_paired_1t2_min
#>  Min.   :   24   Min.   :   25   Min.   :  8.00   Min.   : 11.00           
#>  1st Qu.: 5118   1st Qu.: 5172   1st Qu.: 50.00   1st Qu.: 56.00           
#>  Median :10126   Median :10130   Median : 72.00   Median : 79.00           
#>  Mean   :10054   Mean   :10103   Mean   : 73.08   Mean   : 79.53           
#>  3rd Qu.:15066   3rd Qu.:15118   3rd Qu.: 94.00   3rd Qu.:100.00           
#>  Max.   :19581   Max.   :19582   Max.   :144.00   Max.   :158.00           
#>  NAs    :1719    NAs    :2275    NAs    :874      NAs    :1177             
#>  loan_start_paired_2t3_min  loan_end_max   loan_end_paired_1t2_max
#>  Min.   : 17.00            Min.   : 16.0   Min.   : 18.0          
#>  1st Qu.: 64.00            1st Qu.: 76.0   1st Qu.: 77.0          
#>  Median : 85.00            Median :101.0   Median :101.0          
#>  Mean   : 86.77            Mean   :103.7   Mean   :101.5          
#>  3rd Qu.:106.00            3rd Qu.:136.0   3rd Qu.:125.0          
#>  Max.   :159.00            Max.   :160.0   Max.   :160.0          
#>  NAs    :1637              NAs    :874     NAs    :1177           
#>  loan_end_paired_2t3_max      il1_lgt           il2_lgt           il3_lgt     
#>  Min.   : 19.0           Length   :10449   Length   :10449   Length   :10449  
#>  1st Qu.: 90.0           N.unique :    3   N.unique :    3   N.unique :    3  
#>  Median :113.0           N.blank  :    0   N.blank  :    0   N.blank  :    0  
#>  Mean   :112.5           Min.nchar:    5   Min.nchar:    5   Min.nchar:    5  
#>  3rd Qu.:136.0           Max.nchar:    5   Max.nchar:    5   Max.nchar:    5  
#>  Max.   :160.0                                                                
#>  NAs    :1637                                                                 
#>       ih1_lgt           ih2_lgt        st_ibr_single      st_ibr_joint  
#>  Length   :10449   Length   :10449   Length   :10449   Length   :10449  
#>  N.unique :    4   N.unique :    4   N.unique :    4   N.unique :    6  
#>  N.blank  :    0   N.blank  :    0   N.blank  :    0   N.blank  :    0  
#>  Min.nchar:    5   Min.nchar:    5   Min.nchar:    8   Min.nchar:   11  
#>  Max.nchar:    6   Max.nchar:    6   Max.nchar:   15   Max.nchar:   28  
#>                                      NAs      :10261   NAs      :  874  
#>                                                                         
#>  st_ibr_has_informal_bridge
#>  Length   :10449           
#>  N.unique :    2           
#>  N.blank  :    0           
#>  Min.nchar:   19           
#>  Max.nchar:   22           
#>  NAs      : 1594           
#>                            
#> 94907
#> 47
#>    bridge_id          br_type        br_type_id      hhid_Num   
#>  Min.   :    1   Length   :94907   Min.   :   1   Min.   :1003  
#>  1st Qu.: 6940   N.unique :    7   1st Qu.: 833   1st Qu.:3133  
#>  Median :11285   N.blank  :    0   Median :1707   Median :5272  
#>  Mean   :10708   Min.nchar:    3   Mean   :1847   Mean   :5436  
#>  3rd Qu.:14228   Max.nchar:    3   3rd Qu.:2828   3rd Qu.:7641  
#>  Max.   :19758   NAs      : 2011   Max.   :4375   Max.   :9996  
#>                                                                 
#>  hh_loan_id_nd_1t2 hh_loan_id_nd_paired_1t2 hh_loan_id_nd_paired_2t3
#>  Min.   :    2     Min.   :    5            Min.   :    7           
#>  1st Qu.: 5040     1st Qu.: 5041            1st Qu.: 5046           
#>  Median : 9721     Median : 9723            Median : 9726           
#>  Mean   : 9882     Mean   : 9887            Mean   : 9892           
#>  3rd Qu.:14656     3rd Qu.:14659            3rd Qu.:14661           
#>  Max.   :19584     Max.   :19585            Max.   :19587           
#>                                                                     
#>    hh_br_la_n       hh_br_lb_n       hh_br_lc_n     loan_start_1t2  
#>  Min.   :  1.00   Min.   :  1.00   Min.   :  1.00   Min.   :  1.00  
#>  1st Qu.:  7.00   1st Qu.:  6.00   1st Qu.:  7.00   1st Qu.: 48.00  
#>  Median : 12.00   Median : 13.00   Median : 12.00   Median : 74.00  
#>  Mean   : 15.56   Mean   : 16.84   Mean   : 16.19   Mean   : 72.61  
#>  3rd Qu.: 20.00   3rd Qu.: 21.00   3rd Qu.: 20.00   3rd Qu.: 98.00  
#>  Max.   :120.00   Max.   :144.00   Max.   :125.00   Max.   :157.00  
#>                                                                     
#>   loan_end_1t2    loan_start_paired_1t2 loan_end_paired_1t2
#>  Min.   :  2.00   Min.   :  2.00        Min.   :  3.00     
#>  1st Qu.: 65.00   1st Qu.: 61.00        1st Qu.: 76.00     
#>  Median : 88.00   Median : 83.00        Median : 99.00     
#>  Mean   : 87.87   Mean   : 83.79        Mean   : 99.67     
#>  3rd Qu.:113.00   3rd Qu.:109.00        3rd Qu.:125.00     
#>  Max.   :159.00   Max.   :159.00        Max.   :159.00     
#>                                                            
#>  loan_start_paired_2t3 loan_end_paired_2t3    forinfm4_1t2  
#>  Min.   :  2.00        Min.   :  4.0       Length   :94907  
#>  1st Qu.: 73.00        1st Qu.: 88.0       N.unique :    4  
#>  Median : 94.00        Median :111.0       N.blank  :    0  
#>  Mean   : 95.67        Mean   :111.3       Min.nchar:    8  
#>  3rd Qu.:122.00        3rd Qu.:139.0       Max.nchar:   15  
#>  Max.   :159.00        Max.   :160.0                        
#>                                                             
#>  forinfm4_paired_1t2 forinfm4_paired_2t3 loan_principal_1t2
#>  Length   :94907     Length   :94907     Min.   :    150   
#>  N.unique :    4     N.unique :    4     1st Qu.:   5000   
#>  N.blank  :    0     N.blank  :    0     Median :  13280   
#>  Min.nchar:    8     Min.nchar:    8     Mean   :  27032   
#>  Max.nchar:   15     Max.nchar:   15     3rd Qu.:  22000   
#>                                          Max.   :3823531   
#>                                          NAs    :2         
#>  loan_principal_paired_1t2 loan_principal_paired_2t3 loan_principal_last_1t2
#>  Min.   :    200           Min.   :    200           Min.   :      0        
#>  1st Qu.:   5000           1st Qu.:   5000           1st Qu.:   3000        
#>  Median :  15000           Median :  15500           Median :  11000        
#>  Mean   :  28541           Mean   :  32773           Mean   :  23009        
#>  3rd Qu.:  25000           3rd Qu.:  30000           3rd Qu.:  20000        
#>  Max.   :2000000           Max.   :4100000           Max.   :2000000        
#>  NAs    :1                 NAs    :1                                        
#>  loan_principal_last_paired_1t2 loan_principal_last_paired_2t3
#>  Min.   :      0                Min.   :      0               
#>  1st Qu.:   3500                1st Qu.:   2450               
#>  Median :  13000                Median :  11000               
#>  Mean   :  23989                Mean   :  23430               
#>  3rd Qu.:  20000                3rd Qu.:  20000               
#>  Max.   :2000000                Max.   :2000000               
#>                                                               
#>  loan_interest_monthly_1t2 loan_interest_monthly_paired_1t2
#>  Min.   :-1.000000         Min.   :-1.000000               
#>  1st Qu.: 0.003339         1st Qu.: 0.003274               
#>  Median : 0.004868         Median : 0.004844               
#>  Mean   : 0.004857         Mean   : 0.003878               
#>  3rd Qu.: 0.007358         3rd Qu.: 0.006649               
#>  Max.   : 0.414214         Max.   : 0.311488               
#>  NAs    :2                 NAs    :1                       
#>  loan_interest_monthly_paired_2t3    ll_g12l          ll_g12m      
#>  Min.   :-1.000000                Min.   :  1.00   Min.   :  0.00  
#>  1st Qu.: 0.002276                1st Qu.:  4.00   1st Qu.:  0.00  
#>  Median : 0.004492                Median :  9.00   Median :  3.00  
#>  Mean   :-0.061221                Mean   : 11.18   Mean   :  4.08  
#>  3rd Qu.: 0.005938                3rd Qu.: 12.00   3rd Qu.:  6.00  
#>  Max.   : 0.311488                Max.   :147.00   Max.   :122.00  
#>  NAs    :1                                                         
#>     ll_g12r         ll_g23l          ll_g23m           ll_g23r      
#>  Min.   :  0.0   Min.   :  0.00   Min.   :  0.000   Min.   :  1.00  
#>  1st Qu.:  5.0   1st Qu.:  5.00   1st Qu.:  0.000   1st Qu.:  5.00  
#>  Median : 10.0   Median : 10.00   Median :  2.000   Median :  9.00  
#>  Mean   : 11.8   Mean   : 11.87   Mean   :  4.001   Mean   : 11.68  
#>  3rd Qu.: 12.0   3rd Qu.: 12.00   3rd Qu.:  6.000   3rd Qu.: 12.00  
#>  Max.   :148.0   Max.   :137.00   Max.   :130.000   Max.   :154.00  
#>                                                                     
#>      ll_gw1           ll_gw2           ll_gw3           ll_grv       
#>  Min.   :  1.00   Min.   :  0.00   Min.   :  1.00   Min.   :  0.000  
#>  1st Qu.: 11.00   1st Qu.: 11.00   1st Qu.: 11.00   1st Qu.:  1.000  
#>  Median : 12.00   Median : 12.00   Median : 12.00   Median :  5.000  
#>  Mean   : 15.26   Mean   : 15.88   Mean   : 15.68   Mean   :  7.795  
#>  3rd Qu.: 13.00   3rd Qu.: 13.00   3rd Qu.: 13.00   3rd Qu.: 10.000  
#>  Max.   :156.00   Max.   :148.00   Max.   :154.00   Max.   :137.000  
#>                                                                      
#>      ll_gab            ll_gap           ll_gtt       bl_lender_type 
#>  Min.   :  0.000   Min.   :  2.00   Min.   :  2.00   Mode :logical  
#>  1st Qu.:  3.000   1st Qu.: 13.00   1st Qu.: 24.00   FALSE:54844    
#>  Median :  7.000   Median : 17.00   Median : 30.00   TRUE :40063    
#>  Mean   :  8.081   Mean   : 22.86   Mean   : 38.74                  
#>  3rd Qu.: 11.000   3rd Qu.: 24.00   3rd Qu.: 43.00                  
#>  Max.   :133.000   Max.   :159.00   Max.   :159.00                  
#>                                                                     
#>  bl_bridge_informal bl_loan_size    bl_loan_dura_a  bl_loan_dura_b 
#>  Mode :logical      Mode :logical   Mode :logical   Mode :logical  
#>  FALSE:82316        FALSE:54653     FALSE:74409     FALSE:34986    
#>  TRUE :12591        TRUE :40250     TRUE :20498     TRUE :59921    
#>                     NAs  :4                                        
#>                                                                    
#>                                                                    
#>                                                                    
#>  bl_loan_dura_c 
#>  Mode :logical  
#>  FALSE:52791    
#>  TRUE :42116    
#>                 
#>                 
#>                 
#> 

# 1b. All investment vars
ar_ivars <- df_roster_invest2loan2bridge %>%
  ungroup() %>%
  distinct(ivars) %>%
  pull(ivars)
ar_ivars <- c("agg_BS_1011")

# 1c. Select and prep bridges_type file variables
# household id, along with loan id for a, b, c loans uniquely identify each row
# in the `df_loans_bridges_type` file.
# get river, abutment, and approach width (see https://github.com/FanWangEcon/PrjThaiHFID/issues/19)
df_loans_bridges_grvabap <- df_loans_bridges_type %>%
  ungroup() %>%
  select(
    hhid_Num,
    hh_loan_id_nd_1t2,
    hh_loan_id_nd_paired_1t2,
    hh_loan_id_nd_paired_2t3,
    ll_grv, ll_gab, ll_gap
  )
# Share stats
df_loans_bridges_grvabap <- df_loans_bridges_grvabap %>%
  mutate(
    ll_grv_share = ll_grv / (ll_grv + ll_gab + ll_gap),
    ll_gab_share = ll_gab / (ll_grv + ll_gab + ll_gap),
    ll_gap_share = ll_gap / (ll_grv + ll_gab + ll_gap),
  )

# 1d. Merge bridge type with roster file
# filter out NA data and bridge only
df_wrk <- df_roster_invest2loan2bridge %>%
  drop_na(forinfm4) %>%
  drop_na(hh_loan_id_nd_paired_1t2) %>%
  drop_na(hh_loan_id_nd_paired_2t3)
df_wrk <- df_wrk %>%
  left_join(
    df_loans_bridges_grvabap,
    by = (c(
      "hhid_Num" = "hhid_Num",
      "hh_loan_id_nd" = "hh_loan_id_nd_1t2",
      "hh_loan_id_nd_paired_1t2" = "hh_loan_id_nd_paired_1t2",
      "hh_loan_id_nd_paired_2t3" = "hh_loan_id_nd_paired_2t3"
    ))
  )

Generate bridge linkage type classifiers

Generate bridge a-b-c for-inf linkage types, depending on definition of formal and informal.

Print all combinations.

# Loan linkage types, at least the number of bridge by the following categories
# # - single lender whole bridge formal only
# bl_bri_only_baac
# bl_bri_only_vilfund
# # - single lender whole bridge informal only
# bl_bri_only_quasi
# bl_bri_only_informal
# # - has informal but not in the middle of the bridge:
# bl_bri_has_informal but not bl_bridge_informal
# # - has informal in middle of bridge: bl_bridge_informal
# bl_bridge_informal
# # Create four categories above
# All big possible categories
if (verbose) {
  print(glue::glue("f-{it_file_code}, 0bo"))
  print(
    df_wrk %>%
      group_by(
        ivars, forinfm4, forinfm4_paired_1t2, forinfm4_paired_2t3
      ) %>% tally() %>%
      group_by(ivars) %>%
      arrange(desc(n)) %>%
      mutate(share = n / sum(n)),
    n = 250
  )
}
#> f-308063, 0bo
#> # A tibble: 192 × 6
#> # Groups:   ivars [3]
#>     ivars       forinfm4   forinfm4_paired_1t2 forinfm4_paired_2t3     n   share
#>     <chr>       <chr>      <chr>               <chr>               <int>   <dbl>
#>   1 agg_BS_1011 Village-F… Village-Fund        Village-Fund          288 8.92e-2
#>   2 agg_BS_1011 Village-F… Quasi-formal        Village-Fund          263 8.14e-2
#>   3 agg_BS_1011 Quasi-for… Village-Fund        Village-Fund          177 5.48e-2
#>   4 agg_BS_1021 Village-F… Quasi-formal        Village-Fund          173 9.51e-2
#>   5 agg_BS_1012 Village-F… Village-Fund        Village-Fund          169 8.54e-2
#>   6 agg_BS_1012 Village-F… Quasi-formal        Village-Fund          158 7.98e-2
#>   7 agg_BS_1011 Quasi-for… Quasi-formal        Quasi-formal          152 4.71e-2
#>   8 agg_BS_1011 Village-F… Quasi-formal        Quasi-formal          138 4.27e-2
#>   9 agg_BS_1011 Quasi-for… Village-Fund        Quasi-formal          137 4.24e-2
#>  10 agg_BS_1021 Village-F… Village-Fund        Village-Fund          134 7.36e-2
#>  11 agg_BS_1011 BAAC-Comm… Village-Fund        Village-Fund          116 3.59e-2
#>  12 agg_BS_1011 Village-F… Informal            Village-Fund          106 3.28e-2
#>  13 agg_BS_1011 BAAC-Comm… Village-Fund        BAAC-Commercial       104 3.22e-2
#>  14 agg_BS_1012 Quasi-for… Village-Fund        Village-Fund           97 4.90e-2
#>  15 agg_BS_1011 Quasi-for… Quasi-formal        Village-Fund           95 2.94e-2
#>  16 agg_BS_1021 Quasi-for… Village-Fund        Village-Fund           91 5   e-2
#>  17 agg_BS_1012 Quasi-for… Village-Fund        Quasi-formal           88 4.44e-2
#>  18 agg_BS_1012 BAAC-Comm… Village-Fund        Village-Fund           87 4.39e-2
#>  19 agg_BS_1011 Village-F… Village-Fund        Quasi-formal           86 2.66e-2
#>  20 agg_BS_1011 BAAC-Comm… Village-Fund        Quasi-formal           84 2.60e-2
#>  21 agg_BS_1021 Quasi-for… Village-Fund        Quasi-formal           83 4.56e-2
#>  22 agg_BS_1011 BAAC-Comm… Quasi-formal        BAAC-Commercial        78 2.41e-2
#>  23 agg_BS_1021 Village-F… Quasi-formal        Quasi-formal           76 4.18e-2
#>  24 agg_BS_1011 Village-F… Quasi-formal        BAAC-Commercial        75 2.32e-2
#>  25 agg_BS_1021 BAAC-Comm… Village-Fund        Village-Fund           75 4.12e-2
#>  26 agg_BS_1011 Village-F… BAAC-Commercial     Village-Fund           74 2.29e-2
#>  27 agg_BS_1012 BAAC-Comm… Village-Fund        BAAC-Commercial        73 3.69e-2
#>  28 agg_BS_1012 Village-F… Informal            Village-Fund           71 3.59e-2
#>  29 agg_BS_1012 Village-F… Quasi-formal        Quasi-formal           71 3.59e-2
#>  30 agg_BS_1021 Village-F… Informal            Village-Fund           68 3.74e-2
#>  31 agg_BS_1012 Quasi-for… Quasi-formal        Quasi-formal           67 3.38e-2
#>  32 agg_BS_1021 Quasi-for… Quasi-formal        Quasi-formal           66 3.63e-2
#>  33 agg_BS_1012 BAAC-Comm… Village-Fund        Quasi-formal           63 3.18e-2
#>  34 agg_BS_1012 BAAC-Comm… Quasi-formal        BAAC-Commercial        62 3.13e-2
#>  35 agg_BS_1011 BAAC-Comm… Informal            BAAC-Commercial        61 1.89e-2
#>  36 agg_BS_1011 Village-F… Village-Fund        BAAC-Commercial        61 1.89e-2
#>  37 agg_BS_1021 BAAC-Comm… Quasi-formal        BAAC-Commercial        61 3.35e-2
#>  38 agg_BS_1011 BAAC-Comm… Quasi-formal        Quasi-formal           60 1.86e-2
#>  39 agg_BS_1021 Village-F… Quasi-formal        BAAC-Commercial        58 3.19e-2
#>  40 agg_BS_1021 BAAC-Comm… Village-Fund        BAAC-Commercial        57 3.13e-2
#>  41 agg_BS_1021 Village-F… BAAC-Commercial     Village-Fund           57 3.13e-2
#>  42 agg_BS_1021 Quasi-for… Quasi-formal        Village-Fund           55 3.02e-2
#>  43 agg_BS_1012 Quasi-for… Quasi-formal        Village-Fund           54 2.73e-2
#>  44 agg_BS_1012 Village-F… Village-Fund        Quasi-formal           54 2.73e-2
#>  45 agg_BS_1012 Village-F… BAAC-Commercial     Village-Fund           51 2.58e-2
#>  46 agg_BS_1012 Village-F… Quasi-formal        BAAC-Commercial        51 2.58e-2
#>  47 agg_BS_1011 Informal   Village-Fund        Village-Fund           49 1.52e-2
#>  48 agg_BS_1011 BAAC-Comm… BAAC-Commercial     BAAC-Commercial        48 1.49e-2
#>  49 agg_BS_1011 Quasi-for… BAAC-Commercial     Quasi-formal           48 1.49e-2
#>  50 agg_BS_1021 BAAC-Comm… Village-Fund        Quasi-formal           48 2.64e-2
#>  51 agg_BS_1011 Quasi-for… BAAC-Commercial     Village-Fund           45 1.39e-2
#>  52 agg_BS_1012 BAAC-Comm… Quasi-formal        Quasi-formal           43 2.17e-2
#>  53 agg_BS_1011 BAAC-Comm… Quasi-formal        Village-Fund           42 1.30e-2
#>  54 agg_BS_1011 Village-F… BAAC-Commercial     BAAC-Commercial        42 1.30e-2
#>  55 agg_BS_1011 Quasi-for… Quasi-formal        BAAC-Commercial        40 1.24e-2
#>  56 agg_BS_1021 BAAC-Comm… Quasi-formal        Quasi-formal           40 2.20e-2
#>  57 agg_BS_1012 Village-F… Village-Fund        BAAC-Commercial        39 1.97e-2
#>  58 agg_BS_1011 Informal   Quasi-formal        Quasi-formal           38 1.18e-2
#>  59 agg_BS_1012 Quasi-for… BAAC-Commercial     Quasi-formal           38 1.92e-2
#>  60 agg_BS_1012 Quasi-for… BAAC-Commercial     Village-Fund           38 1.92e-2
#>  61 agg_BS_1011 Quasi-for… BAAC-Commercial     BAAC-Commercial        37 1.15e-2
#>  62 agg_BS_1021 Village-F… Village-Fund        Quasi-formal           37 2.03e-2
#>  63 agg_BS_1011 Informal   Informal            Informal               36 1.11e-2
#>  64 agg_BS_1011 Informal   Quasi-formal        Village-Fund           34 1.05e-2
#>  65 agg_BS_1012 Informal   Village-Fund        Village-Fund           33 1.67e-2
#>  66 agg_BS_1011 Informal   Village-Fund        Quasi-formal           32 9.91e-3
#>  67 agg_BS_1012 BAAC-Comm… Quasi-formal        Village-Fund           32 1.62e-2
#>  68 agg_BS_1011 Village-F… BAAC-Commercial     Quasi-formal           31 9.60e-3
#>  69 agg_BS_1012 BAAC-Comm… BAAC-Commercial     BAAC-Commercial        31 1.57e-2
#>  70 agg_BS_1021 Village-F… Village-Fund        BAAC-Commercial        31 1.70e-2
#>  71 agg_BS_1021 Quasi-for… BAAC-Commercial     Village-Fund           30 1.65e-2
#>  72 agg_BS_1012 BAAC-Comm… Informal            BAAC-Commercial        29 1.46e-2
#>  73 agg_BS_1012 Quasi-for… BAAC-Commercial     BAAC-Commercial        29 1.46e-2
#>  74 agg_BS_1021 Quasi-for… Village-Fund        BAAC-Commercial        29 1.59e-2
#>  75 agg_BS_1011 Quasi-for… Village-Fund        BAAC-Commercial        28 8.67e-3
#>  76 agg_BS_1012 Quasi-for… Quasi-formal        BAAC-Commercial        28 1.41e-2
#>  77 agg_BS_1021 BAAC-Comm… Quasi-formal        Village-Fund           28 1.54e-2
#>  78 agg_BS_1021 Quasi-for… BAAC-Commercial     Quasi-formal           28 1.54e-2
#>  79 agg_BS_1021 Quasi-for… Quasi-formal        BAAC-Commercial        28 1.54e-2
#>  80 agg_BS_1011 Quasi-for… Informal            Quasi-formal           27 8.36e-3
#>  81 agg_BS_1021 Village-F… BAAC-Commercial     BAAC-Commercial        27 1.48e-2
#>  82 agg_BS_1011 BAAC-Comm… Informal            Quasi-formal           26 8.05e-3
#>  83 agg_BS_1012 Village-F… BAAC-Commercial     BAAC-Commercial        26 1.31e-2
#>  84 agg_BS_1011 BAAC-Comm… BAAC-Commercial     Village-Fund           25 7.74e-3
#>  85 agg_BS_1011 Quasi-for… Village-Fund        Informal               25 7.74e-3
#>  86 agg_BS_1011 BAAC-Comm… BAAC-Commercial     Quasi-formal           24 7.43e-3
#>  87 agg_BS_1011 Village-F… Informal            BAAC-Commercial        24 7.43e-3
#>  88 agg_BS_1012 Quasi-for… Village-Fund        BAAC-Commercial        24 1.21e-2
#>  89 agg_BS_1021 Quasi-for… BAAC-Commercial     BAAC-Commercial        24 1.32e-2
#>  90 agg_BS_1011 Informal   Informal            Quasi-formal           23 7.12e-3
#>  91 agg_BS_1021 BAAC-Comm… BAAC-Commercial     BAAC-Commercial        23 1.26e-2
#>  92 agg_BS_1021 Informal   Village-Fund        Village-Fund           23 1.26e-2
#>  93 agg_BS_1011 Informal   Quasi-formal        BAAC-Commercial        22 6.81e-3
#>  94 agg_BS_1011 Village-F… Informal            Quasi-formal           22 6.81e-3
#>  95 agg_BS_1012 Informal   Informal            Informal               22 1.11e-2
#>  96 agg_BS_1011 BAAC-Comm… Informal            Informal               21 6.50e-3
#>  97 agg_BS_1011 BAAC-Comm… Informal            Village-Fund           21 6.50e-3
#>  98 agg_BS_1011 Quasi-for… Informal            Village-Fund           21 6.50e-3
#>  99 agg_BS_1012 BAAC-Comm… BAAC-Commercial     Village-Fund           21 1.06e-2
#> 100 agg_BS_1021 BAAC-Comm… Informal            BAAC-Commercial        21 1.15e-2
#> 101 agg_BS_1011 Village-F… Informal            Informal               20 6.19e-3
#> 102 agg_BS_1012 BAAC-Comm… BAAC-Commercial     Quasi-formal           20 1.01e-2
#> 103 agg_BS_1012 Village-F… BAAC-Commercial     Quasi-formal           20 1.01e-2
#> 104 agg_BS_1011 Informal   Informal            Village-Fund           19 5.88e-3
#> 105 agg_BS_1011 Village-F… Quasi-formal        Informal               19 5.88e-3
#> 106 agg_BS_1021 Quasi-for… Village-Fund        Informal               19 1.04e-2
#> 107 agg_BS_1021 Village-F… BAAC-Commercial     Quasi-formal           18 9.89e-3
#> 108 agg_BS_1011 BAAC-Comm… Quasi-formal        Informal               17 5.26e-3
#> 109 agg_BS_1021 BAAC-Comm… BAAC-Commercial     Village-Fund           17 9.34e-3
#> 110 agg_BS_1021 BAAC-Comm… Quasi-formal        Informal               17 9.34e-3
#> 111 agg_BS_1021 Village-F… Quasi-formal        Informal               17 9.34e-3
#> 112 agg_BS_1011 Informal   Village-Fund        BAAC-Commercial        16 4.95e-3
#> 113 agg_BS_1011 Informal   Village-Fund        Informal               16 4.95e-3
#> 114 agg_BS_1011 Quasi-for… Informal            Informal               16 4.95e-3
#> 115 agg_BS_1012 BAAC-Comm… Quasi-formal        Informal               16 8.08e-3
#> 116 agg_BS_1012 Informal   Quasi-formal        Village-Fund           16 8.08e-3
#> 117 agg_BS_1021 BAAC-Comm… BAAC-Commercial     Quasi-formal           16 8.79e-3
#> 118 agg_BS_1011 Village-F… Village-Fund        Informal               15 4.64e-3
#> 119 agg_BS_1012 Quasi-for… Village-Fund        Informal               15 7.58e-3
#> 120 agg_BS_1021 Informal   Quasi-formal        Village-Fund           15 8.24e-3
#> 121 agg_BS_1011 Informal   Quasi-formal        Informal               14 4.33e-3
#> 122 agg_BS_1011 Quasi-for… Quasi-formal        Informal               14 4.33e-3
#> 123 agg_BS_1012 Informal   Quasi-formal        BAAC-Commercial        14 7.07e-3
#> 124 agg_BS_1021 Informal   Informal            Informal               14 7.69e-3
#> 125 agg_BS_1021 Informal   Quasi-formal        BAAC-Commercial        14 7.69e-3
#> 126 agg_BS_1021 Informal   Quasi-formal        Informal               14 7.69e-3
#> 127 agg_BS_1011 BAAC-Comm… Village-Fund        Informal               13 4.02e-3
#> 128 agg_BS_1012 Informal   Village-Fund        Informal               13 6.57e-3
#> 129 agg_BS_1021 Informal   Quasi-formal        Quasi-formal           13 7.14e-3
#> 130 agg_BS_1011 Informal   BAAC-Commercial     BAAC-Commercial        12 3.72e-3
#> 131 agg_BS_1012 BAAC-Comm… Informal            Quasi-formal           12 6.06e-3
#> 132 agg_BS_1012 BAAC-Comm… Informal            Village-Fund           12 6.06e-3
#> 133 agg_BS_1012 Informal   Village-Fund        Quasi-formal           12 6.06e-3
#> 134 agg_BS_1012 Village-F… Village-Fund        Informal               12 6.06e-3
#> 135 agg_BS_1021 Informal   Village-Fund        BAAC-Commercial        12 6.59e-3
#> 136 agg_BS_1021 Village-F… Village-Fund        Informal               12 6.59e-3
#> 137 agg_BS_1012 Informal   Informal            Quasi-formal           11 5.56e-3
#> 138 agg_BS_1012 Informal   Quasi-formal        Quasi-formal           11 5.56e-3
#> 139 agg_BS_1012 Informal   Village-Fund        BAAC-Commercial        11 5.56e-3
#> 140 agg_BS_1012 Informal   Informal            Village-Fund           10 5.05e-3
#> 141 agg_BS_1012 Village-F… Informal            BAAC-Commercial        10 5.05e-3
#> 142 agg_BS_1012 Village-F… Informal            Quasi-formal           10 5.05e-3
#> 143 agg_BS_1021 Informal   Village-Fund        Quasi-formal           10 5.49e-3
#> 144 agg_BS_1021 Quasi-for… Quasi-formal        Informal               10 5.49e-3
#> 145 agg_BS_1011 BAAC-Comm… BAAC-Commercial     Informal                9 2.79e-3
#> 146 agg_BS_1011 Informal   BAAC-Commercial     Village-Fund            9 2.79e-3
#> 147 agg_BS_1011 Informal   Informal            BAAC-Commercial         9 2.79e-3
#> 148 agg_BS_1012 Village-F… Quasi-formal        Informal                9 4.55e-3
#> 149 agg_BS_1021 BAAC-Comm… Informal            Quasi-formal            9 4.95e-3
#> 150 agg_BS_1021 Quasi-for… Informal            Quasi-formal            9 4.95e-3
#> 151 agg_BS_1012 BAAC-Comm… Informal            Informal                8 4.04e-3
#> 152 agg_BS_1012 BAAC-Comm… Village-Fund        Informal                8 4.04e-3
#> 153 agg_BS_1012 Informal   Quasi-formal        Informal                8 4.04e-3
#> 154 agg_BS_1012 Quasi-for… Informal            Informal                8 4.04e-3
#> 155 agg_BS_1012 Quasi-for… Informal            Quasi-formal            8 4.04e-3
#> 156 agg_BS_1012 Quasi-for… Informal            Village-Fund            8 4.04e-3
#> 157 agg_BS_1021 BAAC-Comm… Informal            Village-Fund            8 4.40e-3
#> 158 agg_BS_1021 BAAC-Comm… Village-Fund        Informal                8 4.40e-3
#> 159 agg_BS_1021 Informal   Village-Fund        Informal                8 4.40e-3
#> 160 agg_BS_1021 Village-F… Informal            BAAC-Commercial         8 4.40e-3
#> 161 agg_BS_1011 Informal   BAAC-Commercial     Quasi-formal            7 2.17e-3
#> 162 agg_BS_1011 Village-F… BAAC-Commercial     Informal                7 2.17e-3
#> 163 agg_BS_1012 Quasi-for… Quasi-formal        Informal                7 3.54e-3
#> 164 agg_BS_1012 Village-F… Informal            Informal                7 3.54e-3
#> 165 agg_BS_1021 BAAC-Comm… Informal            Informal                7 3.85e-3
#> 166 agg_BS_1021 Informal   BAAC-Commercial     BAAC-Commercial         7 3.85e-3
#> 167 agg_BS_1021 Quasi-for… Informal            BAAC-Commercial         7 3.85e-3
#> 168 agg_BS_1021 Quasi-for… Informal            Informal                7 3.85e-3
#> 169 agg_BS_1021 Village-F… Informal            Informal                7 3.85e-3
#> 170 agg_BS_1021 Village-F… Informal            Quasi-formal            7 3.85e-3
#> 171 agg_BS_1021 Informal   Informal            Quasi-formal            6 3.30e-3
#> 172 agg_BS_1021 Quasi-for… BAAC-Commercial     Informal                6 3.30e-3
#> 173 agg_BS_1021 Quasi-for… Informal            Village-Fund            6 3.30e-3
#> 174 agg_BS_1011 Quasi-for… BAAC-Commercial     Informal                5 1.55e-3
#> 175 agg_BS_1011 Quasi-for… Informal            BAAC-Commercial         5 1.55e-3
#> 176 agg_BS_1012 BAAC-Comm… BAAC-Commercial     Informal                5 2.53e-3
#> 177 agg_BS_1012 Informal   BAAC-Commercial     BAAC-Commercial         5 2.53e-3
#> 178 agg_BS_1012 Informal   BAAC-Commercial     Village-Fund            5 2.53e-3
#> 179 agg_BS_1012 Quasi-for… BAAC-Commercial     Informal                5 2.53e-3
#> 180 agg_BS_1021 Village-F… BAAC-Commercial     Informal                5 2.75e-3
#> 181 agg_BS_1012 Informal   BAAC-Commercial     Quasi-formal            4 2.02e-3
#> 182 agg_BS_1012 Quasi-for… Informal            BAAC-Commercial         4 2.02e-3
#> 183 agg_BS_1021 Informal   BAAC-Commercial     Informal                4 2.20e-3
#> 184 agg_BS_1012 Village-F… BAAC-Commercial     Informal                3 1.52e-3
#> 185 agg_BS_1021 Informal   BAAC-Commercial     Village-Fund            3 1.65e-3
#> 186 agg_BS_1021 Informal   Informal            Village-Fund            3 1.65e-3
#> 187 agg_BS_1011 Informal   BAAC-Commercial     Informal                2 6.19e-4
#> 188 agg_BS_1012 Informal   BAAC-Commercial     Informal                2 1.01e-3
#> 189 agg_BS_1012 Informal   Informal            BAAC-Commercial         2 1.01e-3
#> 190 agg_BS_1021 BAAC-Comm… BAAC-Commercial     Informal                2 1.10e-3
#> 191 agg_BS_1021 Informal   BAAC-Commercial     Quasi-formal            2 1.10e-3
#> 192 agg_BS_1021 Informal   Informal            BAAC-Commercial         2 1.10e-3

Generate categories.

# 2a. Core triple definition structures redefine formal and informal
# see: file:///C:/Users/fan/UH-ECON%20Dropbox/Fan%20Wang/PrjThaiForInf/PrjThaiHFID/docs/reference/df_roster_invest2loan2bridge.html
# Types of formal and informal linkages:
# 1. formal - formal - formal
# 2. formal - formal - informal
# 3. formal - informal - formal
# 4. formal - informal - informal
# 5. informal - formal - formal
# 6. informal - formal - informal
# 7. informal - informal - formal
# 8. informal - informal - informal
# Grouping the categories above together:
# (a) formal only: 1
# (b) informal only: 8
# (c) informal only middle: 3, meaning informal used as transition from formal to formal
# (d) informal middle +: 4 + 7, meaning informal still used as transition, but transitioning to informal again (informal includes quasiformal)
# (e) formal as transition: 2 + 5 + 6
# d1m8c1: definition 1, multiple categories totalling 8, category 1
# Generate the following variables:
# st_bridge_forinf_d1m8, st_bridge_forinf_d1m5,
# st_bridge_forinf_d2m8, st_bridge_forinf_d2m5,
# st_bridge_forinf_d3m8, st_bridge_forinf_d3m5,
for (it_def in c(1, 2, 3)) {
  if (it_def == 1) {
    ar_for <- c("BAAC-Commercial", "Village-Fund")
    ar_inf <- c("Informal", "Quasi-formal")
  } else if (it_def == 2) {
    ar_for <- c("BAAC-Commercial")
    ar_inf <- c("Village-Fund", "Informal", "Quasi-formal")
  } else if (it_def == 3) {
    ar_for <- c("BAAC-Commercial", "Village-Fund", "Quasi-formal")
    ar_inf <- c("Informal")
  }
  st_var_name_m5 <- paste0("st_bridge_forinf_d", it_def, "m5")
  df_wrk <- df_wrk %>% mutate(
    !!sym(st_var_name_m5) := case_when(
      forinfm4 %in% ar_for & forinfm4_paired_1t2 %in% ar_for & forinfm4_paired_2t3 %in% ar_for ~ "f-f-f",
      forinfm4 %in% ar_for & forinfm4_paired_1t2 %in% ar_for & forinfm4_paired_2t3 %in% ar_inf ~ "f-mid",
      forinfm4 %in% ar_for & forinfm4_paired_1t2 %in% ar_inf & forinfm4_paired_2t3 %in% ar_for ~ "f-i-f",
      forinfm4 %in% ar_for & forinfm4_paired_1t2 %in% ar_inf & forinfm4_paired_2t3 %in% ar_inf ~ "i-mid-i2",
      forinfm4 %in% ar_inf & forinfm4_paired_1t2 %in% ar_for & forinfm4_paired_2t3 %in% ar_for ~ "f-mid",
      forinfm4 %in% ar_inf & forinfm4_paired_1t2 %in% ar_for & forinfm4_paired_2t3 %in% ar_inf ~ "f-mid",
      forinfm4 %in% ar_inf & forinfm4_paired_1t2 %in% ar_inf & forinfm4_paired_2t3 %in% ar_for ~ "i-mid-i2",
      forinfm4 %in% ar_inf & forinfm4_paired_1t2 %in% ar_inf & forinfm4_paired_2t3 %in% ar_inf ~ "i-i-i",
    ),
  )
}

# 2b. Select variables for analysis
# select relevant variables of type and length
df_wrk_sel <- df_wrk %>%
  select(
    hhid_Num, ivars, hh_inv_asset_ctr,
    bl_bridge_informal,
    st_bridge_forinf_d1m5,
    hh_loan_id_nd, hh_loan_id_nd_paired_1t2, hh_loan_id_nd_paired_2t3,
    forinfm4, forinfm4_paired_1t2, forinfm4_paired_2t3,
    loan_start, loan_end,
    loan_start_paired_1t2, loan_end_paired_1t2,
    loan_start_paired_2t3, loan_end_paired_2t3,
    ll_grv, ll_gab, ll_gap,
    ll_grv_share, ll_gab_share, ll_gap_share
  )
if (verbose) {
  print(glue::glue("f-{it_file_code}, a1"))
  print(glue::glue("colnames: {colnames(df_wrk_sel)}"))
  print(glue::glue("df_wrk dim: {dim(df_wrk)}"))
  print(
    df_wrk,
    n = it_row_print
  )
  print(glue::glue("f-{it_file_code}, a2-bag:"))
  print(glue::glue("colnames: {colnames(df_wrk_sel)}"))
  print(glue::glue("df_wrk dim: {dim(df_wrk)}"))
  print(
    df_wrk %>% filter(ll_grv < 0),
    n = it_row_print
  )
}
#> f-308063, a1
#> colnames: hhid_Num
#> colnames: ivars
#> colnames: hh_inv_asset_ctr
#> colnames: bl_bridge_informal
#> colnames: st_bridge_forinf_d1m5
#> colnames: hh_loan_id_nd
#> colnames: hh_loan_id_nd_paired_1t2
#> colnames: hh_loan_id_nd_paired_2t3
#> colnames: forinfm4
#> colnames: forinfm4_paired_1t2
#> colnames: forinfm4_paired_2t3
#> colnames: loan_start
#> colnames: loan_end
#> colnames: loan_start_paired_1t2
#> colnames: loan_end_paired_1t2
#> colnames: loan_start_paired_2t3
#> colnames: loan_end_paired_2t3
#> colnames: ll_grv
#> colnames: ll_gab
#> colnames: ll_gap
#> colnames: ll_grv_share
#> colnames: ll_gab_share
#> colnames: ll_gap_share
#> df_wrk dim: 7030
#> df_wrk dim: 100
#> # A tibble: 7,030 × 100
#> # Groups:   hhid_Num, ivars, hh_inv_asset_ctr [1,383]
#>    hhid_Num ivars    hh_inv_asset_ctr forinfm4 hh_loan_id_nd forinfm4_paired_1t2
#>       <int> <chr>               <int> <chr>            <int> <chr>              
#>  1     1031 agg_BS_…                2 Quasi-f…            23 Quasi-formal       
#>  2     1099 agg_BS_…                2 Village…            77 Village-Fund       
#>  3     1099 agg_BS_…                1 Village…            77 Village-Fund       
#>  4     1099 agg_BS_…                1 Village…            77 Village-Fund       
#>  5     1123 agg_BS_…                1 BAAC-Co…           134 Quasi-formal       
#>  6     1123 agg_BS_…                2 Quasi-f…           139 Village-Fund       
#>  7     1123 agg_BS_…                2 Quasi-f…           139 Village-Fund       
#>  8     1123 agg_BS_…                2 Quasi-f…           139 BAAC-Commercial    
#>  9     1123 agg_BS_…                2 Village…           140 Village-Fund       
#> 10     1123 agg_BS_…                2 Village…           140 BAAC-Commercial    
#> 11     1123 agg_BS_…                4 BAAC-Co…           153 Village-Fund       
#> 12     1123 agg_BS_…                2 BAAC-Co…           153 Village-Fund       
#> 13     1133 agg_BS_…                1 Village…           163 Village-Fund       
#> 14     1133 agg_BS_…                1 Village…           163 Village-Fund       
#> 15     1133 agg_BS_…                1 Quasi-f…           164 Quasi-formal       
#> 16     1133 agg_BS_…                1 Quasi-f…           164 Village-Fund       
#> 17     1133 agg_BS_…                1 Quasi-f…           164 Village-Fund       
#> 18     1133 agg_BS_…                1 Quasi-f…           164 Village-Fund       
#> 19     1133 agg_BS_…                2 Quasi-f…           175 Quasi-formal       
#> 20     1133 agg_BS_…                2 Quasi-f…           175 Quasi-formal       
#> 21     1133 agg_BS_…                2 Quasi-f…           176 Quasi-formal       
#> 22     1133 agg_BS_…                2 Quasi-f…           176 Quasi-formal       
#> 23     1133 agg_BS_…                2 Quasi-f…           177 Quasi-formal       
#> 24     1133 agg_BS_…                2 Quasi-f…           177 Quasi-formal       
#> 25     1133 agg_BS_…                1 Quasi-f…           175 Quasi-formal       
#> 26     1133 agg_BS_…                1 Quasi-f…           175 Quasi-formal       
#> 27     1133 agg_BS_…                1 Quasi-f…           176 Quasi-formal       
#> 28     1133 agg_BS_…                1 Quasi-f…           176 Quasi-formal       
#> 29     1133 agg_BS_…                1 Quasi-f…           177 Quasi-formal       
#> 30     1133 agg_BS_…                1 Quasi-f…           177 Quasi-formal       
#> 31     1133 agg_BS_…                1 Quasi-f…           178 Quasi-formal       
#> 32     1133 agg_BS_…                1 Quasi-f…           178 Quasi-formal       
#> 33     1133 agg_BS_…                1 Quasi-f…           175 Quasi-formal       
#> 34     1133 agg_BS_…                1 Quasi-f…           175 Quasi-formal       
#> 35     1133 agg_BS_…                1 Quasi-f…           176 Quasi-formal       
#> 36     1133 agg_BS_…                1 Quasi-f…           176 Quasi-formal       
#> 37     1133 agg_BS_…                1 Quasi-f…           177 Quasi-formal       
#> 38     1133 agg_BS_…                1 Quasi-f…           177 Quasi-formal       
#> 39     1133 agg_BS_…                1 Quasi-f…           178 Quasi-formal       
#> 40     1133 agg_BS_…                1 Quasi-f…           178 Quasi-formal       
#> 41     1167 agg_BS_…                1 Quasi-f…           227 Village-Fund       
#> 42     1167 agg_BS_…                1 Quasi-f…           227 Village-Fund       
#> 43     1167 agg_BS_…                1 Quasi-f…           227 Village-Fund       
#> 44     1167 agg_BS_…                1 Quasi-f…           227 Village-Fund       
#> 45     1167 agg_BS_…                1 Quasi-f…           227 Village-Fund       
#> 46     1167 agg_BS_…                1 Quasi-f…           227 Village-Fund       
#> 47     1167 agg_BS_…                1 Quasi-f…           227 Village-Fund       
#> 48     1167 agg_BS_…                1 Quasi-f…           227 Village-Fund       
#> 49     1167 agg_BS_…                1 Informal           229 Village-Fund       
#> 50     1167 agg_BS_…                1 Informal           229 Village-Fund       
#> # ℹ 6,980 more rows
#> # ℹ 94 more variables: hh_loan_id_nd_paired_1t2 <int>,
#> #   forinfm4_paired_2t3 <chr>, hh_loan_id_nd_paired_2t3 <int>,
#> #   mth_inv_start <dbl>, mth_inv_end <dbl>, loan_start <dbl>, loan_end <dbl>,
#> #   loan_start_paired_1t2 <dbl>, loan_end_paired_1t2 <dbl>,
#> #   loan_start_paired_2t3 <dbl>, loan_end_paired_2t3 <dbl>,
#> #   capital_prior <dbl>, capital_end <dbl>, capital_invest <dbl>, …
#> f-308063, a2-bag:
#> colnames: hhid_Num
#> colnames: ivars
#> colnames: hh_inv_asset_ctr
#> colnames: bl_bridge_informal
#> colnames: st_bridge_forinf_d1m5
#> colnames: hh_loan_id_nd
#> colnames: hh_loan_id_nd_paired_1t2
#> colnames: hh_loan_id_nd_paired_2t3
#> colnames: forinfm4
#> colnames: forinfm4_paired_1t2
#> colnames: forinfm4_paired_2t3
#> colnames: loan_start
#> colnames: loan_end
#> colnames: loan_start_paired_1t2
#> colnames: loan_end_paired_1t2
#> colnames: loan_start_paired_2t3
#> colnames: loan_end_paired_2t3
#> colnames: ll_grv
#> colnames: ll_gab
#> colnames: ll_gap
#> colnames: ll_grv_share
#> colnames: ll_gab_share
#> colnames: ll_gap_share
#> df_wrk dim: 7030
#> df_wrk dim: 100
#> # A tibble: 0 × 100
#> # Groups:   hhid_Num, ivars, hh_inv_asset_ctr [0]
#> # ℹ 100 variables: hhid_Num <int>, ivars <chr>, hh_inv_asset_ctr <int>,
#> #   forinfm4 <chr>, hh_loan_id_nd <int>, forinfm4_paired_1t2 <chr>,
#> #   hh_loan_id_nd_paired_1t2 <int>, forinfm4_paired_2t3 <chr>,
#> #   hh_loan_id_nd_paired_2t3 <int>, mth_inv_start <dbl>, mth_inv_end <dbl>,
#> #   loan_start <dbl>, loan_end <dbl>, loan_start_paired_1t2 <dbl>,
#> #   loan_end_paired_1t2 <dbl>, loan_start_paired_2t3 <dbl>,
#> #   loan_end_paired_2t3 <dbl>, capital_prior <dbl>, capital_end <dbl>, …

Sub-selecting dataframe for analysis

Generate data subset using a particular asset variable definition and focused on a particular subset of bridge types.

st_asset_var <- "agg_BS_1011"
# file A
df_wrk_sel_use_bs1011_fif <- df_wrk_sel %>% filter(
  ivars == st_asset_var,
  st_bridge_forinf_d1m5 == "f-i-f"
)
# file B
df_wrk_sel_use_bs1011_fifimidi2 <- df_wrk_sel %>% filter(
  ivars == st_asset_var,
  st_bridge_forinf_d1m5 == "f-i-f" | st_bridge_forinf_d1m5 == "i-mid-i2"
)
# Combine files to list
ls_dataframes_names <- c("bs1011fif", "bs1011fifimidi2")
ls_dataframes <- list(df_wrk_sel_use_bs1011_fif, df_wrk_sel_use_bs1011_fifimidi2)
# ar_st_forinf_groups <- df_wrk_sel %>% ungroup() %>% distinct(st_bridge_forinf_d1m5) %>% pull(st_bridge_forinf_d1m5)
# Length-5 is just a hint; `[[it_df_ctr]] <-` auto-extends both the list and
# the atomic character vectors when the counter exceeds 5 (assignment grows
# them, it does not error), so adding group variants below is safe.
ls_dataframes <- vector(mode = "list", length = 5)
ls_dataframes_names <- vector(mode = "character", length = 5)
ls_dataframes_notes <- vector(mode = "character", length = 5)
it_df_ctr <- 0
# consider different constructions
ar_st_asset_var <- c("agg_BS_1011")
for (st_asset_var in ar_st_asset_var) {
  ar_st_bridge_forinf <- c("st_bridge_forinf_d1m5", "st_bridge_forinf_d2m5", "st_bridge_forinf_d3m5")
  # Compare the loop variable, not the whole `ar_st_asset_var` vector: an
  # `if()` on a length>1 condition errors in R >= 4.2, so this stays correct
  # if more asset variables are added to `ar_st_asset_var` later.
  if (st_asset_var == "agg_BS_1011") {
    ar_st_bridge_forinf <- c("st_bridge_forinf_d1m5")
  }
  for (st_bridge_forinf in ar_st_bridge_forinf) {
    ar_st_forinf_groups <- c("i-i-i", "f-i-f", "f-f-f", "f-mid", "i-mid-i2")
    if (st_bridge_forinf == "st_bridge_forinf_d1m5") {
      ar_st_forinf_groups <- c(
        "all_groups",
        "i-i-i", "f-i-f", "f-f-f",
        "f-mid", "i-mid-i2"
      )
    }
    for (st_forinf_groups in ar_st_forinf_groups) {
      it_df_ctr <- it_df_ctr + 1
      if (st_forinf_groups == "all_groups") {
        df_wrk_sel_use <- df_wrk_sel %>% filter(
          ivars == st_asset_var
        )
      } else {
        df_wrk_sel_use <- df_wrk_sel %>% filter(
          ivars == st_asset_var,
          !!sym(st_bridge_forinf) == st_forinf_groups
        )
      }
      ls_dataframes[[it_df_ctr]] <- df_wrk_sel_use
      ls_dataframes_names[[it_df_ctr]] <- paste0(st_asset_var, "_", st_bridge_forinf, "_", st_forinf_groups)
      ls_dataframes_notes[[it_df_ctr]] <- paste0(
        "Asset = ", st_asset_var, ", ",
        "Bridge-var = ", st_bridge_forinf, ", ",
        "Bridge-linkage = ", st_forinf_groups
      )
    }
  }
}

Construct bridge ID, common start (at 1), and 5 segmented bridge components

Construct:

  1. Bridge ID, index_bridge_rvabap_sorted: these are the sorted index from 1 through N of the number of bridges this particular subset of data contains, these index will be used as values along the y-axis for visualization.
  2. common start, loan_start_a, loan_end_a, etc: these set the start month to 1, so that when visualized, all bridges start at the same x-axis value of 1.
  3. 5 segmented bridge components, loan5seg_start_s1, loan5seg_end_s1, etc: these are the start and end of each of the 5 segments of the bridge, the 1st and 5th are non-overlapping components of A and C, 2nd and 4th are overlapping components of A and C with B, and the 3rd is the non-overlapping segment of loan B.

Note: the Bridge ID sorts loans: ll_grv, ll_gab, ll_gap is the sorting order below, this is how the index is organized, “river” length first, “gab” (Abutment) second, “gap” (approach) third. See Issue-19 for definitions of river, abutment, and approach.

#' @title Generate Bridge ID and five segments, internal visualizer.
#' @description This function processes a dataframe to generate bridge ID segments for visualization.
#' @param df_wrk_sel A dataframe containing the working selection of data conditional on investment type and subset of bridge types.
#' @param fl_mth_start_shift A numeric value to shift the start month (default is -0.5) for visualization, otherwise 1 month loan does not appear.
#' @param fl_mth_end_shift A numeric value to shift the end month (default is 0.5) for visualization, otherwise 1 month loan does not appear.
#' @return A dataframe with bridge ID segments and additional columns for visualization.
#' @details
#' The function performs the following steps:
#' 1. Generates a bridge index sorted by specific columns and assigns a unique index to each bridge row.
#' 2. Adjusts the start and end month values for different loan periods.
#' 3. Constructs five segments for each bridge and reshapes the dataframe to a long format.
#' 4. Shifts the month values for the start and end of each segment.
#' 5. Generates a group ID for each of the five segments for each bridge.
#' @examples
#' \dontrun{
#' df_result <- ffi_bridge_id_segments(df_wrk_sel)
#' }
ffi_bridge_id_segments <- function(
    df_wrk_sel,
    fl_mth_start_shift = -0.5,
    fl_mth_end_shift = 0.5) {
  # 3a. Generate bridge index sorted by rv ab ap
  # sort ignoring household, but bridge component length only
  # each bridge row should get its own index
  # `index_bridge_rvabap_sorted` is the bridge index, to be plotted along y-axis
  # sorting below decides how bridges are displayed
  df_wrk_sel_use <- df_wrk_sel %>%
    ungroup() %>%
    arrange(
      ll_grv, ll_gab, ll_gap,
      hhid_Num, ivars
    ) %>%
    mutate(index_bridge_rvabap_sorted = row_number())

  # 3b. x-val month start or end, all months start at 1
  df_wrk_vis <- df_wrk_sel_use %>%
    rename(
      loan_start_a = loan_start, loan_end_a = loan_end,
      loan_start_b = loan_start_paired_1t2, loan_end_b = loan_end_paired_1t2,
      loan_start_c = loan_start_paired_2t3, loan_end_c = loan_end_paired_2t3
    ) %>%
    mutate(
      loan_end_a = loan_end_a - loan_start_a + 1,
      loan_start_b = loan_start_b - loan_start_a + 1,
      loan_end_b = loan_end_b - loan_start_a + 1,
      loan_start_c = loan_start_c - loan_start_a + 1,
      loan_end_c = loan_end_c - loan_start_a + 1,
      loan_start_a = loan_start_a - loan_start_a + 1
    )

  # 3c. Construct five segments
  df_wrk_vis_5seg_long <- df_wrk_vis %>%
    mutate(
      loan5seg_start_s1 = loan_start_a,
      loan5seg_end_s1 = loan_start_b,
      loan5seg_start_s2 = loan_start_b,
      loan5seg_end_s2 = loan_end_a,
      loan5seg_start_s3 = loan_end_a,
      loan5seg_end_s3 = loan_start_c,
      loan5seg_start_s4 = loan_start_c,
      loan5seg_end_s4 = loan_end_b,
      loan5seg_start_s5 = loan_end_b,
      loan5seg_end_s5 = loan_end_c
    ) %>%
    select(-contains("loan_start"), -contains("loan_end")) %>%
    pivot_longer(
      cols = starts_with("loan5seg"),
      names_to = c("time", "segment"),
      names_pattern = paste0("loan5seg_(.*)_(.*)"),
      values_to = "month"
    ) %>%
    mutate(month = case_when(
      time == "start" ~ month + fl_mth_start_shift,
      time == "end" ~ month + fl_mth_end_shift
    ))

  # 3e Generate group ID for each of the 5 segments for each of the bridge
  df_wrk_vis_5seg_long <- df_wrk_vis_5seg_long %>%
    group_by(hhid_Num, ivars, index_bridge_rvabap_sorted, segment) %>%
    mutate(graph_group = cur_group_id())
}

Use function over generated datasets prior.

ls_dataframes_prc <- vector(mode = "list", length = length(ls_dataframes))
it_file_ctr <- 0
for (df_dataframe in ls_dataframes) {
  it_file_ctr <- it_file_ctr + 1
  df_wrk_sel_prc <- ffi_bridge_id_segments(
    df_dataframe,
    fl_mth_start_shift = -0.5,
    fl_mth_end_shift = 0.5
  )
  ls_dataframes_prc[[it_file_ctr]] <- df_wrk_sel_prc
}
names(ls_dataframes_prc) <- ls_dataframes_names

Generate visualizations

Coloring, legend, and axis labels and options.

# Labels
x_min <- 0
x_max <- 60
x_breaks <- c(
  0,
  6,
  12,
  18,
  24,
  30,
  36,
  48,
  60
)
# colors
ar_st_colours <- c(
  "red",
  "#f28383",
  "blue",
  "#e8ad84",
  "#994205"
)
# Line types
ar_st_linetypes <- c("solid", "dashed", "longdash", "dashed", "solid")
# Legend
ar_st_labels <- c(
  bquote("L-ramp"),
  bquote("L-support"),
  bquote("River"),
  bquote("R-support"),
  bquote("R-ramp")
)

Visualize bridges each loan is a five color-segmented line. Bridges are sorted based on Loan B, A, C lengths. We develope a visualization script below.

#' Visualize Bridge Loan Data
#'
#' This function creates a ggplot visualization of bridge loan data segmented into five parts.
#'
#' @param df_bridge_5seg_long A data frame containing the bridge loan data with five segments.
#' @param st_title A string for the plot title. Default is "Bridge loan 5 segments".
#' @param st_lab_x A string for the x-axis label. Default is "Months".
#' @param st_lab_y A string for the y-axis label. Default is "Index of bridged loans (sorted by river-length)".
#' @param fl_alpha A numeric value for the transparency level of the lines. Default is 0.70.
#'
#' @return A ggplot object representing the bridge loan data visualization.
#'
#' @examples
#' # Example usage:
#' # df_bridge_5seg_long <- read.csv("path_to_your_data.csv")
#' # plot <- ffi_bridge_visualize(df_bridge_5seg_long)
#' # print(plot)
#'
#' @import ggplot2
#' @import dplyr
#' @import scales
#' @import grid
#' @export
ffi_bridge_visualize <- function(
    df_bridge_5seg_long,
    st_title = "Bridge loan 5 segments",
    st_lab_x = "Months",
    st_lab_y = "Index of bridged loans (sorted by river-length)",
    st_notes = "",
    fl_alpha = 0.70) {
  pl_bridge_roster <- df_bridge_5seg_long %>%
    # filter(index_bridge_rvabap_sorted <= 10) %>%
    ggplot(
      aes(
        x = month,
        y = index_bridge_rvabap_sorted,
        color = segment,
        group = graph_group
      )
    ) +
    geom_line(alpha = fl_alpha)

  # Change segments colors
  pl_bridge_roster <- pl_bridge_roster +
    scale_linetype_manual(
      values = ar_st_linetypes,
      labels = ar_st_labels
    ) +
    scale_colour_manual(
      values = ar_st_colours, labels = ar_st_labels
    )

  pl_bridge_roster <- pl_bridge_roster +
    labs(
      title = st_title,
      x = st_lab_x,
      y = st_lab_y,
      caption = st_notes
    ) +
    scale_x_continuous(
      labels = x_breaks, breaks = x_breaks,
      limits = c(x_min, x_max)
    ) +
    theme_bw() +
    theme(
      legend.title = element_blank(),
      legend.position = c(0.80, 0.15),
      legend.background = element_rect(
        fill = "white",
        colour = "black",
        linetype = "solid"
      ),
      legend.key.width = unit(1.5, "cm"),
      panel.grid.minor.x = element_blank()
    )

  return(pl_bridge_roster)
}

We call the visualization script over the dataframes we have construcgted.

ls_plot <- vector(mode = "list", length = length(ls_dataframes_prc))
it_file_ctr <- 0
for (df_dataframe_prc in ls_dataframes_prc) {
  it_file_ctr <- it_file_ctr + 1
  pl_cur <- ffi_bridge_visualize(
    df_dataframe_prc,
    st_title = "Bridge loan 5 segments",
    st_lab_x = "Months",
    st_lab_y = "Index of bridged loans (sorted by river-length)",
    st_notes = ls_dataframes_notes[[it_file_ctr]],
    fl_alpha = 0.70
  )
  ls_plot[[it_file_ctr]] <- pl_cur
}
names(ls_plot) <- ls_dataframes_names

Store visualizations

for (nm in names(ls_plot)) {
  pl_fig <- ls_plot[[nm]]

  # On-page display controlled by bl_img_print_on_page (unchanged behavior)
  if (bl_img_print_on_page) {
    print(pl_fig)
  }

  # Disk saving controlled per-figure by ls_save_res (all default FALSE)
  ffp_save_res_figure(
    pl_fig, nm, spt_res,
    bl_save = isTRUE(ls_save_res[[nm]]),
    fl_width = 200, fl_height = 125, it_dpi = 150
  )
}
#> Warning: Removed 136 rows containing missing values or values outside the scale range
#> (`geom_line()`).

#> Warning: Removed 24 rows containing missing values or values outside the scale range
#> (`geom_line()`).

#> Warning: Removed 12 rows containing missing values or values outside the scale range
#> (`geom_line()`).

#> Warning: Removed 30 rows containing missing values or values outside the scale range
#> (`geom_line()`).

#> Warning: Removed 45 rows containing missing values or values outside the scale range
#> (`geom_line()`).

#> Warning: Removed 25 rows containing missing values or values outside the scale range
#> (`geom_line()`).