Rocco Paolillo

Simulation models for economics

Project work on

"Consumer racism and cooperation."

 

The applet requires Java 5 or higher. Java must be enabled in your browser settings. Mac users must have Mac OS X 10.4 or higher. Windows and Linux users may obtain the latest Java from Oracle's Java site.


Here you can find an introduction to the Consumer racism and cooperation application.


powered by NetLogo

view/download model file: consumer_racism_and_cooperation.nlogo

WHAT IS IT?

Consumer Racism (CR) is a phenomen in which economic choices of people are affected by the ethnic prejudice occurring between a dominant group, referring to himself as In-group and a group of others, referred to as Out-group, e.g. a group of immigrants (Quellet, 2007). Prejudice is made up of three factors, influencing the effect of contacts between groups, which are anxiety, knowledge and empathy (Pettigrew & Tropp, 2008). This model is aimed at showing how interactions between individual prejudice of consumers and economic strategy of buyers could affect the emerging outcome of a market place represented by a market square were retailers sell apples.

HOW IT WORKS

CYAN PATCHES: the neighbors inhabited by immigrants (e.g. building or social clubs)

Trade occcurs when a consumer is at the stall of a retailer with something to sell and at an affordable price. Were it the case and allowed by CR of consumers, they will deduct what they have spent from their cash and what they have bought will be subtracted by the offer of retailers who’ll gain an earning. If earning is higher than costs (stock apples, carriage cost and stall rent) they have and income they’ll continue to invest buying apples to trade.

BLUE AND RED PATCHES: The stalls of retailers of In-group (red) or Out-group (blue). Their strategy is to decrease their initial prices, which are equal, if there’s no consumer at their stall, but Out-groups, due to an experience of rejection, do it at a higher percentage. Due to this strategy, when price per kilo is equal to, or lower than cost per kilo, which means no earning, retailers choose to leave the market. Out-groups, as their strategy is a great risk for many to fail and just few to earn, can adopt a strategy of Cooperation paying a tax funding helps to members that have failed.

TURTLES: The consumers, wanting to spend all their money to the cheapest retailers, walking through the market knowing only the prices of neighbors around them and led by their CR:

0 CR (no neighbors) and Low CR : buy from the cheapest of retailers of neighbor, not taking into account their ethnicity

Medium CR: have a preference for In-groups, but buy from Out-groups if there are not In-groups around or can’t afford them

High CR: want to buy from the cheapest retailer only if an In-group

