5D Library › Dynamical Systems of Neurotransmitters and Endocrinology · 中文
Chapter 2 The HPA Axis and Allostatic Load
A three-stage negative-feedback loop
Under stress, the paraventricular nucleus of the hypothalamus releases corticotropin-releasing hormone (CRH). CRH makes the anterior pituitary release adrenocorticotropic hormone (ACTH), which travels in the blood to the adrenal cortex and makes it secrete cortisol. Cortisol mobilises energy and regulates immunity and inflammation, and it acts on glucocorticoid receptors (GR) and mineralocorticoid receptors in the hypothalamus, pituitary and hippocampus to inhibit further release of CRH and ACTH. This is the hypothalamic–pituitary–adrenal (HPA) axis: a three-stage loop with negative feedback. It also has a daily rhythm and roughly hourly ultradian pulses (Lightman and Conway-Campbell 2010).
Evidence
McEwen introduced the ideas of allostasis and allostatic load: the body adapts to change by altering the levels of stress mediators (cortisol, catecholamines, cytokines and others), which is protective; but when the response is too frequent, fails to switch off, adapts poorly or is too weak, costs accumulate as wear on the cardiovascular, metabolic and immune systems (McEwen 1998).
Evidence
Building on studies in rats, Sapolsky, Krey and McEwen proposed the “glucocorticoid cascade hypothesis”: prolonged high glucocorticoids may damage the hippocampus, which helps to inhibit the HPA axis, so feedback weakens, cortisol rises further and a vicious circle follows (Sapolsky et al. 1986). Later work showed that stress and glucocorticoids change neuronal structure in the hippocampus, amygdala and prefrontal cortex, and that much of this can recover once the stress ends (McEwen et al. 2016). In humans, evidence such as hippocampal volume changes in Cushing’s syndrome supports an association, but whether chronic psychological stress causes changes in human hippocampal volume remains uncertain, and studies disagree (Lupien et al. 2009).
A model of the loop
Mathematicians write this loop as ordinary differential equations. Vinther, Andersen and Ottesen gave a “minimal model” with three variables, CRH, ACTH and cortisol, in which cortisol inhibits the upstream stages through Hill-type feedback (Vinther et al. 2011). Gupta and colleagues added the dynamics of the GR and found that cortisol-induced down-regulation of the receptor can make the system bistable: with one set of parameters the system can rest in a normal low-cortisol state or in a high-cortisol, low-GR state (Gupta et al. 2007).
The program below uses the same structure, greatly simplified: no daily or ultradian rhythm, and all quantities in arbitrary units (about 1 at rest).
Calculation
The CRH → ACTH → cortisol loop with GR-mediated feedback strength . Cortisol held above a threshold slowly lowers (receptor down-regulation); recovers with a time constant of about a week when cortisol is low. Thirty days with 0, 1, 3, 6 or 9 thirty-minute stressors a day are compared; the system is then left quiet for 3 days and given one standard stressor, and the time it takes to recover is measured.
# A minimal CRH -> ACTH -> cortisol loop with glucocorticoid-receptor (GR) feedback, arbitrary units
# (structure after Vinther, Andersen & Ottesen 2011 and Gupta et al. 2007; no daily or ultradian rhythm).
# Feedback strength G = GR availability (1 = intact). Cortisol above 1.4 slowly lowers G
# (down-regulation); G recovers with a time constant of a week.
import random
H1, H2, H3, DT = 0.10, 0.07, 0.012, 0.5 # clearance per minute; cortisol half-life about 1 h
def run(starts, minutes, state=(1.0, 1.0, 1.0, 1.0)):
"""starts: minutes at which a 30-minute stressor begins. Returns final state and cortisol trace."""
R, A, C, G = state
on = set()
for s in starts:
on.update(range(int(s / DT), int((s + 30) / DT)))
trace = []
for k in range(int(minutes / DT)):
drive = 5.0 if k in on else 1.0
fb = 1 - 0.9 * G * C ** 2 / (1 + C ** 2) # Hill-type GR-mediated feedback
R += DT * H1 * (2 * drive * fb - R)
A += DT * H2 * (2 * R * fb - A)
C += DT * H3 * (A - C)
G += DT * ((1 - G) / (7 * 1440) - 0.00025 * max(C - 1.4, 0) * G)
trace.append(C)
return (R, A, C, G), trace
random.seed(4)
print("30 days, stressors per day GR left resting cortisol test peak recovery (min)")
for label, n, rnd in (("0 (rest)", 0, False), ("1, same time, predictable", 1, False),
("3, random times", 3, True), ("6, random times", 6, True), ("9, random times", 9, True)):
starts = [d * 1440 + (random.uniform(0, 1410) if rnd else 600) for d in range(30) for _ in range(n)]
state, _ = run(starts, 30 * 1440)
state, _ = run([], 3 * 1440, state) # three quiet days: the new resting state
rest = state[2]
_, tr = run([0], 1440, state) # one standard 30-minute stressor
back = next((i * DT for i, c in enumerate(tr) if i * DT > 30 and c < 1.1 * rest), None)
rec = f"{back:8.0f}" if back else " > 1440"
print(f"{label:32s} {state[3]:6.2f} {rest:15.2f} {max(tr):9.2f} {rec}")
# 30 days, stressors per day GR left resting cortisol test peak recovery (min)
# 0 (rest) 1.00 1.07 1.71 121
# 1, same time, predictable 0.98 1.09 1.73 122
# 3, random times 0.93 1.13 1.83 128
# 6, random times 0.19 2.88 5.51 262
# 9, random times 0.18 2.92 5.58 262The model shows three things. First, a single controllable acute stress gives a pulse of cortisol that returns to baseline within hours and leaves the feedback almost untouched. Second, with frequent stress the feedback strength falls gradually, and recovery from a standard stressor slows. Third, with these parameters there is a tipping point between three and six stressors a day: beyond it, low GR and high cortisol sustain each other, and the system stays in the high state even after three quiet days. This is the bistability of Gupta’s model, and here it is simply a consequence of the parameters chosen.
Note
Corrected on checking. “Chronic anxiety makes baseline cortisol drift upwards” is not a consistent finding in humans. A meta-analysis of 107 studies by Miller, Chen and Zhou found that the relation between chronic stress and HPA activity depends on the kind of stress and on time: hormonal activity is raised at the onset of a stressor but falls as time passes; stressors that threaten physical integrity, involve trauma and are uncontrollable go with a high, flat daily profile of cortisol; and cortisol is lower in people with post-traumatic stress disorder (Miller et al. 2007). Both “high” and “low” occur, and the “high state” of the model is only one of the patterns. The trial in Chapter 8 does not assume a direction of change in the cortisol awakening response either.
How allostatic load is scored
“Allostatic load” is often spoken of as a measurable bodily burden. In research it is an index.
Evidence
In the MacArthur Studies of Successful Aging, Seeman and colleagues chose ten biomarkers: systolic and diastolic blood pressure, waist–hip ratio, HDL cholesterol, the ratio of total to HDL cholesterol, glycated haemoglobin, overnight urinary cortisol, noradrenaline, adrenaline and DHEA-S. A person scored 1 for each marker in the highest-risk quarter of the sample, and the total was the allostatic load score. Higher scores predicted more cardiovascular events, decline in cognitive and physical function, and death over the following years (Seeman et al. 1997).
Calculation
The allostatic load score computed for a simulated sample.
# How "allostatic load" is usually scored in studies (after Seeman et al. 1997): for each biomarker, count
# 1 if a person falls in the high-risk quartile of the sample; the score is the count. It is an index for
# research on groups, not a diagnosis and not a direct measurement of "load". Simulated sample.
import random
random.seed(7)
MARKERS = { # name: (mean, sd, risk direction)
"systolic BP (mmHg)": (125, 15, +1), "diastolic BP (mmHg)": (78, 10, +1), "waist-hip ratio": (0.90, 0.07, +1),
"HDL cholesterol (mmol/L)": (1.35, 0.35, -1), "total/HDL ratio": (4.2, 1.1, +1), "HbA1c (%)": (5.5, 0.5, +1),
"overnight urinary cortisol": (1.0, 0.35, +1), "noradrenaline": (1.0, 0.35, +1), "adrenaline": (1.0, 0.35, +1),
"DHEA-S": (1.0, 0.35, -1),
}
people = [{m: random.gauss(mu, sd) for m, (mu, sd, _) in MARKERS.items()} for _ in range(1000)]
cut = {}
for m, (_, _, sign) in MARKERS.items():
v = sorted(p[m] for p in people)
cut[m] = v[749] if sign > 0 else v[250] # top quartile, or bottom quartile when low is risky
def score(p):
return sum(1 for m, (_, _, s) in MARKERS.items() if (p[m] >= cut[m] if s > 0 else p[m] <= cut[m]))
scores = [score(p) for p in people]
for k in range(0, 8):
n = scores.count(k)
print(f"score {k}: {n:4d} people {'#' * (n // 10)}")
print(f"mean score {sum(scores) / len(scores):.2f} of 10 (with independent markers the expected mean is 2.5)")
print("The same person can score higher simply because the comparison sample is healthier: the cut-offs are relative.")
# score 0: 46 people ####
# score 1: 186 people ##################
# score 2: 292 people #############################
# score 3: 265 people ##########################
# score 4: 134 people #############
# score 5: 60 people ######
# score 6: 13 people #
# score 7: 1 people
# mean score 2.51 of 10 (with independent markers the expected mean is 2.5)
# The same person can score higher simply because the comparison sample is healthier: the cut-offs are relative.The calculation makes two points. The score is relative: the cut-offs come from the same sample, so a person’s score depends on whom they are compared with. And it is a risk index for research on groups, not a diagnosis and not a direct measurement of any “load”. This book does not suggest that anyone score themselves with it.
Hypothesis · not established
Not established. With the same total time under stress, the HPA axis recovers differently depending on predictability: the same 90 minutes of work stress a day, concentrated in a fixed period with a clear end (for example fixed meeting slots), raises evening salivary cortisol at week 4 (relative to the person’s week 1) less than the same stress scattered at random. If, in a crossover design, the 95 % confidence interval for the difference in the change in evening cortisol between the two arrangements lies within a pre-set equivalence margin of ±15 %, the hypothesis is refuted.
Summary
The HPA axis is a negative-feedback loop with delays and thresholds. Acute, controllable stress with a clear end is switched off by the system itself; frequent, unpredictable stress weakens the feedback, and once weakened the feedback can let high cortisol sustain itself. But chronic stress in people does not follow a single pattern. The next chapter looks at another loop that interacts with the HPA axis: the gonadal axis and testosterone.
References
Fan, Y. (2026). Dynamical Systems of Neurotransmitters and Endocrinology: Dopamine Reward Prediction Error, Serotonergic Homeostasis, HPA-Axis Allostatic Load and the Challenge Hypothesis, Read Beside East Asian Classics of Mind Regulation [神经递质与内分泌的动力系统] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23738782 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).