Social Dance Lab help
Model version 1.5. This page is in two parts: first how the simulation works, then every parameter in detail. Links in the lab open the matching section here.
Part 1 — How the simulation works
Social Dance Lab simulates one social dance evening. A synthetic population of dancers arrives, the evening is split into sets (one or two songs each), and in every set each dancer decides whether to rest or seek a dance, where to wait, whether to invite someone, whom to invite, and whether to accept an invitation received. Everything that happens is logged, and the result is shown from two perspectives: one dancer (Individual) and the whole room (Population).
The purpose is to study how invitation conventions (who may invite whom, and when), spatial conventions (waiting rows, a social area), the population mix (categories, personas, ages, skills) and individual behaviour shape who dances with whom, how many sets people dance, and how unequal the dance opportunities are.
The behavioural rules below are stated model assumptions, not observed facts. Every number is editable. A result is a consequence of the assumptions you chose, not a prediction about real people.
Assortative selection
The central assumption is that partner selection is assortative with an upward reach: dancers prefer partners near their own level — in fact a little above it (the preferred level above own), up to a ceiling beyond which someone far better is less appealing. The closer a candidate is to that preferred level, the more likely an invitation and an acceptance. It is judged on several dimensions at once:
- Skill: a dancer looks for someone a little more skilled than themselves, up to a ceiling. Experts seek experts (there is nobody above them to reach for); beginners reach up toward intermediate dancers rather than settling for other beginners.
- Age: an age gap counts against a candidate; the age span sets how many years make a mismatch.
- Appearance: perceived attractiveness, judged relative to the dancer's own level with the same slight upward reach and ceiling, so people sort into tiers rather than everyone chasing the same few.
- Familiarity: having danced together before counts for or against, depending on the dancer's familiarity preference.
Each dancer weighs these dimensions with their partner evaluation weights, which come from their persona. The weighted sum is the match score. An initiator invites the available candidate with the highest match score; a recipient accepts when the match score is good enough relative to their selectiveness.
Perception is subjective: each dancer sees other people's skill and attractiveness with their own small, fixed error (perception noise), so two dancers never rank the room identically.
What assortative selection implies for the results. Dancers cluster into tiers of similar skill, age and appearance. Inequality of dance opportunities then comes less from a universal ranking and more from how the tiers line up across categories: if the men's and women's distributions differ (for example more beginners on one side), some people in the larger tier find few acceptable matches, and the rules of the evening decide who ends up sitting out. A person who is unusual in the room (very young, very skilled, or the only beginner) can dance a lot or very little depending on whether anyone similar is available.
What happens in one set
- Rules for this set. The schedule says which categories may invite and which may be invited in this set, and whether that rule is strict or soft.
- Rest or seek. Every free dancer decides to sit this set out or to seek a dance. Tired dancers and those on a long streak rest more; sociable ones less. A seeker then picks a place to wait: their category's default zone (the waiting row) or another zone, according to their zone compliance.
- Decide to invite. Each seeker who is allowed to invite decides whether to do so, driven by initiative, confidence, recent rejections and how long they have been waiting.
- Choose whom to invite. The initiator looks at a sample of the available, role-compatible, eligible candidates (candidates considered), scores each one with their partner evaluation weights, and invites the best match. Candidates standing outside an invitation zone score lower (zone approach, outside-zone modifier).
- Accept or decline. Invitations are resolved simultaneously. A recipient with several invitations considers the best match first and accepts or declines each one in turn. Acceptance depends on the match versus their selectiveness, their energy, and the social cost of declining where they stand. Two people who invited each other pair without a roll.
- Further rounds. An initiator whose chosen partner went with someone else or declined tries their next-best available candidate, for up to five rounds within the same set. This is the assortative cascade: the best-matched pairs leave the pool first, then the next best, until nobody can pair any more. It is why most of the room dances rather than only the first non-colliding pairs.
- Dance. Paired dancers are on the floor for this set, lose a little energy, and remember each other. Everyone who sought a dance but did not get one is logged with the reason (not invited, declined all, was declined, not eligible).
Invitation systems
An invitation system is a schedule of intervals. Each interval says who may initiate, who may receive, and how strict that is. The Finnish lavatanssit preset ships three systems:
- Sekahaku: everyone may invite throughout the evening. The rule is soft: nothing is forbidden, but an approach that goes against the convention carries a penalty and is cheap to decline.
- Vuorohaku: men's and women's turns alternate in blocks (60 minutes by default). Strict: outside your turn you cannot invite at all.
- Miestenhaku + naistentunti: men invite all evening except for one window (60 or 90 minutes) during which only women invite. Strict.
Strict removes eligibility: a dancer whose category is not listed cannot invite (or be invited) in that interval. Soft keeps everyone eligible but applies the soft penalty to approaches the convention does not expect, and makes declining such an approach free of social cost.
Zones
Space is a handful of named zones, not coordinates. Invitation zones (the waiting rows) are where people expect to be invited: approaching someone there is natural and declining there is socially costly. A social zone (the hall) is where approaching is less expected and declining is cheap. The dance floor and the rest area are automatic. Standing in a zone never forces anyone to accept; it only changes probabilities.
Reproducibility and sharing
Every result-affecting setting, the seed and the model version are encoded in the experiment link. The same link always reproduces the same population, the same decisions and the same statistics. Change one parameter and keep the seed to compare conditions on the same people; randomise the seed to see how much the outcome varies. Copy experiment link puts the canonical link on the clipboard; superusers can also save experiments by name.
The population is drawn from its own random stream, so changing the invitation system (or any rule) keeps exactly the same dancers.
The two views
Population shows totals, averages, the two Gini coefficients, the share who never danced, acceptance and decline rates, distributions over sets, and breakdowns by persona, category, role, age, attractiveness, skill and waiting zone. Individual shows one dancer: their counts, percentiles against everyone and against similar people, a per-set timeline and the full decision log with every factor that went into each decision. Both views read the same run; switching between them never re-runs the simulation. A dot next to the view names means parameters changed since the last run; clicking re-runs.
Suggested workflow
- Pick an invitation system and run.
- Look at the Population view: who dances, who sits out, how unequal.
- Pick a dancer in the Individual view and read their decision log to see why.
- Change one thing (system, category shares, a persona mix, a zone cost) and run again with the same seed.
- Randomise the seed a few times to see which differences are robust.
Part 2 — Parameters in detail
Each parameter below assumes assortative selection: unless stated otherwise, "a better match" means more similar in skill, age and appearance from the chooser's own point of view.
Experiment
- Seed
- Integer 0 to 2 147 483 647. Fixes every random draw. Same seed, same settings, same model version → identical run. Keep it when comparing conditions; randomise it to explore variability.
- Participants
- Number of dancers, 2 to 200. Larger rooms give every dancer more similar candidates, so assortative matching finds partners more easily and fewer people sit out; small rooms expose mismatches between categories.
- Dance sets
- Number of sets in the evening, 1 to 50. Together with minutes per set it may not exceed 5 hours. More sets let energy, familiarity and prior rejections accumulate.
- Min per set
- Minutes per set (one or two songs). Only converts sets to clock time for the schedule and the 5-hour cap; the engine advances in whole sets.
- Invitation system
- Which schedule of initiator and recipient rules applies (see systems). Switching it replaces the schedule under Invitations but keeps every other setting, so systems can be compared on identical populations.
- Categories
- Share of the population in each invitation category (percent, normalised). In the lavatanssit preset the categories are miehet (lead) and naiset (follow), 40 / 60 by default. With assortative matching the smaller category is in demand and tends to dance more, and an imbalance leaves part of the larger category without a similar partner every set.
- Persona mix per category
- Percent of each persona within each category (each column normalised). This is how you give one side more newcomers or more experts. Because selection is assortative, an unequal mix across categories directly creates mismatched tiers: experts on one side with no experts to match on the other end up either dancing down the skill ladder (if their weights allow) or sitting out.
Personas
A persona is a behavioural archetype: a set of attribute averages, a set of partner evaluation weights and two tendencies. Individuals are drawn around the averages, so people vary within a persona. Add, rename or remove personas freely; the default six are described under presets.
- Name
- Label used in the views and breakdowns.
- Share of this persona in the population, used only where a category has no explicit persona mix.
Attribute means (0–1)
Each dancer's attribute is drawn from a normal distribution around the persona mean (spread 0.1 to 0.15 in the shipped personas) and clipped to 0–1.
- skill
- Dancing ability. The core assortative dimension: dancers seek partners a little above their own perceived skill (the preferred level above own), and the skill match weight says how much that matters to them. A persona with high skill and a high skill-match weight only accepts other skilled dancers.
- confidence
- Raises the probability of deciding to invite. Does not change whom they invite.
- attractiveness
- Perceived physical attractiveness as seen by others (with each observer's own noise). It is judged relative to the chooser's own level with a slight upward reach through the appearance weight; it is not a universal ranking.
- sociability
- Lowers the urge to rest. Sociable dancers stay available more sets.
- risk aversion
- Multiplies the discouraging effect of recent rejections on inviting. Risk-averse dancers stop inviting after being declined.
- selectiveness
- The match threshold for accepting an invitation. The acceptance logit uses (match score − selectiveness): a selective dancer declines anyone who is not a close match in skill, age and appearance, a non-selective dancer accepts almost any invitation. Shipped selectiveness is low and the acceptance baseline high, so declining is rare (about 3%, as at a real evening) and about 70% of the room dances each set.
- familiarity pref
- Above 0.5 the dancer prefers people they have already danced with — more so the more times they have danced together this evening; below 0.5 they prefer new partners. Multiplied by the familiarity weight.
- energy max
- Starting and maximum energy. Energy drops a little per dance and recovers when resting or idle; low energy makes resting and declining more likely.
- initiative
- Willingness to invite. The strongest single driver of the initiate decision.
Partner evaluation weights (0–5)
How much each similarity dimension counts when this persona scores a candidate. Every factor is a value between −1 (worst) and +1 (best) multiplied by its weight; the sum is the match score used both for choosing whom to invite and for accepting. Raising one weight makes that dimension dominate the sorting.
- skill match
- +1 when the candidate's perceived skill is the dancer's own skill plus the preferred level above own (0.15 by default), falling to −1 half a scale away in either direction, clamped at the top. The main assortative force; the technique purist weighs it highest.
- age match
- +1 for the same age, falling to −1 at the age span (15 years by default). High weight gives strong age sorting.
- appearance
- Assortative on perceived attractiveness with the same upward reach as skill: +1 when the candidate's attractiveness is the dancer's own plus the preferred level above own, falling off below and further above, clamped at the top.
- familiarity
- −1 for a stranger, climbing with each dance already shared this evening to +1 after three (within-event only; there is no memory of past events), multiplied by (2 × familiarity pref − 1). So a dancer with familiarity pref 0.8 increasingly favours a partner the more they have danced together, one with 0.2 avoids them.
- location
- Where the candidate is standing: the zone's approach modifier (scaled to −1..+1) plus the outside-zone modifier if they are not in an invitation zone. High weight means the dancer only invites people in the rows.
- rejection risk
- −1 if this candidate already declined the dancer earlier in the evening, else 0. High weight means one refusal is final.
- repeat
- Applies only to the partner of the immediately preceding set, with the value of the repeat-partner modifier (negative by default: people rarely dance the next set with the same partner).
Tendencies
- zone compliance (0–1)
- Probability that a seeking dancer waits in their category's default zone (the row). Otherwise they choose among the other waiting zones by their draw weights. Low compliance puts people in the hall, where they are approached less and decline more freely.
- rest bias (−2–2)
- Added to the rest decision. Positive personas sit out more sets; negative ones hardly ever rest.
Invitations (schedule)
- Schedule
- Up to twelve intervals that must cover every set exactly once, in order. Each row is one interval. Leave start and end empty for unused rows. Switching the invitation system rewrites these rows.
- from
- First set of the interval (0-based).
- to
- End set, exclusive. The next interval starts here.
- label
- Name shown in the per-set chart and the decision log, for example "Naistentunti".
- initiators
- Categories allowed (strict) or expected (soft) to invite in this interval, or everyone.
- recipients
- Categories that may be invited, or any role-compatible dancer.
- strength
- Strict removes eligibility; soft only penalises unexpected approaches and makes declining them free (see strict and soft).
- soft penalty (0–5)
- Logit penalty on the decision to invite when the approach is not expected under a soft rule. 0 makes a soft rule meaningless, 3 or more makes it almost strict.
- Reset to defaults
- Discards every edit and reloads the preset with its default system.
Advanced settings
Zones
One row per waiting zone of the preset (rows and hall). The floor and the rest area have no settings.
- Approach (0–1)
- How natural it is to approach someone standing here. Enters the candidate score through the location factor. 1 for the rows, 0.4 for the hall by default.
- Decline cost (0–1)
- Social cost of declining an invitation received here, multiplied by the accept: social cost weight. 0.8 in the rows (declining is awkward), 0.2 in the hall. High decline cost makes people accept mismatches they would otherwise refuse, which weakens assortative sorting at the acceptance step.
- Accept modifier (−1–1)
- Added to the acceptance logit for invitations received here, times accept: zone modifier.
- Draw (0–10)
- Relative weight of this zone when a seeker does not go to their default zone. 0 means nobody chooses it voluntarily (the rows are only reached by compliance).
Norms
- Approach modifier outside invitation zones (−1–1)
- Added to the location factor for candidates not standing in an invitation zone. −0.5 by default: people in the hall are invited less.
- Decline cost modifier outside invitation zones (−1–1)
- Added to the decline cost when the recipient is not in an invitation zone. −0.3 by default: declining in the hall is cheaper.
- Repeat-partner modifier (−2–2)
- Value of the repeat factor for last set's partner. Negative discourages dancing two sets in a row with the same person.
- Candidates considered per invitation (1–30)
- How many available candidates an initiator actually looks at before choosing the best match. Small numbers model limited attention and make matching less perfectly assortative; 20 by default.
- Perception noise spread (0–1)
- Width of each observer's fixed error when judging another dancer's skill and attractiveness. 0 means everyone sees true values and sorting is exact; 0.2 by default.
Decision weights
The intercepts and weights of the four decisions, shared by all dancers. Each decision is a logistic probability: intercept + Σ weight × factor. The Individual view's decision log shows the contributions.
| Weight | Default | Effect |
|---|---|---|
rest_0Rest: intercept | -3.1 | Baseline urge to sit a set out. Very negative means almost nobody rests unless tired. |
rest_energyRest: low energy | 3.0 | How strongly low energy pushes a dancer to rest. Multiplied by (1 − energy). |
rest_streakRest: per consecutive dance | 0.1 | Added per consecutive dance just completed. Makes long streaks end with a break. |
rest_socialRest: sociability (negative) | 1.0 | Sociable dancers rest less. Multiplied by sociability and subtracted. |
rest_idleRest: per set without dancing (negative) | 0.3 | Each set without a dance (up to 10) lowers the urge to rest: people who have been waiting keep waiting. |
energy_danceEnergy cost per dance | 0.02 | Energy spent per dance. Energy starts at the persona's energy max and never goes below 0. |
energy_restEnergy gained per resting set | 0.15 | Energy regained per resting set. |
energy_idleEnergy gained per idle set | 0.05 | Energy regained per set spent seeking without dancing. |
init_0Initiate: intercept | 2.0 | Baseline willingness to invite. High positive means nearly everyone who is allowed to invite does. |
init_initiativeInitiate: initiative | 2.0 | Multiplied by the dancer's initiative attribute. |
init_confInitiate: confidence | 1.0 | Multiplied by confidence. |
init_riskInitiate: risk aversion × recent rejections (negative) | 1.0 | Multiplied by risk aversion and by the number of recent rejections, then subtracted. Rejections discourage the risk averse. |
init_idleInitiate: per set without dancing | 0.15 | Added per set without a dance (up to 10). Waiting makes inviting more likely. |
acc_0Accept: intercept | 0.8 | Baseline willingness to accept an invitation. Shipped positive (0.8) so that declining is rare (about 3%), as at a real evening; lower it to make dancers pickier about who they accept. |
acc_compatAccept: compatibility minus selectiveness | 2.5 | Multiplied by (normalised match score − selectiveness scaled to −1..1). This is where assortative acceptance happens: a good match is accepted, a poor match from someone far away in skill, age or appearance is declined. |
acc_energyAccept: energy | 0.5 | Multiplied by the recipient's current energy. Tired dancers decline more. |
acc_costAccept: social cost of declining | 1.0 | Multiplied by the social cost of declining in the recipient's zone. High cost makes people accept invitations they would otherwise refuse. |
acc_priorAccept: previously declined this person (negative) | 1.5 | Subtracted when the recipient has already declined this same person earlier in the event. |
acc_zoneAccept: zone modifier | 1.0 | Multiplied by the recipient zone's accept modifier. |
age_spanAge span for age match (years) | 15.0 | Years of age difference at which the age match factor reaches its minimum (−1). Smaller span means stricter age sorting. |
match_upwardPreferred level above own (skill & appearance) | 0.15 | How far above their own level dancers prefer a partner, on the 0–1 skill and attractiveness scale. 0 seeks an exact match; 0.15 (default) seeks slightly upward. Desirability peaks there and falls off below it and further above it, and is clamped at the top of the scale, so the most skilled or attractive have nobody above to reach for. |
Focal dancer
Optionally replace dancer 0 with a fully specified person so the Individual view can show "someone like this" inside the same population. Everyone else is unchanged.
- Persona
- Which persona's weights and tendencies the focal dancer uses.
- Category
- Invitation category, and therefore the default waiting zone and the schedule rules that apply.
- Role
- Dance role; only compatible roles can pair (lead with follow by default).
- Age
- Exact age; with assortative age matching this decides which age tier they sort into.
- Attributes
- Exact 0–1 values; empty fields take the persona mean. Set skill or attractiveness far from the room's typical values to see what happens to an outlier.
Results
Population view
- Share of all participants on the floor in a typical set (each couple is two people). The headline "how busy is the floor" figure; about 70% with the shipped defaults. Note that the per-set chart plots this in people, so 70 of 100 — not the 35 couples — is the line to read.
- Couple dance sets
- Number of pairs that danced, summed over all sets. A pair is two people, so this is half the person-dances.
- Mean dances / person
- Average number of sets danced per participant.
- Median dances / person
- The middle participant's count; compare with the mean to see skew.
- Gini, dances
- Inequality of dance counts: 0 when everyone danced equally often, approaching 1 when a few people took all the dances. Computed as Σ|xᵢ − xⱼ| / (2 n Σx). Undefined when nobody danced.
- Gini, invitations received
- The same measure on invitations received. Comparing it with the dance Gini separates being asked from actually dancing.
- Never danced
- Share of participants with zero dances.
- Invitations sent
- All invitations over the evening, including retries in later rounds.
- Acceptance rate
- Accepted ÷ (accepted + declined). Invitations lost because the recipient was already taken are not counted here.
- Decline rate
- 1 − acceptance rate.
- Dances per available set
- A person's dances divided by their non-resting (seeking or dancing) sets: how much of the time they could dance they actually danced. About 0.74 with the shipped defaults.
- Invitation system
- The invitation system (variant) this run used — sekahaku, vuorohaku or miestenhaku + naistentunti — so the result is labelled with the convention that produced it.
- Mean sets resting
- Average number of sets a participant chose to sit out.
- Charts
- The dance-count distribution (how many people danced 0, 1, 2 … sets) and the per-set line of people dancing and people seeking (both counts of people, not couples), which shows the effect of the schedule over the evening.
- Breakdowns
- The same measures per group: persona, invitation category, role, 10-year age band, attractiveness quartile, skill quartile, or main waiting zone. Groups smaller than five are not reliable.
Individual view
- Dancer
- Any participant, or the focal dancer if one is defined. Changing the dancer never re-runs the simulation.
- Dances
- Sets this dancer danced.
- Unique partners
- Distinct people danced with, and how many of them more than once.
- Invitations sent
- Invitations this dancer made, and how many were accepted.
- Invitations received
- Invitations this dancer got, and how many they declined.
- Sets available, no dance
- Sets spent seeking without getting a dance.
- Sets resting
- Sets the dancer chose to sit out.
- Percentiles
- Where this dancer's dance count falls among everyone, among the same persona and among the same category (shown only when the comparison group has at least five people).
- Participation per set
- One cell per set: danced, sought without dancing, rested, or not eligible to invite or be invited.
- Decision log
- Every decision in order, with its probability and, when expanded, each factor's contribution in logit units. Positive values favour the outcome named first (rest, initiate, accept). This is where you can see why a match was declined or why someone never invited.
Presets
Finnish lavatanssit: a four-hour pavilion evening of 40 six-minute sets, categories miehet (40%, lead) and naiset (60%, follow), waiting rows miestenrivi and naistenrivi as the invitation zones, the sali as a social zone, and three invitation systems (above). Its simplifications are visible and editable: one role per category, the same persona mix on both sides, ages around 52.
The six shipped personas: Enthusiast (invites readily, accepts almost anyone), Cautious newcomer (low skill and confidence, rarely invites, prefers familiar partners, very sensitive to rejection), Technique purist (skilled, strongest skill-match weight), Social butterfly (very sociable, avoids repeats), Selective expert (skilled, in demand, highest selectiveness) and Quiet regular (moderate, strongly prefers known partners).
Limits and assumptions
- Caps
- At most 200 participants, 50 sets, 30 minutes per set and a 5-hour event, so a run finishes within a request. Matching retries up to 5 rounds per set.
- Assumptions
- Only pairwise dances; one dance per set per person; discrete zones; subjective but fixed perception; no social networks beyond "danced before"; no learning across evenings. None of the default values are calibrated against real events.