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

  1. 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.
  2. 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.
  3. 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.
  4. 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).
  5. 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.
  6. 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.
  7. 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

  1. Pick an invitation system and run.
  2. Look at the Population view: who dances, who sits out, how unequal.
  3. Pick a dancer in the Individual view and read their decision log to see why.
  4. Change one thing (system, category shares, a persona mix, a zone cost) and run again with the same seed.
  5. 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.
Default %
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.

WeightDefaultEffect
rest_0
Rest: intercept
-3.1Baseline urge to sit a set out. Very negative means almost nobody rests unless tired.
rest_energy
Rest: low energy
3.0How strongly low energy pushes a dancer to rest. Multiplied by (1 − energy).
rest_streak
Rest: per consecutive dance
0.1Added per consecutive dance just completed. Makes long streaks end with a break.
rest_social
Rest: sociability (negative)
1.0Sociable dancers rest less. Multiplied by sociability and subtracted.
rest_idle
Rest: per set without dancing (negative)
0.3Each set without a dance (up to 10) lowers the urge to rest: people who have been waiting keep waiting.
energy_dance
Energy cost per dance
0.02Energy spent per dance. Energy starts at the persona's energy max and never goes below 0.
energy_rest
Energy gained per resting set
0.15Energy regained per resting set.
energy_idle
Energy gained per idle set
0.05Energy regained per set spent seeking without dancing.
init_0
Initiate: intercept
2.0Baseline willingness to invite. High positive means nearly everyone who is allowed to invite does.
init_initiative
Initiate: initiative
2.0Multiplied by the dancer's initiative attribute.
init_conf
Initiate: confidence
1.0Multiplied by confidence.
init_risk
Initiate: risk aversion × recent rejections (negative)
1.0Multiplied by risk aversion and by the number of recent rejections, then subtracted. Rejections discourage the risk averse.
init_idle
Initiate: per set without dancing
0.15Added per set without a dance (up to 10). Waiting makes inviting more likely.
acc_0
Accept: intercept
0.8Baseline 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_compat
Accept: compatibility minus selectiveness
2.5Multiplied 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_energy
Accept: energy
0.5Multiplied by the recipient's current energy. Tired dancers decline more.
acc_cost
Accept: social cost of declining
1.0Multiplied by the social cost of declining in the recipient's zone. High cost makes people accept invitations they would otherwise refuse.
acc_prior
Accept: previously declined this person (negative)
1.5Subtracted when the recipient has already declined this same person earlier in the event.
acc_zone
Accept: zone modifier
1.0Multiplied by the recipient zone's accept modifier.
age_span
Age span for age match (years)
15.0Years of age difference at which the age match factor reaches its minimum (−1). Smaller span means stricter age sorting.
match_upward
Preferred level above own (skill & appearance)
0.15How 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

Room dancing per set
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.