5D Library › 依恋理论的计算模型与伴侣互动动力学 · English
第八章 实践与预注册试验
注
本章的核查表与试验方案只适用于没有暴力、威胁或强制控制的关系。 如果你的关系中存在这些情况,请不要使用下面的练习,而是优先保护安全,联系当地的紧急电话、家庭暴力援助机构或法律援助。
第一部分 四步互动回路核查表
这份核查表供伴侣双方在都同意的前提下,用一周时间各自记录、再一起回顾。目的不是评判谁对谁错,而是看清两人之间的回路。
- 触发情境与追—逃角色。 哪些话题或情境反复引发冲突?每一次是谁在「追」(想谈、追问),谁在「逃」(回避、沉默)?角色是固定的,还是随话题变化?(第二章)
- 日常的正面与负面。 不只是冲突时,而是一整天里,各自感受到的正面时刻(感谢、玩笑、关心、身体亲近)与负面时刻(批评、冷淡、讽刺)大致各有多少?看的是趋势,不是及格线。(第三章)
- 生理唤醒与暂停约定。 冲突中有没有人明显「被淹没」(心跳很快、说不出话或想离开)?如果有,是否按约定暂停,暂停期间做了什么,有没有按约定回来?(第四章、第六章)
- 修复尝试与接收。 各自做了几次修复尝试?其中几次被对方接收?在哪些日子更容易被接收?(第六章)
推导
把核查表用在一对虚构伴侣 A 与 B 一周的冲突日记上。
# The four-step interaction-loop checklist applied to a FICTIONAL one-week conflict diary kept by
# a couple, A and B. Each entry: day, trigger, who pushed for a talk, who pulled away, minutes from
# the first sharp remark until the conflict settled or stopped, positive and negative moments each
# partner tallied that day (everyday life, not only the conflict), each partner's peak heart rate
# from a watch (resting about 65 and 70), whether a break was taken, repairs offered / accepted.
DIARY = [
("Mon", "chores", "A", "B", 35, (9, 3), (8, 2), (104, 92), False, (2, 0)),
("Tue", "phone at dinner", "A", "B", 50, (6, 4), (5, 4), (112, 101), False, (1, 0)),
("Wed", None, None, None, 0, (11, 1), (10, 2), (78, 80), False, (0, 0)),
("Thu", "chores", "A", "B", 20, (8, 3), (9, 3), (98, 95), True, (3, 2)),
("Fri", "money", "B", "A", 45, (5, 5), (4, 5), (109, 107), False, (2, 1)),
("Sat", None, None, None, 0, (12, 2), (11, 1), (80, 79), False, (0, 0)),
("Sun", "chores", "A", "B", 15, (10, 2), (9, 2), (96, 90), True, (3, 3)),
]
REST = (65, 70); OVER = 30 # "over the limit" = more than 30 bpm above one's own resting rate
conf = [d for d in DIARY if d[1]]
print("Step 1 triggers and roles")
trig = {}
for d in conf: trig[d[1]] = trig.get(d[1], 0) + 1
print(" triggers:", ", ".join(f"{k} x{v}" for k, v in sorted(trig.items(), key=lambda kv: -kv[1])))
roles = [f"{d[2]} pushes / {d[3]} pulls" for d in conf]
print(" roles:", "; ".join(f"{d[0]} {r}" for d, r in zip(conf, roles)))
fixed = all(d[2] == "A" for d in conf)
print(" roles", "never switch" if fixed else "switch on the money topic: the loop is not a fixed trait of either partner")
print("Step 2 positive : negative moments in everyday life (self-tallied)")
for who, idx in (("A", 5), ("B", 6)):
pos = sum(d[idx][0] for d in DIARY); neg = sum(d[idx][1] for d in DIARY)
print(f" {who}: {pos} : {neg} = {pos / neg:.1f} : 1")
low = [d[0] for d in DIARY if (d[5][0] + d[6][0]) / (d[5][1] + d[6][1]) < 2]
print(" days below 2 : 1 for the pair:", ", ".join(low), "(read as a trend to talk about, not as a pass mark)")
print("Step 3 arousal over the limit, and whether a break was taken")
for d in conf:
over = [w for w, hrv, r in zip("AB", d[7], REST) if hrv - r > OVER]
if over:
print(f" {d[0]}: {' and '.join(over)} over the limit; break {'taken' if d[8] else 'NOT taken'}; lasted {d[4]} min")
with_b = [d[4] for d in conf if d[8]]; without = [d[4] for d in conf if not d[8]]
print(f" mean length with a break {sum(with_b) / len(with_b):.0f} min, without {sum(without) / len(without):.0f} min (one week; not evidence)")
print("Step 4 repairs")
made = sum(d[9][0] for d in conf); acc = sum(d[9][1] for d in conf)
print(f" offered {made}, accepted {acc} ({acc / made:.0%}); accepted mostly on days with a break:"
f" {sum(d[9][1] for d in conf if d[8])} of {acc}")
# Step 1 triggers and roles
# triggers: chores x3, phone at dinner x1, money x1
# roles: Mon A pushes / B pulls; Tue A pushes / B pulls; Thu A pushes / B pulls; Fri B pushes / A pulls; Sun A pushes / B pulls
# roles switch on the money topic: the loop is not a fixed trait of either partner
# Step 2 positive : negative moments in everyday life (self-tallied)
# A: 61 : 20 = 3.0 : 1
# B: 56 : 19 = 2.9 : 1
# days below 2 : 1 for the pair: Tue, Fri (read as a trend to talk about, not as a pass mark)
# Step 3 arousal over the limit, and whether a break was taken
# Mon: A over the limit; break NOT taken; lasted 35 min
# Tue: A and B over the limit; break NOT taken; lasted 50 min
# Thu: A over the limit; break taken; lasted 20 min
# Fri: A and B over the limit; break NOT taken; lasted 45 min
# Sun: A over the limit; break taken; lasted 15 min
# mean length with a break 18 min, without 43 min (one week; not evidence)
# Step 4 repairs
# offered 11, accepted 6 (55%); accepted mostly on days with a break: 5 of 6这份虚构日记显示了几件事:最常见的触发是家务;角色大多是 A 追、B 逃,但在金钱话题上反过来了,说明这个回路不是任何一方固定的性格;两人日常的正负比都约为 3 比 1,周二和周五低于 2 比 1,这两天正好是冲突最长的日子;有暂停的冲突平均持续约 18 分钟,没有暂停的约 43 分钟;修复被接收的比例约为一半,大多发生在有暂停的日子。一周的数据只能提供谈话的线索,不能作为证据:暂停与较短的冲突同时出现,可能只是因为那几次本来就不那么激烈。
注
心率只是提示。 核查表中的心率数据来自可穿戴设备,有误差。「超过自己静息心率 30 次以上」只是一个提醒双方考虑暂停的示意数字,不是医学标准;有心脏问题或正在服药的人,请遵医嘱。
第二部分 预注册随机对照试验方案
问题
一次结构化的伴侣会谈(共同画出自己的追—逃回路、学习 20 分钟的生理降温程序、练习修复用语),与花同样时间学习一份常规的良好沟通指南相比,能否缩短伴侣在之后一周冲突日记中报告的冲突升级时长?对关系满意度有什么影响?
设计
| 要素 | 规定 |
|---|---|
| 参与者 | 同居或已婚的成年伴侣(双方均年满 21 岁),双方都自愿参加;通过社区与在线广告招募,不从作者的社群、学员、客户或牌卡用户中招募 |
| 安全筛查与排除 | 本方案自行规定的安全程序:双方分别、私下完成亲密伴侣暴力与心理危机筛查;过去 12 个月内有任何身体暴力、性暴力、威胁或强制控制(包括强制控制的各种形式 (Stark 2007)),任何一方有严重心理危机或自伤风险,或正在接受伴侣治疗的,不入组。所有不入组的伴侣收到同一封措辞中性的通知,不透露原因;每一位参与者(无论是否入组)都私下收到当地援助资源信息;筛查阳性者由受过训练的研究人员按世界卫生组织关于回应暴力披露的建议提供一线支持并共同制订安全计划 (World Health Organization 2013);筛查结果绝不告诉另一方 |
| 随机分组 | 以伴侣为单位按 1:1 随机分配,按基线冲突频率分层 |
| A 组 | 90 分钟的结构化会谈:双方用核查表画出自己的追—逃回路;学习并练习一个 20 分钟的降温程序(约定暂停用语、慢呼吸或散步、约定回来的时间);练习三类修复用语(暂停、降级、认可) |
| B 组(积极对照) | 同样 90 分钟,由同一组主持人带领阅读并讨论一份常规的良好沟通指南(倾听、「我」开头的表达、不翻旧账) |
| 盲法 | 参与者无法对分组设盲;结局评估与数据分析者在揭盲前不知道分组;主持人不参与结局收集 |
| 主要结局 | 会谈后 7 天冲突日记中报告的冲突升级总时长:每位伴侣各自记录,取 ,以两人的平均为伴侣得分 |
| 次要结局 | 关系满意度(四题版伴侣满意度指数 CSI-4)(Funk and Rogge 2007),会谈后 1 周与 4 周;冲突次数;修复尝试的接收比例;可选的可穿戴心率数据 |
| 分析 | 线性模型,自变量为分组,协变量为基线冲突时长与分层变量;次要结局用行动者—伙伴相互依赖模型分析双人数据 (Kenny et al. 2006);双侧 |
样本量
推导
# Sample size for the couple-randomised trial. Unit of randomisation and analysis: the couple.
# Arm A: a 90-minute structured session (drawing their own pursue-withdraw loop, a 20-minute
# physiological cool-down routine, practising repair phrases). Arm B: the same time spent on a
# standard written guide to good communication, read and discussed with the same facilitator.
# Primary outcome: total minutes of escalated conflict in the following 7-day diary, log(1 + min),
# each partner keeping their own diary; the couple's score is the mean of the two partners.
# Effect in SD units of an individual's score; normal approximation; two-sided alpha 0.05.
import math
from statistics import NormalDist
N = NormalDist()
def couples_per_arm(d_individual, rho, alpha=0.05, power=0.90):
# averaging two partners whose scores correlate rho shrinks the variance to (1 + rho)/2
d = d_individual / math.sqrt((1 + rho) / 2)
return math.ceil(2 * (N.inv_cdf(1 - alpha / 2) + N.inv_cdf(power)) ** 2 / d ** 2) + 1
print("couples per arm for 90 % power")
print(" effect (SD) | partners' diaries agree rho = 0.3 | 0.5 | 0.7")
for d in (0.25, 0.30, 0.35, 0.40):
print(f" {d:.2f} | {couples_per_arm(d, 0.3):33d} | {couples_per_arm(d, 0.5):3d} | {couples_per_arm(d, 0.7):3d}")
n = couples_per_arm(0.35, 0.5)
recruit = math.ceil(n / 0.80)
print(f"chosen: 0.35 SD, rho = 0.5 -> {n} couples per arm; allowing 20 % loss (drop-out, unusable diaries)"
f" recruit {recruit} per arm, {2 * recruit} couples ({4 * recruit} people) in all")
# couples per arm for 90 % power
# effect (SD) | partners' diaries agree rho = 0.3 | 0.5 | 0.7
# 0.25 | 220 | 254 | 287
# 0.30 | 153 | 177 | 200
# 0.35 | 113 | 130 | 147
# 0.40 | 87 | 100 | 113
# chosen: 0.35 SD, rho = 0.5 -> 130 couples per arm; allowing 20 % loss (drop-out, unusable diaries) recruit 163 per arm, 326 couples (652 people) in all按最小关注效应 0.35 个标准差(以单个伴侣的得分计)、伴侣两人日记的相关 0.5、90% 把握度计算,每组需要 130 对可分析的伴侣;考虑约 20% 的流失与无法使用的日记,每组招募 163 对,共 326 对伴侣、652 人。两人日记的相关越高,取平均带来的好处越小,所需样本越多;表中列出了相关为 0.3 与 0.7 时的数字。
判定规则
推导
# Decision rule, fixed before any data are collected. d = arm A minus arm B in the couple-level
# primary outcome (log escalation minutes), standardised by the SD of an individual partner's score
# as in the sample-size program; NEGATIVE d means less escalation in arm A.
# 95 % confidence interval from the pre-specified linear model (arm, baseline escalation minutes,
# baseline conflict-frequency stratum). Smallest effect of interest: 0.35 SD.
SESOI = 0.35
def verdict(d, lo, hi, fidelity_ok, harms):
if harms:
return f"d = {d:+.2f}: PAUSE for safety review and report - {harms} safety events judged related to the session"
if not fidelity_ok:
return f"d = {d:+.2f}: NOT INTERPRETABLE - fewer than 80 % of arm-A sessions delivered as specified"
if hi <= -SESOI: v = "arm A reduces escalation by at least the smallest effect of interest"
elif hi < 0: v = "arm A reduces escalation; size not shown to reach 0.35 SD"
elif lo > 0: v = "arm A INCREASES escalation"
elif lo >= -SESOI and hi <= SESOI: v = "no difference worth acting on"
else: v = "unclear: the interval is too wide to decide"
return f"d = {d:+.2f} ({lo:+.2f} to {hi:+.2f}): {v}"
for case in ((-0.52, -0.77, -0.37, True, 0), (-0.20, -0.45, 0.05, True, 0), (-0.25, -0.50, -0.01, True, 0),
(0.05, -0.20, 0.30, True, 0), (-0.60, -0.85, -0.35, False, 0), (-0.40, -0.65, -0.15, True, 2)):
print(verdict(*case))
print("relationship satisfaction (CSI-4) at 1 and 4 weeks is secondary: reported with intervals, never decisive")
# d = -0.52 (-0.77 to -0.37): arm A reduces escalation by at least the smallest effect of interest
# d = -0.20 (-0.45 to +0.05): unclear: the interval is too wide to decide
# d = -0.25 (-0.50 to -0.01): arm A reduces escalation; size not shown to reach 0.35 SD
# d = +0.05 (-0.20 to +0.30): no difference worth acting on
# d = -0.60: NOT INTERPRETABLE - fewer than 80 % of arm-A sessions delivered as specified
# d = -0.40: PAUSE for safety review and report - 2 safety events judged related to the session
# relationship satisfaction (CSI-4) at 1 and 4 weeks is secondary: reported with intervals, never decisive示例结果是编造的。如果 A 组会谈中按规定实施的比例低于 80%,无论结果如何,报告都写「不可解释」;如果出现与会谈相关的安全事件,试验暂停进行安全审查并报告。只有当效应的置信区间上限不高于 −0.35 个标准差时,报告才写「A 组使冲突升级减少了至少最小关注的幅度」。
这项试验不能说明什么
第一,参与者知道自己在哪一组,主要结局又是自我报告的日记,期望效应可能使 A 组报告更短的冲突;积极对照组只能部分缓解这个问题。可选的可穿戴心率数据可以提供一个不完全依赖自我报告的旁证。第二,A 组同时包含三个成分(回路可视化、降温程序、修复用语),即使结果为阳性,也不能说明是哪一个起了作用。第三,结局只追踪一到四周,不能说明长期效果,更不能说明对分手或离婚的影响。第四,自愿参加、通过安全筛查的伴侣,与冲突最严重、最需要帮助的伴侣可能很不一样。第五,这不是伴侣治疗的替代品,阳性结果只能说明一次简短会谈在短期内的作用。
伦理与利益冲突
试验须经独立伦理委员会批准,双方分别签署知情同意,并在第一对伴侣入组之前登记方案和分析计划 (Nosek et al. 2018)。日记由每位伴侣各自私下提交,另一方看不到;任何一方可以随时退出而不需要说明理由,退出不影响另一方。研究团队须事先准备当地的家庭暴力与心理危机援助资源;如果在研究过程中出现暴力或安全风险的迹象,安全优先于研究,按预先规定的程序转介。
利益披露
作者以 5D Library 的著作(包括本书)作为其社群课程、升维牌卡(5D Ascension Cards,Dimensional Shift Card Decks)与 Yafu AI 知识库的方法论基础,因此与本书主题有商业利益关系。本书不推销任何课程、牌卡或服务;第八章的试验设计为由独立于作者企业的研究人员实施和分析,不从作者的社群、学员或客户中招募;书中所有代码与研究方案均公开,供任何人检验。为限制利益的影响:会谈材料与分析代码在入组前公开;无论结果如何,结果、数据和代码都将公开。
参考文献
Fan, Y. (2026). Computational Attachment Theory and Couple Interaction Dynamics: From Anxious-Avoidant Coupled Oscillators and Gottman's Nonlinear Difference Equations to Updating Early Relational Priors [依恋理论的计算模型与伴侣互动动力学] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23754715 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).