These functions allow learning games to be played upon networks.

  • play_learning() plays a DeGroot learning model upon a network.

  • play_segregation() plays a Schelling segregation model upon a network.

play_learning(.data, beliefs, steps, epsilon = 5e-04)

play_segregation(
  .data,
  attribute,
  heterophily = 0,
  who_moves = c("ordered", "random", "most_dissatisfied"),
  choice_function = c("satisficing", "optimising", "minimising"),
  steps
)

Arguments

.data

An object of a manynet-consistent class:

  • matrix (adjacency or incidence) from {base} R

  • edgelist, a data frame from {base} R or tibble from {tibble}

  • igraph, from the {igraph} package

  • network, from the {network} package

  • tbl_graph, from the {tidygraph} package

beliefs

A vector indicating the probabilities nodes put on some outcome being 'true'.

steps

The number of steps forward in learning. By default the number of nodes in the network.

epsilon

The maximum difference in beliefs accepted for convergence to a consensus.

attribute

A string naming some nodal attribute in the network. Currently only tested for binary attributes.

heterophily

A score ranging between -1 and 1 as a threshold for how heterophilous nodes will accept their neighbours to be. A single proportion means this threshold is shared by all nodes, but it can also be a vector the same length of the nodes in the network for issuing different thresholds to different nodes. By default this is 0, meaning nodes will be dissatisfied if more than half of their neighbours differ on the given attribute.

who_moves

One of the following options: "ordered" (the default) checks each node in turn for whether they are dissatisfied and there is an available space that they can move to, "random" will check a node at random, and "most_dissatisfied" will check (one of) the most dissatisfied nodes first.

choice_function

One of the following options: "satisficing" (the default) will move the node to any coordinates that satisfy their heterophily threshold, "optimising" will move the node to coordinates that are most homophilous, and "minimising" distance will move the node to the next nearest unoccupied coordinates.

See also

Other makes: create, generate, play, read, write()

Other models: play

Examples

  play_learning(ison_networkers, 
      rbinom(manynet::network_nodes(ison_networkers),1,prob = 0.25))
#> # A tibble: 9 × 32
#>   `Lin Freeman` `Doug White` `Ev Rogers` `Richard Alba` `Phipps Arabie`
#>           <dbl>        <dbl>       <dbl>          <dbl>           <dbl>
#> 1         0            0           0              0               0    
#> 2         0.211        0.139       0              0.224           0.368
#> 3         0.154        0.174       0.188          0.145           0.147
#> 4         0.174        0.165       0.156          0.171           0.181
#> 5         0.168        0.171       0.172          0.167           0.168
#> 6         0.170        0.169       0.168          0.170           0.171
#> 7         0.169        0.170       0.170          0.169           0.170
#> 8         0.170        0.170       0.169          0.170           0.170
#> 9         0.170        0.170       0.170          0.170           0.170
#> # ℹ 27 more variables: `Carol Barner-Barry` <dbl>, `Gary Coombs` <dbl>,
#> #   `Russ Bernard` <dbl>, `John Boyd` <dbl>, `Ron Burt` <dbl>,
#> #   `Pat Doreian` <dbl>, `Claude Fischer` <dbl>, `Brian Foster` <dbl>,
#> #   `Mark Granovetter` <dbl>, `Maureen Hallinan` <dbl>, `Paul Holland` <dbl>,
#> #   `Jack Hunter` <dbl>, `Davor Jedlicka` <dbl>, `Charles Kadushin` <dbl>,
#> #   `Ed Laumann` <dbl>, `Sam Leinhardt` <dbl>, `Joel Levine` <dbl>,
#> #   `Nan Lin` <dbl>, `Nick Mullins` <dbl>, `Don Ploch` <dbl>, …
  startValues <- rbinom(100,1,prob = 0.5)
  startValues[sample(seq_len(100), round(100*0.2))] <- NA
  latticeEg <- create_lattice(100)
  latticeEg <- add_node_attribute(latticeEg, "startValues", startValues)
  latticeEg
#> # A undirected network with 100 nodes and 342 ties
#> # A tibble: 100 × 1
#>   startValues
#>         <int>
#> 1           0
#> 2           1
#> 3           0
#> 4           1
#> 5           0
#> 6           1
#> # ℹ 94 more rows
#> # A tibble: 342 × 2
#>    from    to
#>   <int> <int>
#> 1     1     2
#> 2     1    11
#> 3     1    12
#> 4     2     3
#> 5     2    11
#> 6     2    12
#> # ℹ 336 more rows
  play_segregation(latticeEg, "startValues", 0.5)
#> [1] "Moving node 1 to node 16"
#> [1] "Moving node 4 to node 72"
#> [1] "Moving node 13 to node 90"
#> [1] "Moving node 3 to node 4"
#> [1] "Moving node 19 to node 39"
#> [1] "Moving node 40 to node 51"
#> [1] "Moving node 42 to node 40"
#> [1] "Moving node 44 to node 77"
#> [1] "Moving node 47 to node 25"
#> [1] "Moving node 52 to node 14"
#> [1] "Moving node 61 to node 37"
#> [1] "Moving node 73 to node 13"
#> [1] "Moving node 87 to node 24"
#> [1] "Moving node 95 to node 44"
#> [1] "Moving node 96 to node 47"
#> # A undirected network with 100 nodes and 342 ties
#> # A tibble: 100 × 1
#>   startValues
#>         <int>
#> 1          NA
#> 2           1
#> 3          NA
#> 4           0
#> 5           0
#> 6           1
#> # ℹ 94 more rows
#> # A tibble: 342 × 2
#>    from    to
#>   <int> <int>
#> 1     1     2
#> 2     1    11
#> 3     1    12
#> 4     2     3
#> 5     2    11
#> 6     2    12
#> # ℹ 336 more rows
  # autographr(latticeEg, node_color = "startValues", node_size = 5) + 
  # autographr(play_segregation(latticeEg, "startValues", 0.2), 
  #            node_color = "startValues", node_size = 5)