Model with Menu + Bridge + Cmin--Choice Sets

In various previous files, we have developed individual model components: Menu of formal loans, using informal loans as bridge loans in an environment where formal loans can not be rolled over, and allowing for delayed repayment through minimum consumption.
Here we combine these ingredients together.
The model has a particular set of choice constraints. These choice constraints are impacted by the informal and formal interest rates, as well as the individual levels of cash-on-hand.
In this file, we visualize the joint choice set

Setting Up Parameters

Households differ in: w, ri common grid
% Formal Borrowing and Savings Interest Rates
rfb = 0.0;
rfs = -0.50;
% Borrowing Constraint
[NBC, BDcmin] = deal(2, -4);
% state grid and matrix
[w_min, w_max, w_n] = deal(-0.50, 2, 2);
w_vector = linspace(w_min, w_max, w_n);
[ri_min, ri_max, ri_n] = deal(0.15, 1.25, 4);
ri_vector = linspace(ri_min, ri_max, ri_n);
% choice grid and matrix
[kp_n, bp_n] = deal(100, 100);
[kp_min, kp_max, kp_n] = deal(0, 2 + w_max, kp_n);
[bn_min, bn_max, bn_n] = deal(-2, +2, bp_n);
breaks = 3;
bspan = (bn_min/breaks);

Conditioning Choice Sets.

These are the linear constraints that restrict choice set for each model version and the joint model.
% Rollover Standard Borrow Save
rlov = @(kp, bp, w, rs, rb, b_bar) ...
find((kp >= 0).*(bp >= b_bar).* ...
(...
(bp < 0).*(kp < (w - (1/(1+rfb).*bp))) + ...
(bp >= 0).*(kp < (w - (1/(1+rfs).*bp))) ...
));
% Rollover Standard Borrow Save with Menu
inc = @(ri) (-1)*(bspan*((1/(1+rfb)) - (1/(1+ri))));
rlov_menu = @(kp, bp, w, ri, rs, rb, b_bar) ...
find((kp >= 0).*(bp >= b_bar).* ...
(...
...
((3*bspan <= bp).*(bp < 2*bspan).*((kp < (w + inc(ri)*2 - (1/(1+ri).*bp)))) + ...
(2*bspan <= bp).*(bp < 1*bspan).*((kp < (w + inc(ri)*1 - (1/(1+ri).*bp)))) + ...
(1*bspan <= bp).*(bp < 0*bspan).*((kp < (w + inc(ri)*0 - (1/(1+ri).*bp))))) ...
+ ...
(bp >= 0).*(kp < (w - (1/(1+rfs).*bp))) ...
));
% Rollover Standard Borrow Save with Bridge Loans
rlov_bridge = @(kp, bp, w, ri, rs, rb, b_bar) ...
find((kp >= 0).*(bp >= b_bar).* ...
(...
(w >= 0).*(bp < 0).*(kp < (w - (1/(1+rfb).*bp))) + ...
(w < 0).*( ...
((w*(1+ri)) <= bp).*(bp < 0).*(kp < (w - (1/(1+ri).*bp))) + ...
((w*(1+ri)) > bp).*(kp < (w*((1+ri)/(1+rfb)) - (1/(1+rfb).*bp))) ...
) + ...
(bp >= 0).*(kp < (w - (1/(1+rfs).*bp))) ...
));
% Rollover Standard Borrow Save with Bridge Loans with Menu
rlov_menu_bridge = @(kp, bp, w, ri, rs, rb, b_bar) ...
find((kp >= 0).*(bp >= b_bar).* ...
(...
(w >= 0).*(...
(6*bspan <= bp).*(bp < 5*bspan).*((kp < (w + inc(ri)*5 - (1/(1+ri).*bp)))) + ...
(5*bspan <= bp).*(bp < 4*bspan).*((kp < (w + inc(ri)*4 - (1/(1+ri).*bp)))) + ...
(4*bspan <= bp).*(bp < 3*bspan).*((kp < (w + inc(ri)*3 - (1/(1+ri).*bp)))) + ...
(3*bspan <= bp).*(bp < 2*bspan).*((kp < (w + inc(ri)*2 - (1/(1+ri).*bp)))) + ...
(2*bspan <= bp).*(bp < 1*bspan).*((kp < (w + inc(ri)*1 - (1/(1+ri).*bp)))) + ...
(1*bspan <= bp).*(bp < 0*bspan).*((kp < (w + inc(ri)*0 - (1/(1+ri).*bp)))) ...
)+ ...
(w < 0).*( ...
((w*(1+ri)) <= bp).*(bp < 0).*(kp < (w - (1/(1+ri).*bp))) + ...
((6*bspan <= bp).*(bp < 5*bspan).*((kp < (w*((1+ri)/(1+rfb)) + ...
inc(ri)*4 - (1/(1+ri).*bp)))) + ...
(5*bspan <= bp).*(bp < 4*bspan).*((kp < (w*((1+ri)/(1+rfb)) + ...
inc(ri)*3 - (1/(1+ri).*bp)))) + ...
(4*bspan <= bp).*(bp < 3*bspan).*((kp < (w*((1+ri)/(1+rfb)) + ...
inc(ri)*3 - (1/(1+ri).*bp)))) + ...
(3*bspan <= bp).*(bp < 2*bspan).*((kp < (w*((1+ri)/(1+rfb)) + ...
inc(ri)*2 - (1/(1+ri).*bp)))) + ...
(2*bspan <= bp).*(bp < 1*bspan).*((kp < (w*((1+ri)/(1+rfb)) + ...
inc(ri)*1 - (1/(1+ri).*bp)))) + ...
(1*bspan <= bp).*(bp < 0*bspan).*((kp < (w*((1+ri)/(1+rfb)) + ...
inc(ri)*0 - (1/(1+ri).*bp))))) ...
) + ...
(bp >= 0).*(kp < (w - (1/(1+rfs).*bp))) ...
));

