Reibstein_Sarah_Project

No preview image

1 collaborator

Default-person Sarah Reibstein (Author)

Tags

(This model has yet to be categorized with any tags)
Parent of 1 model: Single Club-Type Model
Model group EECS 372-Spring 2011 | Visible to everyone | Changeable by the author
Model was written in NetLogo 4.1.3 • Viewed 169 times • Downloaded 17 times • Run 9 times
Download the 'Reibstein_Sarah_Project' modelDownload this modelEmbed this model

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

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

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.

Uploaded by When Description Download
Sarah Reibstein almost 13 years ago final version Download this version
Sarah Reibstein almost 13 years ago evolvable group size, individual riskiness Download this version
Sarah Reibstein about 13 years ago Fixed synchronicity issues, added reporters Download this version
Sarah Reibstein about 13 years ago "Child" Model Download this version
Sarah Reibstein about 13 years ago No description provided Download this version
Sarah Reibstein about 13 years ago No description provided Download this version
Sarah Reibstein about 13 years ago Initial upload Download this version

Attached files

No files

This model does not have any ancestors.

Children:

Graph of models related to 'Reibstein_Sarah_Project'