Rubin and Schneider (2021)
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
This is a replication of a model from Rubin and Schneider's 2021 paper "Priority and Privilege in Scientific Discovery," in which they argue that the social dynamics of credit attribution in scientific communities can create structural disadvantages in socially diverse science.
The priority rule in science is the social norm that awards credit to the first scientist or group of scientists to make a discovery. However, Rubin and Schneider argue that beliefs by individual scientists about who made the first discovery depends on their position in a social network. If two agents make a discovery at the same time (which tends to be a common occurence in science), who ends up obtaining credit for the discovery may depend heavily on who they are connected to in the network. This model demonstrates how members of a historically under-represented group (HUG) may be less connected than their historically entrenched counterparts (HEG), and therefore unfairly harmed by the priority rule.
HOW IT WORKS
The model begins with a number of fully connected scientists. Members of the HEG are represented by circles, while HUG members are represented by cubes.
At each step, a new scientist is added. The probability that this new scientist belongs to the HUG is determined by a logistic growth equation; as time progresses, this probability approaches the population proportion of the HUG. A new scientist randomly selects existing scientists to connect with, albeit with a bias. More specifically, a scientist's likelihood of being selected is directly proportional to its number of connections, or 'degree,' and its similarity to the new scientist.
Once the model includes more than 50 scientists, each new scientist has a 50% chance of connecting with all link-neighbors of the first scientist they choose to connect with. This scenario represents a scientific field that has become established and adopts practices for training new scientists. Additionally, once the network exceeds a specified size, older scientists 'retire,' along with all their connections.
To model an instance of simultaneous discovery and the subsequent attribution contest, one scientist from each group is randomly chosen (the selected HUG member turns blue, and the HEG member turns green). Then, at each time step, a randomly chosen scientist in the network turns either blue or green, depending on whether the closest non-red scientist is blue or green. This dynamic represents each scientist learning about a discovery from someone in the network who already holds a belief about the discoverer's identity. A group wins the attribution contest when a supermajority of scientists believe that a member of their group made the discovery.
The HEG advantage is calculated by running a specified number of contests and determining the difference between the proportion of contests won by an HEG member and those won by a HUG member.
HOW TO USE IT
Pressing the GO ONCE button adds one new scientist. To continuously add scientists, press GO.
The DISPLAY-CONTEST button runs an attribution contest.
The NUM-LINKS input determines the number of initial scientists and number of links a new scientist will create, minus the "advisors" it may also link to.
The POPULATION-PROPORTION input determines the background societal proportion of HUG members.
The HOMOPHILY input determines how strongly new scientists consider similarity between themselves and target scientists when deciding their link-neighbors.
The NUM-SCIENTISTS input determines the greatest possible size of the scientific community.
Press the HEG-ADVANTAGE button to print the HEG advantage. The NUM-CONTESTS input determines the number of contests to run when determining the HEG advantage.
THINGS TO TRY
Play with the inputs and compare your results with those of Rubin and Schneider's. Are they the same?
Advanced: Consider whether Rubin and Schneider's model assumptions accurately reflect real scientific communities. If not, change the process by which the network develops and contests are run to better reflect the real world. Do you still get the same results as Rubin and Schneider?
CREDITS AND REFERENCES
Rubin, H., & Schneider, M. D. (2021). Priority and privilege in scientific discovery. Studies in history and philosophy of science, 89, 202–211. https://doi.org/10.1016/j.shpsa.2021.08.005
The network mechanics of this model is based on: Wilensky, U. (2005). NetLogo Preferential Attachment model. http://ccl.northwestern.edu/netlogo/models/PreferentialAttachment. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL.
Comments and Questions
;;;;;;;;;;;;;;;;;;;;;;;; ;;; Setup Procedures ;;; ;;;;;;;;;;;;;;;;;;;;;;;; globals [ remover ;; tracks the number of ticks so we can "retire" scientists once the number of scientists reaches num-scientists ticks-on-contest ;; tracks the number of ticks used on display-contest to calibrate aspects of model which depend on time-steps ] turtles-own [group] ;; if a turtle has group = 0, it is a part of a HEG. If a turtle has group = 1, it is part of a HUG. to setup clear-all set-default-shape turtles "circle" ;; make the initial network of two turtles and an edge create-turtles num-links [ set color red create-links-with other turtles fd 8 ] set remover 3 - num-scientists set ticks-on-contest 0 reset-ticks end ;;;;;;;;;;;;;;;;;;;;;;; ;;; Main Procedures ;;; ;;;;;;;;;;;;;;;;;;;;;;; ;; go procedure for building and maintaining network to go ask turtles [set color red] ;; reset color if the model has just finished running display-contest ask links [ set color gray ] make-node set remover remover + 1 if remover >= 0 [ ask turtle remover [ die ] ] layout tick end ;; reports the difference between the proportion of contests won by a HEG member and the proportion of contests won by a HUG member to-report heg-advantage let hug-wins 0 let heg-wins 0 repeat num-contests [ ifelse run-contest = 0 [ set heg-wins heg-wins + 1 ] [ if run-contest = 1 [ set hug-wins hug-wins + 1 ] ] ] report (heg-wins - hug-wins ) / num-contests end ;; reports the winner of a contest to-report run-contest ;code for assigning contestants random-seed new-seed let winner nobody let hug-player one-of turtles with [group = 1] let heg-player one-of turtles with [group = 0] ask hug-player [set color blue] ask heg-player [set color green] while [count turtles with [color = red] != 0] [ let scientist one-of turtles with [color = red] let blues turtles with [color = blue] let greens turtles with [color = green] let blues-list sort blues let greens-list sort greens set blues-list map [i -> path-length scientist i ] blues-list set greens-list map [i -> path-length scientist i] greens-list let distance1 min blues-list let distance2 min greens-list ifelse distance1 < distance2 [ ask scientist [set color blue] ] [ ifelse distance2 < distance1 [ ask scientist [set color green] ] [ ask scientist [set color one-of [blue green]] ] ] ] ifelse (count turtles with [color = blue] > 66) [ set winner hug-player print ("Player from HUG wins!") ] [ ifelse (count turtles with [color = green] > 66) [ set winner heg-player print ("Player from HEG wins!") ] [ print ("Tie!") ] ] reset-contest ifelse winner != nobody [ report [group] of winner ] [ report 2] end ;; a procedure that displays each step of a attribution contest. to display-contest random-seed new-seed let winner nobody let hug-player one-of turtles with [group = 1] let heg-player one-of turtles with [group = 0] ask hug-player [set color blue] ask heg-player [set color green] while [count turtles with [color = red] != 0] [ let scientist one-of turtles with [color = red] let blues turtles with [color = blue] let greens turtles with [color = green] let blues-list sort blues let greens-list sort greens set blues-list map [i -> path-length scientist i ] blues-list set greens-list map [i -> path-length scientist i] greens-list let distance1 min blues-list let distance2 min greens-list print (word "The scientist is " distance1 " steps away from the closest blue scientist. " "The scientist is " distance2 " steps away from the closest green scientist.") ifelse distance1 < distance2 [ ask scientist [set color blue] ] [ ifelse distance2 < distance1 [ ask scientist [set color green] ] [ ask scientist [set color one-of [blue green]] ] ] tick set ticks-on-contest ticks-on-contest + 1 ] ifelse (count turtles with [color = blue] > 66) [ set winner hug-player print ("Player from HUG wins!") ] [ ifelse (count turtles with [color = green] > 66) [ set winner heg-player print ("Player from HEG wins!") ] [ print ("Tie!") ] ] end ;; procedure to reset a contest to reset-contest ask turtles [set color red] end ;; procedure to make a node and connect it with other nodes. to make-node create-turtles 1 [ set color red let community-proportion population_proportion / (1 + 10 * e ^ (-0.5 * (ticks - ticks-on-contest))) ;; here we use ticks-on-contest so that the ticks used in displaying a contest do not count towards the actual time-steps. ifelse random-float 1 <= community-proportion [ set group 1 set shape "box" set size 3 ] [ set group 0 ] let partners find-partners self let old-nodes map [i -> item 0 i] partners foreach old-nodes [ i -> create-link-with i [ set color green ] move-to i fd 8 ] ;; code for adding advisors if count turtles >= 50 [ let partner-list first partners let partner-turtle first partner-list let partner-link-neighbors sort [link-neighbors] of partner-turtle foreach partner-link-neighbors [ i -> if self != i [ ; Ensure we're not linking to ourselves let ran random-float 1 if ran < .5 [ create-link-with i [ set color blue ] ] ] ] ] ] end ;; procedure to find partners that a new node will connect to to-report find-partners [new-node] ;; issue with turtle 178 let old-nodes sort turtles with [self != new-node] let degrees sum map [i -> count [link-neighbors] of i] old-nodes let similarities sum map [i -> similarity new-node i] old-nodes let turtle-weights map [i -> list (i) (homophily * (similarity new-node i / (1 + similarities)) + (1 - homophily) * (count [link-neighbors] of i / degrees))] old-nodes ;; We weigh each turtle's chances of connecting based on their similarity and degree. See Rubin and Schneider (2021). report lottery-winners turtle-weights end ;; reports 1 if two nodes are in the same group and 0 otherwise. to-report similarity [new-node old-node] ifelse [group] of new-node = [group] of old-node [ report 1 ] [ report 0 ] end ;; procedure that determines the group of nodes a new node will connect to. to-report lottery-winners [turtle-weights] set turtle-weights shuffle turtle-weights let results [] repeat num-links [ let weights map [i -> item 1 i] turtle-weights let pick random-float sum weights let result nobody foreach turtle-weights [ i -> if result = nobody [ ifelse pick <= item 1 i [ set result i ] [ set pick pick - item 1 i ] ] ] if result != nobody [ ;;issue here set turtle-weights remove result turtle-weights set results lput result results ] ] report results end ;; a procedure that reports the shortest path-length between two turtles using depth-first search to-report path-length [start-turtle end-turtle] if start-turtle = end-turtle [ report 0 ] ; Path length is 0 if both turtles are the same let visited-nodes [] let queue (list (list start-turtle 0)) ; Queue contains pairs of turtle and path length while [not empty? queue] [ let current-item first queue let current-turtle item 0 current-item let current-length item 1 current-item set queue butfirst queue if not member? current-turtle visited-nodes [ set visited-nodes lput current-turtle visited-nodes if current-turtle = end-turtle [ report current-length ; Found the end turtle, report the path length ] ask current-turtle [ let next-neighbors link-neighbors with [not member? self visited-nodes] let next-neighbors-list sort next-neighbors foreach next-neighbors-list [ x -> set queue lput (list x (current-length + 1)) queue ] ] ] ] report -1 ; Return -1 or some indicator if no path is found end ;;;;;;;;;;;;;; ;;; Layout ;;; ;;;;;;;;;;;;;; ;; resize-nodes, change back and forth from size based on degree to a size of 1 to resize-nodes ifelse all? turtles [size <= 1] [ ;; a node is a circle with diameter determined by ;; the SIZE variable; using SQRT makes the circle's ;; area proportional to its degree ask turtles [ set size sqrt count link-neighbors ] ] [ ask turtles [ set size 1 ] ] end to layout ;; the number 3 here is arbitrary; more repetitions slows down the ;; model, but too few gives poor layouts repeat 3 [ ;; the more turtles we have to fit into the same amount of space, ;; the smaller the inputs to layout-spring we'll need to use let factor sqrt count turtles ;; numbers here are arbitrarily chosen for pleasing appearance layout-spring turtles links (1 / factor) (350 / factor) (20 / factor) display ;; for smooth animation ] ;; don't bump the edges of the world let x-offset max [xcor] of turtles + min [xcor] of turtles let y-offset max [ycor] of turtles + min [ycor] of turtles ;; big jumps look funny, so only adjust a little each time set x-offset limit-magnitude x-offset 0.1 set y-offset limit-magnitude y-offset 0.1 ask turtles [ setxy (xcor - x-offset / 2) (ycor - y-offset / 2) ] end to-report limit-magnitude [number limit] if number > limit [ report limit ] if number < (- limit) [ report (- limit) ] report number end
There is only one version of this model, created over 1 year ago by Sean Huang.
Attached files
No files
This model does not have any ancestors.
This model does not have any descendants.