5D Library › 行动的经典与统计力学 · English
第八章 实践与预注册试验
第一部分 四步势垒核查表
前七章可以归结为四个可以每周记录的数字。它们不测量「意志力」,而测量让人开始和坚持下去的外部条件。
- 启动摩擦。 从坐下(或打开电脑)到第一个有效动作所用的分钟数,取一周中位数。对应第二章的静摩擦:启动所需的力。
- 势垒高度。 在第一个有效动作之前需要完成的准备步骤或决定的数目(找资料、选题目、开软件、决定从哪里开始)。对应第三章的 。
- 外部棘轮。 每周固定日期期待看到你的成果的人数(同伴、学生、合作者)。对应第三、五章的持续外部拉力与同伴耦合。
- 反馈延迟。 从完成一项工作到第一次看到可见反馈所经过的天数。对应第二章的「抓地力」:努力能否尽快转化为可见的进展。
推导
把核查用于一周的记录。记录是虚构的;任何人都可以在笔记本或表格里记下同样的几列。目标值是作者提出的初始值,不是标准,应根据自己的记录调整。
# Four-step barrier audit for one person (or one team) over one week.
# The log is invented here; anyone can keep the same columns in a notebook or a spreadsheet.
# Targets are the author's starting values, not norms; adjust them to your own records.
from statistics import median
# each working session: (minutes from sitting down to the first useful action,
# separate set-up steps or decisions before that action)
sessions = [(14, 4), (3, 1), (22, 5), (6, 2), (2, 1), (18, 4), (9, 3)]
watchers = 2 # people who expect to see your output on a fixed day each week
feedback_days = [6, 6, 7] # days from finishing a piece of work to the first visible response to it
start = median(s[0] for s in sessions)
steps = median(s[1] for s in sessions)
delay = median(feedback_days)
checks = [("1 start-up friction: median minutes to first action", start, start <= 5, "<= 5 min"),
("2 barrier height: median set-up steps before it", steps, steps <= 2, "<= 2"),
("3 outside ratchet: people expecting output weekly", watchers, watchers >= 2, ">= 2"),
("4 feedback delay: median days to a visible result", delay, delay <= 2, "<= 2 days")]
for name, value, ok, target in checks:
print(f"{name:52s} {value:>5} target {target:9s} {'OK' if ok else 'ACT'}")
worst = [c[0] for c in checks if not c[2]]
print(f"{len(worst)} of 4 need action; change one lever at a time and keep logging, so the effect can be seen")
# 1 start-up friction: median minutes to first action 9 target <= 5 min ACT
# 2 barrier height: median set-up steps before it 3 target <= 2 ACT
# 3 outside ratchet: people expecting output weekly 2 target >= 2 OK
# 4 feedback delay: median days to a visible result 6 target <= 2 days ACT
# 3 of 4 need action; change one lever at a time and keep logging, so the effect can be seen这一周有三项需要处理。处理的顺序有讲究:模型提示,降低势垒(例如前一天晚上把材料摆好、把第一步写成具体动作)会同时缩短开始与复发的时间,所以应当与外部棘轮搭配使用(第三章),这一周已经达标的这一项要保持住;反馈延迟可以通过把工作切成更小、可以当天展示的单元来缩短。每次只改变一个杠杆,并继续记录,才能看出哪一个起了作用。
注
这份核查表不是心理测评,不能诊断任何状况。如果启动困难持续存在,并伴有情绪低落、兴趣丧失、睡眠或注意力的明显问题,请寻求专业评估(见序言开头的说明)。
第二部分 预注册试验
问题
在一门 30 天的在线课程中,与独自学习相比,「完成两次有记录的同伴辅导才能解锁下一阶段」的规则,能否提高 30 天完课率与盲评期末测验成绩?
第五章已经说明,原先设想的「辅导两名同伴达标才能解锁」在封闭班级里会造成阻塞,因此试验采用以「辅导时段」计数的可行版本。
设计
| 要素 | 规定 |
|---|---|
| 受试者 | 18 岁以上、自愿报名一门 30 天在线课程的成年人;课程内容、价格和日程在两组完全相同;签署知情同意 |
| 设计 | 个体随机、两组平行、1:1 分配;两组各自组成独立的学习社群,避免互相影响;B 组的辅导配对在组内随机产生 |
| A 组(对照) | 独自学习:同样的材料、同样的每日提醒、同样的组内答疑区;通过阶段小测即解锁下一阶段 |
| B 组(干预) | 在 A 组全部内容之外:每通过一个阶段,须与两位不同的同组同学各完成一次至少 20 分钟、有记录的辅导时段(由被辅导者确认),才解锁下一阶段;48 小时内找不到可辅导的同学则自动解锁 |
| 共同主要结局 | (1)30 天完课率:30 天内通过全部四个阶段小测的比例;(2)第 30 天期末测验成绩:所有随机分组者无论是否完课均受邀参加,题目事先不公开,由不知道分组的评分者评分 |
| 次要结局 | 第 60 天保持测验;学习时长(平台记录);退出时间;辅导时段数;满意度;不良感受(压力、负担自评) |
| 分析 | 意向治疗分析;完课率比较率差及 97.5% 置信区间;测验成绩用含辅导小组随机效应的混合模型;缺失成绩用多重插补,并作敏感性分析 |
| 盲法 | 受试者和辅导者无法设盲(他们必然知道自己是否在辅导);评分者与统计分析者不知道分组 |
注
原先设想写作「双盲」。在这项试验中,受试者不可能不知道自己是否被要求辅导同伴,因此无法做到双盲;能做到的是评估者盲法(评分者不知道分组)与分析者盲法(分析时组别以代码表示)。本书据此修改。
样本量
推导
# Sample size for two co-primary outcomes, each tested at two-sided alpha = 0.025 (so the pair keeps 0.05):
# (1) completion of the 30-day course, a proportion; (2) blind-marked final test score, standardised.
# Learners in the teach-to-unlock arm tutor each other in small groups, so their outcomes are correlated:
# inflate by the design effect 1 + (m - 1) * ICC.
import math
from statistics import NormalDist
N = NormalDist()
def n_two_props(p1, p2, alpha, power):
za, zb = N.inv_cdf(1 - alpha / 2), N.inv_cdf(power)
pbar = (p1 + p2) / 2
num = za * math.sqrt(2 * pbar * (1 - pbar)) + zb * math.sqrt(p1 * (1 - p1) + p2 * (1 - p2))
return math.ceil((num / (p2 - p1)) ** 2)
def n_two_means(d, alpha, power):
za, zb = N.inv_cdf(1 - alpha / 2), N.inv_cdf(power)
return math.ceil(2 * ((za + zb) / d) ** 2)
deff = 1 + (3 - 1) * 0.05 # groups of 3, intraclass correlation 0.05 (assumed)
for p1, p2 in ((0.40, 0.52), (0.40, 0.55)):
n = n_two_props(p1, p2, 0.025, 0.90)
print(f"completion {100 * p1:.0f} % -> {100 * p2:.0f} %: {n} per arm, {math.ceil(n * deff)} with design effect {deff:.2f}")
for d in (0.30, 0.35):
n = n_two_means(d, 0.025, 0.90)
print(f"test score d = {d:.2f}: {n} per arm, {math.ceil(n * deff)} with design effect")
need = max(math.ceil(n_two_props(0.40, 0.52, 0.025, 0.90) * deff), math.ceil(n_two_means(0.30, 0.025, 0.90) * deff))
print(f"plan: {need} randomised per arm ({2 * need} in all); everyone is tested on day 30, finished or not")
# completion 40 % -> 52 %: 426 per arm, 469 with design effect 1.10
# completion 40 % -> 55 %: 273 per arm, 301 with design effect 1.10
# test score d = 0.30: 276 per arm, 304 with design effect
# test score d = 0.35: 203 per arm, 224 with design effect
# plan: 469 randomised per arm (938 in all); everyone is tested on day 30, finished or not两个共同主要结局各以双侧 α = 0.025 检验,使总的一类错误率不超过 0.05。按完课率从 40% 提高到 52%、把握度 90% 计算,每组需要 426 人;B 组学员在三人辅导小组中互相影响,按组内相关 0.05 计入设计效应后为每组 469 人。测验成绩按 0.30 个标准差的差异计算需要的人数更少。方案计划每组随机分配 469 人,共 938 人。40% 的基线完课率与组内相关都是假设,将在前 100 名受试者的内部预试验中核对;如果基线完课率明显不同,正式试验前重新计算样本量。
判定规则
推导
# Decision rule, fixed before any data are seen. Each co-primary outcome is judged on its own
# 97.5 % confidence interval (two-sided alpha 0.025 each) against its smallest effect worth acting on.
SESOI = {"completion (percentage points)": 10.0, "blind test score (SD units)": 0.25}
def verdict(name, diff, lo, hi):
s = SESOI[name]
if lo >= s:
v = f"benefit of at least {s:g}"
elif lo > 0:
v = "benefit; size not shown to reach the threshold"
elif hi < 0:
v = "harm: teach-to-unlock did worse"
elif lo >= -s and hi <= s:
v = "no difference worth acting on"
else:
v = "unclear"
return f"{name:32s} {diff:+6.2f} ({lo:+6.2f} to {hi:+6.2f}): {v}"
# Invented results, only to show how the trial will be reported.
print(verdict("completion (percentage points)", 6.0, -1.5, 13.5))
print(verdict("blind test score (SD units)", 0.31, 0.12, 0.50))
print(verdict("completion (percentage points)", -9.0, -16.0, -2.0))
print("the method is recommended only if neither outcome shows harm and at least one shows benefit")
# completion (percentage points) +6.00 ( -1.50 to +13.50): unclear
# blind test score (SD units) +0.31 ( +0.12 to +0.50): benefit; size not shown to reach the threshold
# completion (percentage points) -9.00 (-16.00 to -2.00): harm: teach-to-unlock did worse
# the method is recommended only if neither outcome shows harm and at least one shows benefit示例结果是编造的,用来事先说明结果将怎样报告。完课率的最小关注差为 10 个百分点,测验成绩为 0.25 个标准差。只有两项结局都没有显示伤害、且至少一项显示获益时,才建议采用这一规则。
这项试验不能说明什么
试验比较的是一个「打包」的干预:B 组学员同时得到了承诺、额外的复述练习与更多的人际接触,试验不能区分这几种成分各自的作用。它只检验一种课程、一种在线形式、一群自愿报名的成年人;结果不能直接推广到中小学生、线下课堂或其他学科。它也不检验任何要求学员招募新学员的规则(见第五章的说明)。
伦理与利益冲突
试验须经独立伦理委员会批准,取得知情同意,并在第一位受试者入组之前登记方案、分析计划和判定规则 (Chan et al. 2013; Nosek et al. 2018)。受试者可以随时退出,退出不影响其继续使用课程材料。报告将遵循 CONSORT 规范,并说明辅导小组造成的聚类 (Campbell et al. 2012)。
利益披露
作者以本书作为其社群认知课程、升维牌卡与 Yafu AI 知识库的底层方法论,因此与本书主题及第八章试验的结果有直接的商业利益关系。本书不推销任何课程、牌卡或产品,也不作任何健康或疗效声称;试验设计为由独立于作者企业的研究人员实施和分析;书中所有代码与研究方案均公开,供任何人检验。为限制这种利益的影响:方案、分析代码和判定规则在入组前公开;无论结果如何,结果、数据和代码都将公开。
参考文献
Fan, Y. (2026). Classical and Statistical Mechanics of Human Action: Psychological Inertia, Static Friction Thresholds, Kramers Escape Rate in Double-Well Potentials and Habit Phase Transitions, Read Beside East Asian Philosophy of Practice [行动的经典与统计力学] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23738774 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).