Online Community Simulator

Online Community Simulator preview image

1 collaborator

Alberto_smile_avatar Alberto Cottica (Author)

Tags

communities 

Tagged by Alberto Cottica over 8 years ago

community management  

Tagged by Alberto Cottica over 8 years ago

networks 

Tagged by Alberto Cottica over 8 years ago

online 

Tagged by Alberto Cottica over 8 years ago

Visible to everyone | Changeable by everyone
Model was written in NetLogo 5.3.1 • Viewed 1227 times • Downloaded 43 times • Run 0 times
Download the 'Online Community Simulator' 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?

Online communities are a mix of bottom-up dynamics and top-down constraints and nudges. This is fundamental: they are often run (and paid for) organisations, seeking a return on their investment. At the same time, they derive their properties of speed and self-organisation from the freedom enjoyed by their members, within the framework set by the software and the social contract underpinning it.

Reflecting this dualism, agents in online community are also of two very different kinds. Most are ordinary members, who pursue their own individual objectives. A few are online community managers, who get paid to further the organisation's goal by creating engagement and mediating conflict. In doing so, the latter follow protocols: for example "leave a welcome comment to all new users".

We assume that community managers are trying to make the community (a) more active (more throughput) (b) more inclusive (a more even distribution of network connectivity); (c) more diverse in its contributions (a more even distribution of the number of comments authored by each member). We also assume that ordinary users prefer to interact with their friends. Friendships are created by interacting on the community. In the model, we represent this phenomenon by a network of intimacy, following the approach in [2]. Intimacy is additive, and it decreases with time (unless a new communication event refreshes it).

We model the online community as a network of interaction, in turn underpinned by the aforementioned network of intimacy. Next, we explore how different community management protocols (henceforth "policies") affect the shape of both networks.

Note that community management has a cost. I represent this in the model with the number of comments authored by the community manager. This allows us to think about efficiency: how much extra effort is required to manage the community vis-a-vis leaving it alone? And what does the extra effort buy in terms of activity, inclusivity, diversity?

HOW IT WORKS

There are two types of agents: participants and managers.

Upon initialization, we create one community manager, and a small number of community members (at least 2). We assume the latter to all be connected to each other by intimacy links of weight greater than zero.

At each time step, the following happens.

  1. Zero or more members join the community.
  2. Members decide whether to engage in communication. We assume this choice depends on their own chattiness (time-invariant propensity to intervene online), responsiveness (time-invariant propensity to engage when addressed by others) and the number of comments received in the previous period. This is based on empirical results in [1].
  3. Members who have decided to engage in communication now must choose one other member to communicate with. We assume that their choice depends on pairwise intimacy; the closer A feels towards B, the more likely she will choose B as the target of their communication. Communication events are encoded in communication links.
  4. The community manager engages in her own communication events, depending on the policies being enacted. Two policies are modeled: onboarding and engagement. In onboarding, she leaves a comment to each member who joined the community in the previous period. In engagement, she leaves one comment to each member who has authored a comment in the previous period. The community manager can also do both, or neither.
  5. The values of intimacy links are updated.
  6. Members decide whether to leave the community. They leave if the overall weight of their incoming intimacy links is below a certain threshold.

HOW TO USE IT AND MODEL INPUTS

The world becomes very crowded very fast. Try running the model with updates turned off and at maximimum speed.

Control parameters:

intimacy-strength: the preference members have to interact with their existing friends, as opposed to making new ones. founders: the number of "founding members". These members are created during setup and are all connected to each other by "intimacy links representing friends. chattiness: the baseline propensity of members to participate in the online conversation at each tick. If a member receives a comment now, she will be 20% more likely to write her own comment at the next tick. num-members: the number of members the community is supposed to reach. When it has reached this level, the model stops. onboard: tell the community manager to leave a welcome comment to every new member, at the date at which they join. engage: tell the community member to leave a feedback comment to every member that has left one or more comment during the previous tick.

Agent properties

Members have a join date; a time-variant membership strength; they can acquire temporarily extra chattiness when they receive comments from other members or the community manager. There are also properties keeping track of the member's latest activity and whether or not she is stil active.

Link properties

Interaction links have a property storing the number of time member i has left a comment to member j. Another property keeps track of when i and j last communicated.

Intimacy links have a strength property. Members use it to decide who they should leave a comment to at each step.

THINGS TO NOTICE AND MODEL OUTPUTS

The scatterplot to the top right represents the membership strength of all members, ranked by date of joining the community. Founders and early adopters are to the right.

A "healthy" online community is active, inclusive, diverse and fidelising. Evaluation metrics are reported in the four monitors to the right of the world. In the model, activity is measured by the number of comments left by members (those of the community manager are not included). The ability to generate fidelisation is measured by the sum of the membership strength across all members. Inclusivity is measured by the number of members that feel so excluded as to drop out of the community, and by the Gini coefficient of membership strength. Diversity of contribution is measured by the Gini coefficient on the distribution of comment authorships.

As intimacy grows, the scatterplot on the left tends to partition out into older members, on average more connected and active, and newer ones, in general less connected and active. This is the main result proposed by Kim, Jo and Kim (2015), though this model makes some different assumptions.