Consumption Equations

We have to also specifiy consumption equations.
% Cmin Consumption Equation
fchat = @(c, cmin) (c).*(c >= cmin) + (cmin).*(c < cmin);
% C
fc = @(w, kn, bn) (w - kn - bn);
% consumption for basic roll-over with differential borrow save rate
fc_rlov = @(w, kn, bn) (w - kn - ...
bn.*( ...
(bn < 0).*(1/(1+rfb)) + ...
(bn >= 0).*(1/(1+rfs)) ...
) ...
);
% consumption for bridge + menu with differential borrow save rate
fc_rlov_grid = @(w, kn, bn, ri) (w - kn - ...
( ...
(7*bspan <= bn).*(bn < 6*bspan).*(6*bspan*(1/(1+rfb)) + (bn-6*bspan).*(1/(1+ri))) + ...
(6*bspan <= bn).*(bn < 5*bspan).*(5*bspan*(1/(1+rfb)) + (bn-5*bspan).*(1/(1+ri))) + ...
(5*bspan <= bn).*(bn < 4*bspan).*(4*bspan*(1/(1+rfb)) + (bn-4*bspan).*(1/(1+ri))) + ...
(4*bspan <= bn).*(bn < 3*bspan).*(3*bspan*(1/(1+rfb)) + (bn-3*bspan).*(1/(1+ri))) + ...
(3*bspan <= bn).*(bn < 2*bspan).*(2*bspan*(1/(1+rfb)) + (bn-2*bspan).*(1/(1+ri))) + ...
(2*bspan <= bn).*(bn < 1*bspan).*(1*bspan*(1/(1+rfb)) + (bn-1*bspan).*(1/(1+ri))) + ...
(1*bspan <= bn).*(bn < 0*bspan).*(0*bspan*(1/(1+rfb)) + (bn-0*bspan).*(1/(1+ri))) + ...
(bn >= 0).*bn.*(1/(1+rfs)) ...
) ...
);

Generate Choice Set Graphs

