Rubin and Schneider (2021)

No preview image

1 collaborator

Default-person Sean Huang (Author)

Tags

(This model has yet to be categorized with any tags)
Visible to everyone | Changeable by the author
Model was written in NetLogo 6.4.0 • Viewed 261 times • Downloaded 11 times • Run 0 times
Download the 'Rubin and Schneider (2021)' 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 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

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

Click to Run Model

;;;;;;;;;;;;;;;;;;;;;;;;
;;; 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.