THINGS TO TRY

Turn the policies of the community manager on and off. Do you see any improvement in the evaluation metrics? How is the improvement related to the parameters?

I intend to mount a full investigation of what happens under different policies and across the parameter space. You are encouraged to do so too!

EXTENDING THE MODEL

Make chattiness and responsiveness agent-specific variables. The expected (not very interesting) microlevel consequence is that the least chatty, least responsive people drop out earlier: self-selection is at work, and people who stay engage in the community are those who enjoy online debate most. There could, however, be more interesting consequences on the level of activity.

NETLOGO FEATURES

In online communities, it is normal for two members to interact many times over time. This would be better modeled in a framework that accepts parallel edges (like Tulip, a Python library for network analysis).

Also, link primitives "source of link" and "target of link" would make programming easier. Making the model led to an interesting discussion on programming with link properties in NetLogo: https://www.complexityexplorer.org/courses/23-introduction-to-agent-based-modeling/forum#!/23/-project:link-source-and-target-as-i

Noteworthy: I implemented a version of this model in Python, using the Tulip network library. The NetLogo model appears to be about 10 times faster to compute than the Python one. I doubt I might have done something wrong. Feedback would be welcome.

RELATED MODELS

I am building a version of this model in Python. Check back in https://github.com/albertocottica

CREDITS AND REFERENCES

[1] Alberto Cottica. The economic logic of online community management: an empirical study. 2016. [2] Kibum Kim, Woo Seong Jo, and Beom Jun Kim. Group intimacy and network formation. In 2015 11th International Conference on Signal-Image Technology & Internet-Based Systems (SITIS), pages 366–370. IEEE, 2015.

  • The layout procedure is adapted from 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.
  • The procedure to compute the Lorenz curve and Gini coefficient is adapted from Wilensky, U. (1998). NetLogo Wealth Distribution model. http://ccl.northwestern.edu/netlogo/models/WealthDistribution.
  • Thanks is due to Bart Wauters, Aabir, Miguel Pessanha and Evgeniy Kuzmin, all fellow students of the Complexity Explorer MOOC "Introduction to Agent-Based Modelling", Fall 2016

Comments and Questions

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

Click to Run Model

globals [ total-membership-strength decay total-comments gini-index-membership lorenz-points gini-index-comms ]

turtles-own [my-comments]

breed [ members member ]
members-own [ extra-chattiness membership-strength join-date latest-interaction active?]

breed [ managers manager ]

directed-link-breed [ intimacy-links intimacy-link ]
intimacy-links-own [ strength ]

directed-link-breed [ interaction-links interaction-link ]
interaction-links-own [ comments latest ] ;; NetLogo does not support multiple edges! The "latest" property keeps
                                         ;; track of the last time member i communicated with members j

to setup
  ca
  reset-ticks
  set decay 1 / 100
  set-default-shape turtles "circle"
  ;; the initial network is a clique of numerosity founders + 1 manager
  create-managers 1 [ set color red  set my-comments 0]
  create-members founders [ set color white set join-date -1 set active? True set my-comments 0]
  ask members [ create-intimacy-links-to other members ]
  ask intimacy-links [ set strength 1 ]
  ask members [ set extra-chattiness 0 ]
  layout
  update-membership-strength
  update-lorenz-and-gini
  repeat count members [ tick ]
  reset-timer
end 

to go
  create-members 1 [
    set color white
    setxy random-xcor random-ycor
    set join-date ticks
    set active? True
    set my-comments 0
    ]
  converse
  update-intimacy-links
  update-membership-strength
  if count members > num-members [ show ( word "Time elapsed: " timer " seconds.") stop ]
  manage-community
  update-lorenz-and-gini
  update-gini-comms
  tick
end 

to converse
  ;; each member must decide whether to engage in interaction.
  ;; probability of engaging increases if member received communication the previous period.
  ask members with [ active? ] [
    if my-in-interaction-links with [ latest = ticks - 1 ] != nobody [ ;; need to distinguish between in-interaction-links of community managers and those of members. Need an agentset with two "with" conditions!
      set extra-chattiness 0.2
      ]
    if random-float 1.0 <= chattiness + extra-chattiness [
      connect
    ]
    set extra-chattiness 0 ;; after the decision to connect reset the extra chattiness
  ]
  ;; layout
end 

