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
)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.
-
Inputs: packaged
tstm_roster_invest2loan2bridgeandtstm_loans_bridges_type(both produced byffv_invest_loan_bridge.qmd). - Figures: bridge-timing visualizations showing formal/informal loan segments along a common-start timeline, grouped by bridge linkage type.
Load libraries, etc.
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
- Edit gateway parameters in
ffv_invest_loan_bridge.qmdif needed (ar_st_vars_to_keep, month/size cuts,bl_replace_data_output). - Render the bridge vignette (requires
data/tstm_loans_panel.rdaanddata/tstm_asset_loan.rda):pkgdown::build_article("ffv_invest_loan_bridge") - Reload the package so lazy data pick up the new files:
devtools::load_all()orpkgfastfrom the repo root. - 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-3Generate 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:
- 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. - 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. - 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_namesGenerate 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_namesStore 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()`).