Below we generate choice set graphs over different interest rates and wealth levels. For the different model versions.
% Model Versions
% 'rollover_bridge_grid'
model_list = {'rollover', 'rollover_grid', 'rollover_bridge', ...
'rollover_bridge_grid_cmin'};
% Loop over the choice matrix for different individuals
for subset_type = model_list
for w_i=1:w_n
sub_plot_ctr = 0;
figure();
for ri_i=1:ri_n
sub_plot_ctr = sub_plot_ctr + 1;
% Grids Meshed
if (strcmp(subset_type, 'rollover_bridge_grid_cmin'))
bn_vector = linspace(BDcmin, bn_max, bn_n);
bn_min_xmin = BDcmin;
else
bn_vector = linspace(bn_min, bn_max, bn_n);
bn_min_xmin = bn_min;
end
kn_vector = linspace(kp_min, kp_max, kp_n);
[kp_mesh, bp_mesh] = meshgrid(kn_vector, bn_vector);
% Household Specific cash-on-hand and interest
% cash-on-hand(A,k,b,eps)
w_cur = w_vector(w_i);
ri_cur = ri_vector(ri_i);
% s stands for subset
kp_s = kp_mesh(:);
bp_s = bp_mesh(:);
cmin = 0;
titleline2 = ['w=' num2str(w_cur)];
% Different subsetting functions
if (strcmp(subset_type, 'all'))
% Consumption Levels
chat = fchat(fc(w_cur, kp_s, bp_s), cmin);
else
if (strcmp(subset_type, 'rollover'))
idx = rlov(kp_s, bp_s, w_cur, rfs, rfb, -NBC);
kp_s = kp_s(idx);
bp_s = bp_s(idx);
chat = fchat(fc_rlov(w_cur, kp_s, bp_s), cmin);
% idx_m = rlov(kp_s, bp_s, w_vector, rfs, rfb, -NBC);
% idx_m = idx_m-floor(idx_m/25)*25;
titleline = 'Standard BrSv';
end
if (strcmp(subset_type, 'rollover_grid'))
idx = rlov_menu(kp_s, bp_s, w_cur, ri_cur, rfs, rfb, -NBC);
kp_s = kp_s(idx);
bp_s = bp_s(idx);
chat = fchat(fc_rlov_grid(w_cur, kp_s, bp_s, ri_cur), cmin);
titleline = 'Standard BrSv + Menu';
titleline2 = ['w=' num2str(w_cur) ', ri=' num2str(ri_cur)];
end
if (strcmp(subset_type, 'rollover_bridge'))
idx = rlov_bridge(kp_s, bp_s, w_cur, ri_cur, rfs, rfb, -NBC);
kp_s = kp_s(idx);
bp_s = bp_s(idx);
chat = fchat(fc_rlov(w_cur, kp_s, bp_s), cmin);
titleline = 'Standard BrSv + Bridge';
titleline2 = ['w=' num2str(w_cur) ', ri=' num2str(ri_cur)];
end
if (strcmp(subset_type, 'rollover_bridge_grid'))
idx = rlov_menu_bridge(kp_s, bp_s, w_cur, ri_cur, rfs, rfb, -NBC);
kp_s = kp_s(idx);
bp_s = bp_s(idx);
chat = fchat(fc_rlov_grid(w_cur, kp_s, bp_s, ri_cur), cmin);
titleline = 'BrSv + Menu + Bridge';
titleline2 = ['w=' num2str(w_cur) ', ri=' num2str(ri_cur)];
end
if (strcmp(subset_type, 'rollover_bridge_grid_cmin'))
idx = rlov_menu_bridge(kp_s, bp_s, w_cur, ri_cur, rfs, rfb, BDcmin);
kp_s = kp_s(idx);
bp_s = bp_s(idx);
cmin = 0.01;
chat = fchat(fc_rlov_grid(w_cur, kp_s, bp_s, ri_cur), cmin);
titleline = 'BrSv + Menu + Bridge + Cmin';
titleline2 = ['w=' num2str(w_cur) ', ri=' num2str(ri_cur)];
end
end
% Scatter Draws
subplot(2, 2, sub_plot_ctr);
hold on;
scatter(bp_s, kp_s, 10, chat(:));
% Graph bounds
x_max = bn_max+0.2;
x_min = bn_min_xmin-0.2;
y_max = kp_max;
y_min = w_min;
% Natural Borrowing Constraint
plot(ones(10, 1) * -NBC, linspace(y_min, y_max, 10), ...
'b-', 'HandleVisibility', 'off');
% 0 lines
plot(linspace(x_min, x_max, 10), ones(10, 1) * 0, ...
'k--', 'HandleVisibility', 'off');
plot(ones(10, 1) * 0, linspace(y_min, y_max, 10), ...
'k--', 'HandleVisibility', 'off');
% Titling and Axis
xlim([x_min, x_max]);
ylim([y_min, y_max]);
title({[titleline], titleline2});
ylabel('Risky Capital Choice');
xlabel('Borr Save (principle + r)');
%
end
end
end