to connect
  ;; the member has decided to engage, now she must select the target of her communication.
  ;; average number of targets is 1
  ;; iterate over other members. Prob of creating an interaction-link with another member depends
  ;; on (relative) strength of intimacy-links with it
  ;; compute each numerator and decide whether to engage.
  let denominator count members ;; the denominator of equation (1) in the PDF file is at least count members
  let connect? False
  ask other members [
    let strength1 0
    let strength2 0
    if in-intimacy-link-from myself != nobody [
      ask in-intimacy-link-from myself [ set strength1 strength ]
      if out-intimacy-link-to myself != nobody [
        ask out-intimacy-link-to myself [ set strength2 strength ]
        set denominator denominator + 1 + intimacy-strength * strength1 * strength2
      ]
    ]
  ]
  ask other members [
    let numerator 1
    let strength1 0
    let strength2 0
    if in-intimacy-link-from myself != nobody [
      ask in-intimacy-link-from myself [ set strength1 strength ]
      if out-intimacy-link-to myself != nobody [
        ask out-intimacy-link-to myself [ set strength2 strength ]
        set numerator 1 + intimacy-strength * strength1 * strength2
      ]
    ]
    if numerator / denominator > random-float 1.0 [  ;; roll the dice for connecting each other member
      set connect? True  ;; keep track that at least one connection happened
      set my-comments my-comments + 1
      set total-comments total-comments + 1
      create-interaction-link-from myself [ set color 93 ] ;; if there already was one, the instruction is ignored
      ask in-interaction-link-from myself [
          set latest ticks
          set comments comments + 1
        ]
        create-intimacy-link-from myself ;; if there already was one, the instruction is ignored
        ask in-intimacy-link-from myself [ set strength strength + 1]
      ]
  ]
  if connect? = True [ set latest-interaction ticks ]
end 

to update-intimacy-links
  ask intimacy-links [
    set strength strength / ( 1 + decay )
  ]
end 

to update-membership-strength
  ask members with [ active? ] [
    let ms 0
    ask my-in-intimacy-links [
      set ms ms + strength
    ]
    set membership-strength ms
    if membership-strength < threshold and ticks - join-date > 50 [
      set active? False
      set color grey
      set membership-strength 0
      ]
    set total-membership-strength total-membership-strength + ms
  ]
end 

to manage-community
  if onboard = True [
    ask managers [ do-onboarding ]
  ]
  if engage = True [
    ask managers [ do-engagement ]
  ]
end 

to do-onboarding
  if ticks > 0 [
    create-interaction-links-to members with [ join-date = ticks - 1 ] [
      set latest ticks
      set comments 1
    ]
    create-intimacy-links-to members with [ join-date = ticks - 1  ] [
      set strength 1
    ]
    set my-comments my-comments + count members with [ join-date = ticks - 1 ] ;; in this model this is always 1.
  ]
end 

to do-engagement
  if ticks > 0 [ ;; to avoid generalized engagement in the first tick
    create-interaction-links-to members with [ latest-interaction = ticks - 1 ] [ set color 93 ] ;; if it's already there, it will be ignored
    create-intimacy-links-to members with [ latest-interaction = ticks - 1 ] ;; ditto
    let this-tick-comms 0
    ask members with [ latest-interaction = ticks - 1 ] [
      ask in-interaction-link-from myself [
        set latest ticks
        set comments comments + 1
        set this-tick-comms this-tick-comms + 1
      ]
      ask in-intimacy-link-from myself [ set strength strength + 1 ]
    ]
    set my-comments my-comments + this-tick-comms
  ]
end 

;; ============ REPORTERS ========================

;; COMPUTE LORENZ CURVE AND GINI COEFFICIENT
;; adapted from Wilensky, U. (1998). NetLogo Wealth Distribution model.
;; http://ccl.northwestern.edu/netlogo/models/WealthDistribution.
;; this procedure recomputes the value of gini-index-reserve
;; and the points in lorenz-points for the Lorenz and Gini-Index plots

to update-lorenz-and-gini
  let sorted-ms sort [membership-strength] of members
  let total-ms sum sorted-ms
  let ms-sum-so-far 0
  let index 0
  set gini-index-membership 0
  set lorenz-points []

  ;; now actually plot the Lorenz curve -- along the way, we also
  ;; calculate the Gini index.
  ;; (see the Info tab for a description of the curve and measure)
  repeat count members [
    set ms-sum-so-far (ms-sum-so-far + item index sorted-ms)
    set lorenz-points lput ((ms-sum-so-far / total-ms) * 100) lorenz-points ;; lput is like append in Python
    set index (index + 1)
    set gini-index-membership
    gini-index-membership +
    (index / count members ) -
    (ms-sum-so-far / total-ms )
  ]
end 

to-report dropouts
  report count members -  count members with [ active? ]
end 

to update-gini-comms ;
  let sorted-mc sort [my-comments] of members
  let total-mc sum sorted-mc
  let mc-sum-so-far 0
  let index-comms 0
  set gini-index-comms 0

  ;; calculate the Gini index.
  repeat count members [
    set mc-sum-so-far (mc-sum-so-far + item index-comms sorted-mc)
    set index-comms (index-comms + 1)
    set gini-index-comms
    gini-index-comms +
    (index-comms /  count members ) -
    (mc-sum-so-far / (total-mc + 0.000001 ))
  ]
end 


;; =============================================================
;; LAYOUT PROCEDURE
;; stolen from the preferential attachment model by Uri Wilensky

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) (15 / factor) (4 / 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 

to-report manager-comms
  report [my-comments] of turtle 0
end 
;; =================================================

There is only one version of this model, created over 8 years ago by Alberto Cottica.

Attached files

File Type Description Last updated
Online Community Simulator.png preview Preview for 'Online Community Simulator' over 8 years ago, by Alberto Cottica Download

This model does not have any ancestors.

This model does not have any descendants.