Delays, External Drivers, and Competing Loops
Causal loopsPart II · Feedback · Chapter 5 of 12 · the second of two chapters on causal loops
Why does the obvious fix make things worse? A fix can set off loops that pull back against it, some of them after a delay. A causal loop diagram shows what those loops are, what drives them from outside, and which of them leads when.
Print this chapter, with a sheet for each exercise and the answers at the back, from its PDF.
A town widens its main road
Section titled “A town widens its main road”A town’s main road jams every morning, so the council widens it from two lanes to four. For a year the drive across town takes twelve minutes instead of twenty-five.
Then the road fills. People who had taken the bus, driven at other hours or stayed home drive at rush hour. Developers build estates on the outskirts, sold on the short drive into town, and their residents drive the main road too. Meanwhile the region’s population grows, as it did before the widening. By the fifth year the drive takes twenty-five minutes again, with twice as many cars, and the council proposes six lanes.
What the notation expresses
Section titled “What the notation expresses”Boundaries
Section titled “Boundaries”A boundary, a named outline with a tab, marks what the model explains. The road diagram’s boundary is the town’s road network, around the lanes, travel time, car trips and homes on the outskirts.
External drivers
Section titled “External drivers”An external driver is a variable outside every boundary that affects something inside and isn’t affected back. Its name is drawn in angle brackets: ‹regional population›. People move to the region for its jobs and housing, and nothing in the town’s road network changes how many come, so regional population sits outside the boundary with one effect leaving it, into car trips.
An external entity also sits outside a boundary, but it is a party, not a quantity, and exchanges run to it as well as from it; it is drawn only in system context maps, which have no variables, so the two never share a diagram.
Nonlinear effects
Section titled “Nonlinear effects”A nonlinear effect is weak over part of its range and sudden over another, or strong, then flat. It’s drawn with a small S beside the effect’s middle.
On a half-empty road, more car trips barely change travel time; near the road’s capacity, each extra car adds minutes. The point where an effect turns from weak to sudden is its threshold: here, the road’s capacity. Widening raised the threshold, so for a while more trips cost almost no time, and that drew the trips back.
Evidence coding
Section titled “Evidence coding”In a diagram with a dashed effect, solid marks an effect its author judges more supported, and dashed marks one less supported, a hypothesis; a diagram with no dashed effect carries no coding (chapter 1). In the road diagram, travel time → car trips is solid: induced traffic has been counted across American cities. Travel time → homes on the outskirts is dashed: the estates may have come for the short drive or for cheap land.
Viewpoint tags
Section titled “Viewpoint tags”A viewpoint tag is a small labeled box beside an effect, naming a stakeholder who stresses that effect. The tag marks emphasis, not a different structure.
Commuters stress lanes on the main road → travel time, the drive the widening shortened. Residents along the main road stress homes on the outskirts → car trips, the traffic past their doors. The council stresses travel time → homes on the outskirts, the new estates and their taxes.
The legend
Section titled “The legend”The legend is a box listing a diagram’s codings; any diagram with a dashed effect or a viewpoint tag must have one. Its evidence entry shows a solid line for more supported and a dashed line for less supported. Its viewpoints entry lists every viewpoint tag the diagram uses.
Loop dominance
Section titled “Loop dominance”Loop dominance is which loop drives behavior at a given time. It is a reading of the structure, not a mark; the road diagram’s behavior note names which loop leads first and which later.
In the first year B1, relief by widening, dominates: four lanes cut travel time. B2, induced traffic, changes travel time within months, as shorter drives draw trips back. B3, building on the outskirts, changes it over years, through the delay on new homes. By the fifth year B2 and B3 dominate.
All three loops are balancing, toward different levels: B1 moves travel time toward what the council will accept, B2 and B3 toward what motorists will put up with. A fix that a system’s own loops pull back is policy resistance. Six lanes would set off B2 and B3 again.
The bad diagram
Section titled “The bad diagram”What’s wrong with this diagram of the widened road?
Regional population, marked external, sits inside the boundary with an effect running into it from homes on the outskirts, since new homes house new people, and B3 runs through it. The lab’s check reports:
An external driver affects the system from outside and is not affected back, but 1 effect runs into one: homes on the outskirts → regional population. Remove that effect, or bring the variable inside the system by unmarking it as an external driver.
The corrected diagram
Section titled “The corrected diagram”Corrected, homes on the outskirts run straight into car trips, and regional population sits outside the boundary, with its one effect leaving it.
Labels unchanged. 1 variable moved outside the boundary. Effects: 1 added, 1 removed. Loops: 1 changed.
B3 now closes inside the town’s road network. If the estates do draw people to the region, regional population belongs inside the boundary, unmarked.
Notation moves
Section titled “Notation moves”| Notation move | When | What it shows | Example |
|---|---|---|---|
| Mark an external driver | A variable affects the inside and nothing inside affects it | A change the model doesn’t explain | ‹regional population› → car trips |
| Mark a nonlinear effect | An effect is weak over part of its range and sudden over another | Where a threshold lies | car trips → travel time, at the road’s capacity |
| Tag a viewpoint | Stakeholders stress different effects | Who stresses which effect, on one structure | Commuters on lanes on the main road → travel time |
| Add a legend | An effect is dashed or tagged | The codings in use | Evidence, Viewpoints |
| Name loop dominance in a behavior note | Loops lead at different times | Which loop leads first and which later | B1 leads in the first year, B2 and B3 over the next few |
Common misreading
Section titled “Common misreading”Read one way, policy resistance means no fix works. The road diagram shows which loops pull widening back, and so where a fix could act on them: a charge for driving at rush hour weakens B2, so shorter drives draw fewer trips back.
Read the other way, a causal loop diagram is a set of separate effects, each judged alone. Lanes on the main road → travel time is true, and alone it means a shorter drive; the drive lengthens again through the loops it sits in.
The strongest objection
Section titled “The strongest objection”A causal loop diagram doesn’t show accumulation. Homes on the outskirts pile up while drives are short and stay when drives lengthen, but a − effect from travel time can’t show that, so a reader can’t work out from the diagram which loop dominates when (Richardson, 1986). In experiments, business school students misjudge how the water in a bathtub changes as it flows in and drains out (Booth Sweeney and Sterman, 2000).
A behavior note is a prediction, not a derivation; stock & flow diagrams, from chapter 6, show accumulation and give numbers. Without them, the loop diagram still shows which loops exist and which way each moves travel time: widening sets off two loops against it.
Check your understanding
Section titled “Check your understanding”The Munro Review’s loops of compliance, redrawn
Section titled “The Munro Review’s loops of compliance, redrawn”Redrawn from Eileen Munro, The Munro Review of Child Protection, Part One: A Systems Analysis (Department for Education, 2010), Appendix 2, the diagram on p. 52. Contains public sector information licensed under the Open Government Licence v3.0.
Its S (same direction) and O (opposite direction) drawn as + and −; its R labeled R1, and each loop’s name lowercased, its exclamation mark dropped; nine names shortened or reworded; variety of children’s circumstances marked as an external driver; its four-variable tail, from sense of satisfaction derived from work to public status of child protection workers, left out.
Exercises
Section titled “Exercises”Passing the checks means meeting the brief, not being right. The answer to CL 08, a parent who finishes the homework, has the structure of shifting the burden, an archetype in chapter 10.
CL 06A food bank in a downturn
Multiple loops and a boundary
Layoffs at local employers reach a volunteer food bank months later, as families' savings run out. The food bank recruits volunteers, but the regulars give up shifts to train them, so more need goes unmet until trained volunteers take shifts weeks later. Keep layoffs outside the food bank's boundary.
The brief
- Draw the food bank's boundary and name it. checked by the lab
- Include one external driver. checked by the lab
- Show two delays. checked by the lab
- Close two loops and name each one. checked by the lab
Your palette
variable effect polarity delay loop reinforcing loop balancing loop boundary external driver
To draw in the lab, use a tablet or a larger screen. Everything else reads normally here.
Press an empty spot to add a variable and type its name. Drag a variable to move it. Select a variable, an effect or a loop label to change it. Drag a boundary by its outline or its name to move it, and by the square at its corner to resize it. Double-click or double-tap a variable, a loop's label or name or a boundary's name to edit its words in place, or select it and use Rename or the fields under the canvas.
Nothing selected. Select a variable, an effect, a loop label or a boundary on the canvas, and what you can change shows here.
The tools
- Variables V
- add a variable (press an empty spot), move one (drag it), rename one (double-click it, or Rename under the canvas), or select anything.
- Effects E
- draw an effect by dragging from one variable to another.
- Loop L
- declare a loop by selecting its effects in order, then label and name it.
- Boundary B
- drag out a boundary around the system, and name it.
Keys
- R reverse the selected effect
- +− the selected effect's polarity
- Delete delete what's selected
- Ctrl+Z undo
- Ctrl+Shift+Z redo
- Esc clear the selection
- Enter finish the words you're writing
- Esc cancel them
Keys act on the lab you last used, or on the open lab view, and never while you type.
0 of 9 checks passed; 9 pending.
- Draw the food bank's boundary and name it. (Not started)
- Include one external driver. (Not started)
- Show two delays. (Not started)
- Close two loops and name each one. (Not started)
Always checked
- Each loop's kind matches its − effects (Not started)
- Loop labels are unique and match their kind (Not started)
- No effect runs into an external driver (Not started)
- External drivers sit outside every boundary (Not started)
- No variable's name breaks the more test's three rules (Not started)
Written feedback
One defensible answer
It opens here once you've drawn at least one variable in the lab above. Your attempt saves as you draw.
CL 07Antibiotics and the resistance they breed
Policy resistance
Doctors prescribe antibiotics to cure infections, and cures bring infections down. Over years, heavy use breeds resistant bacteria: treatments fail, infections spread, and prescribing rises. Drug makers might answer the failures with new antibiotics a decade later, but new antibiotics earn little, so that effect is uncertain.
The brief
- Draw at least three loops. checked by the lab
- Make the loops interact by sharing variables. checked by the lab
- Code at least one uncertain effect as a hypothesis. checked by the lab
- Code an effect as a hypothesis only where you are unsure of it. you check this
- Keep the evidence legend small and inside the canvas. you check this
Your palette
variable effect polarity delay loop reinforcing loop balancing loop evidence coding
To draw in the lab, use a tablet or a larger screen. Everything else reads normally here.
Press an empty spot to add a variable and type its name. Drag a variable to move it. Select a variable, an effect or a loop label to change it. Double-click or double-tap a variable or a loop's label or name to edit its words in place, or select it and use Rename or the fields under the canvas.
Nothing selected. Select a variable, an effect or a loop label on the canvas, and what you can change shows here.
The tools
- Variables V
- add a variable (press an empty spot), move one (drag it), rename one (double-click it, or Rename under the canvas), or select anything.
- Effects E
- draw an effect by dragging from one variable to another.
- Loop L
- declare a loop by selecting its effects in order, then label and name it.
Keys
- G legend on or off
- R reverse the selected effect
- +− the selected effect's polarity
- Delete delete what's selected
- Ctrl+Z undo
- Ctrl+Shift+Z redo
- Esc clear the selection
- Enter finish the words you're writing
- Esc cancel them
Keys act on the lab you last used, or on the open lab view, and never while you type.
0 of 7 checks passed; 7 pending.
- Draw at least three loops. (Not started)
- Make the loops interact by sharing variables. (Not started)
- Code at least one uncertain effect as a hypothesis. (Not started)
Always checked
- Each loop's kind matches its − effects (Not started)
- Loop labels are unique and match their kind (Not started)
- The legend is on when effects are coded or tagged (Not started)
- No variable's name breaks the more test's three rules (Not started)
Written feedback
One defensible answer
It opens here once you've drawn at least one variable in the lab above. Your attempt saves as you draw.
CL 08A parent who finishes the homework
Shifting the burden archetype
A child stuck on homework turns to a parent, who on rushed evenings finishes it. Tonight's homework gets done, but the child comes to rely on the help and tries less, and the skill that would let the child finish alone builds only over weeks.
The brief
- Use the shifting-the-burden structure. you check this
- Close two balancing loops: the quick relief and the slower fundamental response. checked by the lab
- Close a reinforcing loop through which the relief builds dependence. checked by the lab
- Show the relief crowding out the fundamental response with a − effect. you check this
- Name every loop by behavior, not topic. you check this
- Create a clear visual hierarchy: main story first, detail second. you check this
Your palette
variable effect polarity delay loop reinforcing loop balancing loop leverage point
To draw in the lab, use a tablet or a larger screen. Everything else reads normally here.
Press an empty spot to add a variable and type its name. Drag a variable to move it. Select a variable, an effect or a loop label to change it. Double-click or double-tap a variable or a loop's label or name to edit its words in place, or select it and use Rename or the fields under the canvas.
Nothing selected. Select a variable, an effect or a loop label on the canvas, and what you can change shows here.
The tools
- Variables V
- add a variable (press an empty spot), move one (drag it), rename one (double-click it, or Rename under the canvas), or select anything.
- Effects E
- draw an effect by dragging from one variable to another.
- Loop L
- declare a loop by selecting its effects in order, then label and name it.
Keys
- R reverse the selected effect
- +− the selected effect's polarity
- Delete delete what's selected
- Ctrl+Z undo
- Ctrl+Shift+Z redo
- Esc clear the selection
- Enter finish the words you're writing
- Esc cancel them
Keys act on the lab you last used, or on the open lab view, and never while you type.
0 of 5 checks passed; 5 pending.
- Close two balancing loops: the quick relief and the slower fundamental response. (Not started)
- Close a reinforcing loop through which the relief builds dependence. (Not started)
Always checked
- Each loop's kind matches its − effects (Not started)
- Loop labels are unique and match their kind (Not started)
- No variable's name breaks the more test's three rules (Not started)
Written feedback
One defensible answer
It opens here once you've drawn at least one variable in the lab above. Your attempt saves as you draw.
CL 09An old town and its visitors
Competing viewpoints and nonlinear pressure
Visitors to an old town fill holiday lets, and more lets draw more visitors; the council limits lets as crowding grows. Residents leave as lets replace homes and as crowding rises: slowly, then fast once summer visitors outnumber them. Local shops close, and more residents leave. Tag what residents, shopkeepers and the council each stress.
The brief
- Include two reinforcing loops: visitor growth and the loss of residents. checked by the lab
- Include a balancing control loop. checked by the lab
- Mark one threshold as a nonlinear effect. checked by the lab
- Tag three viewpoints without using color. checked by the lab
Your palette
variable effect polarity loop reinforcing loop balancing loop nonlinear effect viewpoint tag
To draw in the lab, use a tablet or a larger screen. Everything else reads normally here.
Press an empty spot to add a variable and type its name. Drag a variable to move it. Select a variable, an effect or a loop label to change it. Double-click or double-tap a variable or a loop's label or name to edit its words in place, or select it and use Rename or the fields under the canvas.
Nothing selected. Select a variable, an effect or a loop label on the canvas, and what you can change shows here.
The tools
- Variables V
- add a variable (press an empty spot), move one (drag it), rename one (double-click it, or Rename under the canvas), or select anything.
- Effects E
- draw an effect by dragging from one variable to another.
- Loop L
- declare a loop by selecting its effects in order, then label and name it.
Keys
- G legend on or off
- R reverse the selected effect
- +− the selected effect's polarity
- Delete delete what's selected
- Ctrl+Z undo
- Ctrl+Shift+Z redo
- Esc clear the selection
- Enter finish the words you're writing
- Esc cancel them
Keys act on the lab you last used, or on the open lab view, and never while you type.
0 of 8 checks passed; 8 pending.
- Include two reinforcing loops: visitor growth and the loss of residents. (Not started)
- Include a balancing control loop. (Not started)
- Mark one threshold as a nonlinear effect. (Not started)
- Tag three viewpoints without using color. (Not started)
Always checked
- Each loop's kind matches its − effects (Not started)
- Loop labels are unique and match their kind (Not started)
- The legend is on when effects are coded or tagged (Not started)
- No variable's name breaks the more test's three rules (Not started)
Written feedback
One defensible answer
It opens here once you've drawn at least one variable in the lab above. Your attempt saves as you draw.
CL 10A forest region and its fires
Publication-ready multi-loop model
Small fires once thinned a dry forest's undergrowth. Crews now put out small and severe fires alike, so dry fuel builds for decades and the fires that escape burn hotter. Drought years make severe fires likelier. Whether severe fires lead agencies to fund prescribed burns, which thin the fuel, is uncertain.
The brief
- Synthesize four or more named loops. checked by the lab
- Add drought years as an external driver, outside a named boundary. checked by the lab
- Use evidence coding, declared in the legend. checked by the lab
- Polish spacing, label placement, and reading order. you check this
Your palette
variable effect polarity delay loop reinforcing loop balancing loop boundary external driver nonlinear effect evidence coding leverage point behavior note viewpoint tag
To draw in the lab, use a tablet or a larger screen. Everything else reads normally here.
Press an empty spot to add a variable and type its name. Drag a variable to move it. Select a variable, an effect or a loop label to change it. Drag a boundary by its outline or its name to move it, and by the square at its corner to resize it. Drag a behavior note to move it. Double-click or double-tap a variable, a loop's label or name, a boundary's name or a behavior note to edit its words in place, or select it and use Rename or the fields under the canvas.
Nothing selected. Select a variable, an effect, a loop label, a boundary or a behavior note on the canvas, and what you can change shows here.
The tools
- Variables V
- add a variable (press an empty spot), move one (drag it), rename one (double-click it, or Rename under the canvas), or select anything.
- Effects E
- draw an effect by dragging from one variable to another.
- Loop L
- declare a loop by selecting its effects in order, then label and name it.
- Boundary B
- drag out a boundary around the system, and name it.
- Note N
- place a behavior note (press where it goes).
Keys
- G legend on or off
- R reverse the selected effect
- +− the selected effect's polarity
- Delete delete what's selected
- Ctrl+Z undo
- Ctrl+Shift+Z redo
- Esc clear the selection
- Enter finish the words you're writing
- Esc cancel them
Keys act on the lab you last used, or on the open lab view, and never while you type.
0 of 9 checks passed; 9 pending.
- Synthesize four or more named loops. (Not started)
- Add drought years as an external driver, outside a named boundary. (Not started)
- Use evidence coding, declared in the legend. (Not started)
Always checked
- Each loop's kind matches its − effects (Not started)
- Loop labels are unique and match their kind (Not started)
- No effect runs into an external driver (Not started)
- External drivers sit outside every boundary (Not started)
- The legend is on when effects are coded or tagged (Not started)
- No variable's name breaks the more test's three rules (Not started)
Written feedback
One defensible answer
It opens here once you've drawn at least one variable in the lab above. Your attempt saves as you draw.
CS 05Kelsham Primary School: births, new homes and two loops
External drivers, a delay of four years and competing loops
David Brennan forecasts Kelsham Primary School's starters from the births in its villages four years before. Births fell from 22 in 2016 to 11 in 2025, so the starters go on falling until 2029, whatever the school does. The first of the 60 homes at Mill Lane will be lived in from 2027, and he forecasts 0.25 children of primary school age for each, 15 children in all, joining in any year group. Inside the school, its funding still follows its pupils a school year behind each October count, and parents still weigh mixed-age classes against small ones. Draw the loops through the roll inside the school's boundary, with births and the new homes outside it.
The brief
- Draw the school's boundary and name it. checked by the lab
- Keep births in the villages and the homes at Mill Lane outside it as external drivers. checked by the lab
- Mark the four years from births to starters, and the October count, as delays. checked by the lab
- Close one reinforcing loop through the school's funding. checked by the lab
- Close one balancing loop through class size. checked by the lab
- Let the two loops share variables, so they compete. checked by the lab
- Name each loop by what it does. you check this
Your palette
variable effect polarity delay loop reinforcing loop balancing loop boundary external driver
To draw in the lab, use a tablet or a larger screen. Everything else reads normally here.
Press an empty spot to add a variable and type its name. Drag a variable to move it. Select a variable, an effect or a loop label to change it. Drag a boundary by its outline or its name to move it, and by the square at its corner to resize it. Double-click or double-tap a variable, a loop's label or name or a boundary's name to edit its words in place, or select it and use Rename or the fields under the canvas.
Nothing selected. Select a variable, an effect, a loop label or a boundary on the canvas, and what you can change shows here.
The tools
- Variables V
- add a variable (press an empty spot), move one (drag it), rename one (double-click it, or Rename under the canvas), or select anything.
- Effects E
- draw an effect by dragging from one variable to another.
- Loop L
- declare a loop by selecting its effects in order, then label and name it.
- Boundary B
- drag out a boundary around the system, and name it.
Keys
- R reverse the selected effect
- +− the selected effect's polarity
- Delete delete what's selected
- Ctrl+Z undo
- Ctrl+Shift+Z redo
- Esc clear the selection
- Enter finish the words you're writing
- Esc cancel them
Keys act on the lab you last used, or on the open lab view, and never while you type.
0 of 11 checks passed; 11 pending.
- Draw the school's boundary and name it. (Not started)
- Keep births in the villages and the homes at Mill Lane outside it as external drivers. (Not started)
- Mark the four years from births to starters, and the October count, as delays. (Not started)
- Close one reinforcing loop through the school's funding. (Not started)
- Close one balancing loop through class size. (Not started)
- Let the two loops share variables, so they compete. (Not started)
Always checked
- Each loop's kind matches its − effects (Not started)
- Loop labels are unique and match their kind (Not started)
- No effect runs into an external driver (Not started)
- External drivers sit outside every boundary (Not started)
- No variable's name breaks the more test's three rules (Not started)
Written feedback
One defensible answer
It opens here once you've drawn at least one variable in the lab above. Your attempt saves as you draw.
Sources
Section titled “Sources”- John D. Sterman, Business Dynamics: Systems Thinking and Modeling for a Complex World (Irwin/McGraw-Hill, 2000), chapter 1, on policy resistance, and chapter 5, on causal loop diagrams of road building and traffic.
- John D. Sterman, “System Dynamics Modeling: Tools for Learning in a Complex World”, California Management Review 43, no. 4 (2001), on policy resistance, with road building among its examples.
- Gilles Duranton and Matthew A. Turner, “The Fundamental Law of Road Congestion: Evidence from US Cities”, American Economic Review 101, no. 6 (2011), measuring how driving rises with new lanes.
- George P. Richardson, “Problems with Causal-Loop Diagrams”, System Dynamics Review 2, no. 2 (1986), on what loop diagrams can’t show about accumulation.
- Linda Booth Sweeney and John D. Sterman, “Bathtub Dynamics: Initial Results of a Systems Thinking Inventory”, System Dynamics Review 16, no. 4 (2000), on how people misjudge accumulation.
- Donella H. Meadows, Thinking in Systems: A Primer (Chelsea Green, 2008), chapter 2, on shifting dominance; chapter 4, on nonlinearities; chapter 5, on policy resistance.