Reibstein_Sarah_Project
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
This model simulates the use of informal savings clubs as a buffer against risk. Savings and credit cooperatives play a prevalent role in the informal economy of the developing world, and there is a great amount of diversity in the forms these groups take. Some involve loaning funds out to non-members at an interest rate, such that members do see a positive return on their deposits. However there are also well-documented instances of people creating and joining the simple type that is modeled here, in which net returns are often expected to be negative. In asking why this occurs, some have proposed that savings clubs may simply be the best among bad options. I explore this question by giving individuals a choice between saving in a club and on their own. Club members risk losing money if others default, but personal savers face a host of other problems--temptation spending, theft, pressure from family members--all of which are captured in the variable "SECURITY-RISK". By varying these dimensions, we can understand the conditions that incentivize people to join informal savings clubs, and the conditions that allow them to be most effective.
HOW IT WORKS
In the model, everyone is trying to achieve the goal of saving 300 units in 30 ticks (we can think of this as $300 dollars in 30 days, although real savings goals are likely to be either smaller or over a longer time period).
People are initialized with individual values for INCOME-RISK and SECURITY-RISK, drawn from a random distribution around means set by sliders. Color is scaled on INCOME-RISK--the darker the red the higher the risk. Each person predicts originally that the mean INCOME-RISK for the population is equal to his own. People also start out with a PREFERRED-GROUP-SIZE that is set by a slider. An individual would like to join a club if (1 - INCOME-RISK-ESTIMATE) > (1 - INCOME-RISK - SECURITY-RISK), which is true for everyone starting out because INCOME-RISK-ESTIMATE initially equals INCOME-RISK. A random person will create a club, set that club's DESIRED-MEMBERS based on his PREFERRED-GROUP-SIZE. He sets the club's DAILY-CONTRIBUTION such that the club's expected payout in 30 days is $300: 10 / (1 - INCOME-RISK-ESTIMATE). People join this club until it's full, and the process repeats until the people who are left over either would not like to join a club (although this wouldn't happen in the first round), or are too few to make a club with anyone's preferred membership size. People for whom the latter is the case are designated "LEFT-OUTS"; they should not be misunderstood, when looking at the number of people saving in clubs and individually, as preferring to save alone.
For the next 30 ticks, people in clubs contribute "DAILY-CONTRIBUTION" to their clubs (1 - INCOME-RISK)% of the time, and 0 otherwise. People saving alone contribute 10 / (1 - INCOME-RISK - SECURITY-RISK) to their savings (1 - INCOME-RISK - SECURITY-RISK)% of the time, and 0 otherwise. At the end of the 30 ticks, the total money that has been accumulated in each club is split up evenly between that club's members. If the amount meets or exceeds 300, those members are recorded as having met goals. Otherwise, they have missed goals and they leave the club. Personal savers simply look at their accumulated "SAVINGS" and similarly are recorded as successful if they meet 300. Club members recalculate "INCOME-RISK-ESTIMATE" as follows: each assumes that the average risk among his group is equal to 1 - PRIZE / (30 * DAILY-CONTRIBUTION), for this is the risk that would lead to the prize they received. They add this estimate to their history and calculate a new average. The process of forming and joining groups then runs again.
Personal savings are displayed with white labels, and group savings are black labels.
HOW TO USE IT
SETUP button -- sets up the model by creating the agents.
GO button -- runs the model.
INITIAL-PREFERRED-GROUP-SIZE slider -- determines the club membership size that people initially prefer.
MEAN-INCOME-RISK -- determines the chance of experiencing a drop in income at any given time for the average person.
MEAN-SECURITY-RISK -- determines the chance of personal savings being depleted for the average person.
INCOME-RISK-SD -- determines the standard deviation of income risk among people.
THINGS TO NOTICE
Monitors on the interface display the average values for income-risk among club members and personal savers. It is usually the case that the value for personal savers will decline relative to the value for club members, as people who are less risky than the mean would rather save on their own than be jointly responsible with a group of people who are more likely to default than themselves. This adverse selection can have a negative impact on the effectiveness of clubs.
The "LEFT-OUT" monitor displays the number of people at a given time who estimate that saving in a club would be less risky than saving at home, but weren't able to find an open club to join.
THINGS TO TRY
Under certain conditions, the average group size will stay very close to INITIAL-PREFERRED-GROUP-SIZE throughout the run of the model. In other cases, there is downward pressure on the group size. Explore the risk parameters to see when group size evolves.
Clubs are always preferred to saving alone by most members in this model. See what the sliders have to be set to for everyone to want to join a club.
EXTENDING THE MODEL
The model could be a more accurate representation if it were extended to include other options for saving that are likely to exist alongside the type of club modeled here. A rotating credit and savings association works similarly, but one group member takes home all the contributions each month, until everyone has had a turn. To model this, you would need to account for accumulated savings being different each round, and people having preferences for when they would like the lump sum.
Comments and Questions
breed [anchors anchor] breed [people person] breed [clubs club] globals [ center-anchor goals-met-in-clubs goals-missed-in-clubs left-outs goals-met-personal-savings goals-missed-personal-savings ] people-own [ income-risk ;; chance of a drop in income security-risk ;; chance of losing personal savings in-club? ;; true if currently in a club like-to-join? ;; true if trying to join a club preferred-group-size ;; the membership size that has allowed the individual to meet the greatest number of goals in the past last-best ;; used in setting PREFERRED-GROUP-SIZE current-met ;; used in setting PREFERRED-GROUP-SIZE chosen-group-size ;; the membership size that a creator of a club will employ income-risk-estimate ;; estimate of average risk in population this-round-risk ;; used in setting RISK-ESTIMATE history ;; used in setting RISK-ESTIMATE contribution ;; the amount put into a club or personal savings in a given tick savings ;; the amount of accumulated savings since last calculation ] clubs-own [ daily-contribution ;; how much individuals should put in a club daily members ;; how many members are in the group money ;; how much money is in the pot desired-members ;; how many members the group can hold status ;; whether the club is full or not full ] to setup ca ;; Create the center node anchor create-anchors 1 [ set shape "circle" set color black ] ;; This is a convenience variable that points to the center anchor set center-anchor one-of anchors set-default-shape people "person" set-default-shape clubs "circle" ;; initialize people create-people 200 ask people [ setxy random-xcor random-ycor set income-risk random-normal-in-range mean-income-risk income-risk-sd 0 1 set security-risk random-normal-in-range mean-security-risk .1 0 1 set contribution 0 set preferred-group-size initial-preferred-group-size set last-best 0 set history (list income-risk) set income-risk-estimate income-risk set color scale-color red income-risk 1 0 set in-club? false ] set goals-met-in-clubs 0 set goals-missed-in-clubs 0 set goals-met-personal-savings 0 set goals-missed-personal-savings 0 end to-report random-normal-in-range [ the-mean the-stdev low high ] let val random-normal the-mean the-stdev if (val < low) or (val > high) [ report random-normal-in-range the-mean the-stdev low high ] report val end to go ifelse ((count people with [in-club? = true]) = (count people with [like-to-join? = true])) and (count people with [like-to-join? = true] > 0) and (count clubs with [status != "full"] = 0) [ save ;; if everyone who wants to join a club has, and all clubs are full, start savings procedures ] [ ;; people decide whether they would like to be in clubs or save alone ask people with [in-club? = false] [decide] ;; one person starts a club ask people [set chosen-group-size round random-normal-in-range preferred-group-size 1 2 200] if any? people with [(in-club? = false) and (like-to-join? = true) and (chosen-group-size <= count people with [(like-to-join? = true) and (in-club? = false)])] [ ask one-of people with [(in-club? = false) and (like-to-join? = true) and (chosen-group-size <= count people with [(like-to-join? = true) and (in-club? = false)])] [start-club]] ;; people join the club until it is full ask people [if count my-links > 0 [set in-club? true]] if any? people with [in-club? = false] [ ask people with [in-club? = false] [maybe-join]] ;; clubs that never get filled are abandoned if any? clubs with [status != "full"] [ ask clubs with [status != "full"] [die]] ;; if people would like to join but there are not enough remaining people to fill a club, they will not join this round set left-outs people with [(in-club? = false) and (like-to-join? = true) and (chosen-group-size > count people with [(like-to-join? = true) and (in-club? = false)])] ask left-outs [set like-to-join? false] ;; people update IN-CLUB? variable ask people with [count my-links = 0] [set in-club? false] ] end to decide ;; person procedure ifelse (1 - income-risk-estimate) > (1 - income-risk - security-risk) [ set like-to-join? true ] [ set like-to-join? false ] end to maybe-join if any? clubs with [status = "not-full"] [ if (like-to-join? = true) and (in-club? = false) [join] ] ask clubs [ repeat 10 [layout-spring link-neighbors my-links .2 2 .5] ] layout-spring clubs ( [my-links] of center-anchor ) .2 14 .5 end to start-club ;; person procedure ask patch-here [ let creator myself sprout-clubs 1 [ ifelse [ycor] of creator <= 14 [ setxy [xcor] of creator [ycor] of creator + 2] [ setxy [xcor] of creator [ycor] of creator - 2] set color yellow set size 1.3 set desired-members [chosen-group-size] of creator set daily-contribution 10 / (1 - [income-risk-estimate] of creator) set status "not-full" create-link-with creator ] ] set in-club? true end to join ;; person procedure create-link-with one-of clubs with [status = "not-full"] set in-club? true ask one-of link-neighbors [ set members count my-links if members >= desired-members [ set status "full" ] ] end to save update-plots ;; personal saving procedure ask people with [in-club? = false] [ ifelse random-float 1 < (income-risk + security-risk) [ set contribution 0] [ set contribution 10 / (1 - income-risk - security-risk) ] set savings savings + contribution set label round savings set label-color white if (ticks mod 30 = 0) and (ticks != 0) [ calculate-savings ] ] ;; group saving procedure ask clubs [ ask link-neighbors [ ifelse random-float 1 < income-risk [ set contribution 0] [ set contribution [daily-contribution] of one-of link-neighbors] ] ;; money in the club increases by the amount of its members contributions set money money + sum [contribution] of link-neighbors ;; visually show money in club set label round money set label-color black ;; every 30 days, divide up the money if (ticks mod 30 = 0) and (ticks != 0) [ split-prize ] ] tick end to split-prize let prize (money / members) ask link-neighbors [ ;; calculate risk estimate for this round, add that to history, recalculate INCOME-RISK-ESTIMATE set this-round-risk 1 - (prize / (30 * [daily-contribution] of one-of link-neighbors)) if (this-round-risk > 1) or (this-round-risk < 0) [ show this-round-risk ] set history fput this-round-risk history set income-risk-estimate mean history ;; if the prize is >= goal size: update globals, stay in club ifelse [prize] of myself >= 300 [ set goals-met-in-clubs goals-met-in-clubs + 1 set current-met current-met + 1] ;;if the prize is < goal size: update globals, update people variables, leave club [ set goals-missed-in-clubs goals-missed-in-clubs + 1 set in-club? false if current-met >= last-best [ set preferred-group-size [desired-members] of one-of link-neighbors set last-best current-met] set current-met 0 set contribution 0 ask my-links [ die] ]] ;; club updates MEMBERS and STATUS ;; if people have left the club, those remaining update people variables set members count my-links if members < desired-members [ set status "not-full" ask link-neighbors [ if current-met >= last-best [set preferred-group-size [desired-members] of one-of link-neighbors set last-best current-met] set current-met 0 set contribution 0 ] ] set money 0 set label " " end to calculate-savings ;; person procedure ifelse savings >= 300 [ set goals-met-personal-savings goals-met-personal-savings + 1 ] [ set goals-missed-personal-savings goals-missed-personal-savings + 1 ] set contribution 0 set savings 0 set label " " end to update-plots set-current-plot "Number of People" set-current-plot-pen "in-clubs" plot count people with [in-club? = true] set-current-plot-pen "saving-alone" plot count people with [in-club? = false] set-current-plot "% Goals Met" set-current-plot-pen "in-clubs" if (goals-met-in-clubs + goals-missed-in-clubs) != 0 [plot 100 * (goals-met-in-clubs / (goals-met-in-clubs + goals-missed-in-clubs))] set-current-plot-pen "saving-alone" if (goals-met-personal-savings + goals-missed-personal-savings) != 0 [plot 100 * (goals-met-personal-savings / (goals-met-personal-savings + goals-missed-personal-savings))] end
There are 7 versions of this model.
Attached files
No files