Level of CR is generated by the formula (anxiety - (knowledge + empathy) multipled by the number of neighbors inhabited by immigrants. The prejudice towards them is caused by the quality of communication (bad or good) and experience (positive or negative), with the latter having a double effect according to literature.

0 NEIGHBORS -> O CR
Adding neighbors (Homogeneity at 1089 neighbors) :
GOOD COMMUNICATION - POSITIVE EXPERIENCE -> LOW CR
BAD COMMUNICATION - NEGATIVE EXPERIENCE -> HIGH CR
BAD COMMUNICATION - POSITIVE EXERIENCE -> MEDIUM CR
GOOD COMMUNICATION - NEGATIVE EXPERIENCE -> MEDIUM CR

HOW TO USE IT

Press SETUP to set the world, adjusting levels of CR and numbers of neighbors. Consumers will appear too. Condition of 0 OUTGROUP_NEIGHBORS is the condition 0 CR, where this variable is not taken into account in running the economic phenomenon (consumers have CR level 0, not low CR). If you want the population to be renewed, switch REPOPULATION on, and if you want the Cooperation stratey to be adopted, switch COOPERATION on.

Press MARKET to set the market square.

Press GO to run the model.

You can adjust these sets (blue is for Out-groups, red is for In-groups; in [] the values set or resulting by default):

RETAILERS_BLUE / RETAILERS_RED: number of stalls [250 each]
POPULATION_CONSUMERS: total of consumers [200]
CARRIAGE_COST: cost for retailers to carry apples [1.5]
STALL_RENT: cost for retailers to rent a stall [1]
CASH_CONSUMERS: fixed amount of money consumers can spend [100]
CAPITAL_RETAILERS: initial money retailers can invest [50]
MARKET_PRICE: cost for retailers to stock one kilo of apples [1]
EARNING LEVEL: expected earning for each kilo of apples [3]
%_REDUCE_BLUE / %_REDUCE_RED: percentage of decrease of price adopeted by Out-groups [10] and In-groups [20]
%_SOCIAL_TAX: the percentage of tax to be paid for each income by Out-group if Cooperation is adopted.
EXPERIENCE: choice of “negative” or “positive” experience
COMMUNICATION: choice of “good” or “bad” communication
OUTGROUP_NEIGHBORS: total of neighbors inhabited by immigrants

THINGS TO NOTICE

THINGS TO TRY

You can try to adjust different combinations of number of neighbors and number of stalls, beyond studying the effect of the amount of population and level of money they can spend.

EXTENDING THE MODEL

It would be interesting to see what could happen if also In-groups adopted a Cooperative strategy, or what could happen if ways to adjust levels of CR during the simulation itself were found.

NETLOGO FEATURES

The model uses the commands “min-one-of”, “ifelse” when alternatives among choices are possible, the recaller “consumer-here” and “patch-here” for the act of trading. Regarding the Interface, beyond sliders and buttons, switches and choosers are used.

RELATED MODELS

(models in the NetLogo Models Library and elsewhere which are of related interest)

CREDITS AND REFERENCES

Pettigrew, T.F., & Tropp, R.F. (2008). How does intergroup contact reduce prejudice? Meta-analytic tests of three mediators. European Journal of Social Psychology, 38, 922-934.
Quellet, JF. (2007). Consumer Racism and Its Effects on Domestic Cross-Ethnic Product Purchase: An Empirical Test in the United States, Canada, and France. Journal of Marketing, 71(1), 113-128.
Wilensky, U. 1999. NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University. Evanston, IL.

CODE

breed [consumers consumer]
patches-own [capital earning_per_kilo offer price_per_kilo income earning total_costs cost_per_kilo social_tax]
consumers-own [cash request consumer_racism anxiety knowledge empathy anxiety_comm anxiety_exp knowledge_comm knowledge_exp empathy_comm empathy_exp]

to setup
 
 clear-all
 setup-plots
 reset-ticks
  
 ask n-of outgroup_neighbors patches [set pcolor cyan]       ;; Represents the neighbors lived by immigrants.

 create-consumers population_consumers [run [setxy random-xcor random-ycor] set shape "person"] ;; Creates the consumers.
 
 consumers_settings
 
end

to consumers_settings  ;; How to generate the consumer racism and other consumers' features.
  
  ask consumers [set cash  cash_consumers]                                                                                     ;; set the level of cash consumers can spend
  ask consumers [run [ifelse communication = "bad" [set anxiety_comm (1 * count neighbors with [pcolor = cyan])                ;; How Communication affects prejudice and consumer racism:
   set knowledge_comm 0 set empathy_comm 0] [set anxiety_comm 0 set knowledge_comm (.5 * count neighbors with [pcolor = cyan]) ;; were it "bad", anxiety turns 1 and knowledge and 
   set empathy_comm (.5 * count neighbors with [pcolor = cyan])]]]                                                             ;; empathy 0, on the contrary, communication "good" leads to 
 ask consumers [run [ifelse experience = "negative" [set anxiety_exp (2 * count neighbors with [pcolor = cyan])                ;; effect 0 of anxiety and 0.5 for empathy or knowledge, so
   set knowledge_exp 0 set empathy_exp 0] [set anxiety_exp 0 set knowledge_exp (1 * count neighbors with [pcolor = cyan])      ;; that their sum's 1. Experience, which has a greater 
   set empathy_exp (1 * count neighbors with [pcolor = cyan])]]]                                                               ;; impact, will have a double effect. The result is multipled
                                                                                                                               ;; by the number of neighbors (e.g. houses) of immigrants.
 ask consumers [run [set anxiety (anxiety_comm + anxiety_exp)] set knowledge (knowledge_comm + knowledge_exp)                  ;; Anxiety, knowledge and empathy are the results of the sum
   set empathy (empathy_comm + empathy_exp)]                                                                                   ;; of communication's and experience's ones.
                                                                                                                               
 ask consumers [set consumer_racism ( anxiety - (knowledge + empathy))]                                                        ;; This is Consumer Racism (CR)'s formula 

 ask consumers with [consumer_racism  >= -24  and consumer_racism <= -9] [set color green]                                     ;; Condition of Low CR (meaning No CR), color green.
 ask consumers with [consumer_racism = 0] [set color green]                                                                    ;; Consumers with CR 0 are considered by default with No CR,
                                                                                                                               ;; representing the condition of trade without this variable. 
 ask consumers with [consumer_racism != 0 and consumer_racism <= 8 and consumer_racism  >= -8] [set color yellow]              ;; Condition of Medium CR, color yellow
 ask consumers with [consumer_racism != 0 and consumer_racism >= 9 and consumer_racism <= 24]  [set color brown]               ;; Condition of High CR, color brown
 
end 

to market     ;; Set the market square
  
 ask n-of ( retailers_blue) patches [set pcolor blue]  ;; Represent the stalls of immigrants retailers (Out-group)
 ask n-of ( retailers_red) patches  [set pcolor red]   ;; Represent the stalls of the dominant group of retailers (In-group)
 price_taking
      
end

to price_taking                                                                         ;; How initial prices are generated. They have the same price and will be different just 
                                                                                        ;; by the amount of decrease they accept.
 ask patches with [pcolor = blue or pcolor = red] [run [set capital  capital_retailers] ;; In-group and Out-group have the same initial capital and they'll invest all of it.
   set offer floor ((capital - stall_rent - carriage_cost ) / market_price)               ;; Offer is made by money they can invest, that is, capital less costs of carriage and stall rent, 
   if offer <= 0 [set pcolor black]]                                                      ;; divided by the market price for a kilo of apples. Were the offer 0, they can't trade.                    
 ask patches with [pcolor = red or pcolor = blue] [set earning_per_kilo earning_level]    ;; The expected earning for a kilo of apples is the same for all retailers.                                                                                    
   ask patches with [pcolor = blue or pcolor = red] [run [set total_costs ((stall_rent + carriage_cost) + (market_price * offer))]   ;; Total costs are done by stall rent and carriage cost
   set cost_per_kilo ( total_costs  / offer)  set  price_per_kilo  (cost_per_kilo + earning_per_kilo)]                               ;; plus money spent to buy the apples.
                                                                                                                                     ;; The cost of a single kilo of apples is done by total
                                                                                                                                     ;; costs divided by the total amount of kilos bought, 
                                                                                                                                     ;; and the price is made by costs plus earning expected.
                                                                                                                               
 ask patches with [pcolor = blue or pcolor = red] [set earning 0]      ;; Initial level of earning.
 ask patches with [pcolor = blue or pcolor = red] [set income 0]       ;; Initial level of income.
 if Cooperation [ask patches with [pcolor = blue] [set social_tax 0]]  ;; Initial level of social_tax if the Cooperation strategy is activated.
 
end

to go                 ;; Consumers' commands due to their CR level are called by their colour. Trading is representing by consumers at retailers' stall, that is, being on their patches. 
                      ;; Consumers will subtract from their cash as they spend, and retailers will gain earning and deduct kilos of apples as they sell.
  consumers_behaviour
    
  ask patches with [ pcolor = blue] [if any? consumers-here with [color = green or color = yellow] ;; In order to avoid High CR to trade with Out-group, due to their prejudice, 
    [run [ifelse mean [request] of consumers-here >=  [offer] of self                              ;; immigrants (blue patches) can trade only with Low, No and Medium CR consumers.
    [run [set earning earning + (price_per_kilo *  [offer] of self)] set offer  0 ]                ;; As consumers have a fixed amount of money to spend, if their request higher than offer
    [run [set earning earning + (price_per_kilo * mean [request] of consumers-here)]               ;; and they can afford all of it, they'll buy all the kilos a retailer can sell,
    set offer floor ( offer - mean [request] of consumers-here)]]]]                                ;; and offer of retailer will turn 0, otherwise, they'll buy the amount
                                                                                                   ;; they ask, which will be deducted by the offer of the retailer.

  ask patches with [ pcolor = red] [if any? consumers-here                                         ;; The procedure for red retailers (In-group) is the same, but they can trade with
    [run [ifelse mean [request] of consumers-here >=  [offer] of self                              ;; everyone.
    [run [set earning earning + (price_per_kilo *  [offer] of self)] set offer  0 ]       
    [run [set earning earning + (price_per_kilo * mean [request] of consumers-here)] 
    set offer floor ( offer - mean [request] of consumers-here)]]]] 


  ask consumers [if cash <= 0.01 [ifelse repopulation [run [hatch 1 [set cash cash_consumers] die]] [die]]]  ;; Consumers which have spent all money have to leave the square market. Were 
                                                                                                             ;; repopulation activated, the population'll be renewed with the same CR level
                                                                                                             ;; and initial amount of money.
 
  ask patches with [pcolor = blue and offer = 0] [ifelse Cooperation [run [set income earning - total_costs] ;; Retailers can calculate their income after all the offer has been sold. 
    if income >= 0 [set social_tax (%_social_tax * (income / 100))]]                                         ;; For immigrants, if the Cooperation strategy is adopted, they'll pay a
    [set income earning - total_costs]]                                                                      ;; percentage of social-tax to support their group, if income is positive,
                                                                                                             ;; otherwise income will be earning less total costs, with no tax to pay.
    
  ask patches with [pcolor = blue and offer = 0] [if income > 0 [ifelse Cooperation                          ;; If income is positive, if Cooperation strategy is activated, Out-groups will
    [run [set capital (income - social_tax)]                                                                 ;; be allowed to invest incomes from the previous trade less the tax they have
    set offer floor ((capital - carriage_cost ) / market_price)                                              ;; paid. The process is the same of "price_taking" but they don't have to pay
    ifelse offer > 0 [ set total_costs ((carriage_cost) + (market_price * offer))                            ;; the stall rent. If Cooperation is not run, they can invest all the income
    set cost_per_kilo ( total_costs  / offer)  set  price_per_kilo cost_per_kilo + (earning_per_kilo)        ;; they have earned.
    set earning 0] [set pcolor blue - 3]]  [run [set capital income] 
    set offer floor ((capital - carriage_cost ) / market_price)
    ifelse offer > 0 [run [ set total_costs ((carriage_cost) + (market_price * offer))] 
    set cost_per_kilo ( total_costs  / offer)  set  price_per_kilo cost_per_kilo + (earning_per_kilo)
    set earning 0] [set pcolor blue - 3]]]]
  
  
  ask patches with [pcolor = blue and offer = 0] [if income <= 0                                                                   ;; If income is lower than 0 and Cooperation is active,
    [ifelse Cooperation [run [set capital (sum [social_tax] of patches with [pcolor = blue] / count patches with [pcolor = blue])] ;; immigrants cah use the amount of the social tax they
    set offer floor ((capital - (carriage_cost + stall_rent ) / market_price))                                                     ;; deserve to enter the market again, and in their costs
    ifelse offer > 0 [run [ set total_costs ((carriage_cost + stall_rent) + (market_price * offer))]                               ;; there's still stall rent. Were offer less or equal to 0, 
    set cost_per_kilo ( total_costs  / offer)  set  price_per_kilo cost_per_kilo + (earning_per_kilo)                              ;; there's no way to trade again. If Cooperation is not
    set earning 0] [set pcolor blue - 3]] [ set pcolor blue - 3]]]                                                                 ;; active, they'll directly fail leaving the market square.
  
  
  
  ask patches with [pcolor = red and offer = 0]  [set income earning - total_costs]                     ;; Cooperation command doesn't work on In-groups.
                                                                                                        ;; They can only set income earning less total_costs.
    
    
  ask patches with [pcolor = red and offer = 0] [if income > 0 [run [set capital income]                ;; If income is higher than 0, In-group retailers can continue trading apples, and 
    set offer floor ((capital - carriage_cost ) / market_price)                                         ;; among their costs there's not stall rent anymore. If they can't afford to buy new 
    ifelse offer > 0 [ set total_costs ((carriage_cost) + (market_price * offer))                       ;; apples they have to leave.
    set cost_per_kilo ( total_costs  / offer)  set  price_per_kilo  cost_per_kilo + (earning_per_kilo)
    set earning 0] [set pcolor red - 3]]]
   
    
  ask patches with [pcolor = red and offer = 0]  [if income <= 0 [set pcolor red - 3]]  ;; If income is less than 0, In-group retailers will fail leaving the market square.
  
  
           
  every 1 [ask patches with [pcolor = red] [if  not any? consumers-here                 ;; The strategy used by all retailers is to decrease their prices of some percentage. 
    [set price_per_kilo price_per_kilo - (%_reduce_red * (price_per_kilo / 100))]]]     ;; It's possible to set this percentage through the sliders. Immigrants of Out-group (%_reduce_blue)
  every 1 [ask patches with [pcolor = blue] [if not any? consumers-here                 ;; are supposed to have a higher percentage as their prices are cheaper.
    [set price_per_kilo price_per_kilo - (%_reduce_blue * (price_per_kilo / 100))]]]

    
  ask patches with [pcolor = blue] [if price_per_kilo <= cost_per_kilo [ifelse Cooperation [ ] ;; Due to their strategy to decrease their prices, all retailers can risk to have no income.
   [ifelse earning <= total_costs [set pcolor blue - 3] [set pcolor blue + 3]]]]               ;; In this case, they'll leave the square market as soon as price_per_kilo is equal or lower
  ask patches with [pcolor = red] [if price_per_kilo <= cost_per_kilo                          ;; than cost_per_kilo. For immigrant retailers, if Cooperation is run, they know they
   [ifelse earning <= total_costs [set pcolor red - 3] [set pcolor red + 3]]]                  ;; rely on the support of the social tax, so they can continue trading, even though 
                                                                                               ;; their risk to fail is higher.
  
  tick
  
end

to consumers_behaviour  ;; Commands to consumers are called by their colours, associated with their CR levels.
  
  ask consumers with [color = green] [ifelse any? neighbors with [pcolor = blue or pcolor = red]          ;; No CR and Low CR want to trade with the cheaper retailers, without taking into
    [move-to min-one-of neighbors with [pcolor = red or pcolor = blue] [price_per_kilo]] [fd 1 rt 360]]   ;; account if they are In-group or Out-group. As they can't know the prices of
                                                                                                          ;; all of the square market, they'll move to the cheapest
                                                                                                          ;; (min-one-of) of neighbors.
  
  ask consumers with [color = yellow][ifelse any? neighbors with [ pcolor = red]                          ;; Medium CR have a preference for In-group retailers (red) and will move towards
    [move-to min-one-of neighbors with [pcolor = red] [price_per_kilo]]                                   ;; the cheapest of them in the neighbors. If there aren't, they'll pass to the 
    [ ifelse any? neighbors with [pcolor = blue]                                                          ;; cheapest of Out-group (blue).
    [move-to min-one-of neighbors with [pcolor = blue] [price_per_kilo]] [fd 1 rt 360]]]
     
  ask consumers with [color = brown][ifelse any? neighbors with [ pcolor = red]                           ;; High CR will trade with In-groups (red) and move towards the cheapest of them,
    [move-to min-one-of neighbors with [pcolor = red] [price_per_kilo]] [fd 1 rt 360]]                    ;; and will walk around the square market until they haven't find one, not trading
                                                                                                          ;; with other retailers, that is, Out-group retailers.
                                                                                                         
                                                                                                         
  ask consumers with [cash > 0 and color = green ] [if [pcolor] of patch-here = blue [if [offer] of patch-here > 0 ;; Consumers can generate a request of kilos when the retailers they find
    [ifelse [price_per_kilo] of patch-here <= [cash] of self                                                       ;; has unless a kilo to trade and the price is lower than their money, 
    [set request floor (cash / [price_per_kilo] of patch-here)]  [run [back 1] left 90 fd 1 ]]]]                   ;; otherwise they go away. As they want to buy as many kilos as they
                                                                                                                   ;; can afford, request is done by dividing cash by the price required.
                                                                                                                  
  ask consumers with [cash > 0 and color = green ] [if [pcolor] of patch-here = blue [if [offer] of patch-here > 0 ;; Were the request they can generate lower than the offer, because they
    [ifelse  [request] of self <  [offer] of patch-here                                                            ;; can't afford to buy all the kilos, their purchase cost will be price
    [set cash cash - ( [price_per_kilo] of patch-here *  (request))]                                               ;; multipled by the request. Otherwise, the money to give is equivalent 
    [set cash cash - ( [price_per_kilo] of patch-here * [offer] of patch-here)]]]]                                 ;; to all the offer. No CR and Low CR (green) can trade both 
                                                                                                                   ;; with In-group (red) and Out-group (blue).
  
  ask consumers with [cash > 0 and color = yellow ] [if [pcolor] of patch-here = blue [if [offer] of patch-here > 0 ;; Medium CR (yellow) can trade with Immigrants (blue) and In-group (red)
    [ifelse [price_per_kilo] of patch-here <= [cash] of self                                                        ;; nevertheless their preference for In-groups. The process is the same
    [set request floor (cash / [price_per_kilo] of patch-here)]  [run [back 1] left 90 fd 1 ]]]]                    ;; of all consumers.
  
  ask consumers with [cash > 0 and color = yellow ] [if [pcolor] of patch-here = blue [if [offer] of patch-here > 0  
    [ifelse  [request] of self <  [offer] of patch-here
    [set cash cash - ( [price_per_kilo] of patch-here *  (request))]
    [set cash cash - ( [price_per_kilo] of patch-here * [offer] of patch-here)]]]] 
  
  ask consumers with [cash > 0 ] [if [pcolor] of patch-here = red [if [offer] of patch-here > 0                ;; Everyone can trade with In-groups (red). This is to specify that only
    [ifelse [price_per_kilo] of patch-here <= [cash] of self                                                   ;; High CR can't trade with Out-groups (blue) due to their prejudice bias.               
    [set request floor (cash / [price_per_kilo] of patch-here)]  [run [back 1] left 90 fd 1  ]]]]              ;; The process is the same for all the consumers.
  
  ask consumers with [cash > 0 ] [if [pcolor] of patch-here = red [if [offer] of patch-here > 0  
    [ifelse  [request] of self <  [offer] of patch-here
    [set cash cash - ( [price_per_kilo] of patch-here *  (request))]
    [set cash cash - ( [price_per_kilo] of patch-here * [offer] of patch-here)]]]] 
  
end