1. 延迟折扣任务(DDT)概述
延迟折扣任务(Delay Discounting Task,简称DDT)是心理学和行为经济学中常用的实验范式,用于测量个体在面对即时奖励和延迟奖励时的决策偏好。这个任务能有效评估一个人的冲动控制能力和未来时间导向程度。
在实验过程中,被试者需要在"立即获得较小金额"和"延迟一段时间后获得较大金额"之间做出选择。通过分析被试的选择模式,研究人员可以绘制出个体的"折扣曲线",量化其延迟满足能力。这种测量方法在成瘾行为研究、注意力缺陷多动障碍(ADHD)诊断以及金融决策等领域都有广泛应用。
2. 使用PsychoPy实现DDT的优势
PsychoPy是一个开源的心理学实验构建工具,使用Python语言开发,具有以下特点使其特别适合实现延迟折扣任务:
- 跨平台兼容性:支持Windows、macOS和Linux系统
- 精确的时间控制:可达到毫秒级的刺激呈现精度
- 灵活的刺激呈现:支持文本、图像、视频等多种刺激材料
- 数据记录完整:自动记录反应时、选择结果等关键数据
- 开源免费:没有使用成本,适合学术研究
相比传统的E-Prime等商业软件,PsychoPy的学习曲线更为平缓,且完全免费,特别适合预算有限的科研团队和学生研究者。
3. DDT实验设计要点
3.1 基本实验流程设计
一个标准的延迟折扣任务通常包含以下环节:
- 指导语阶段:清晰说明任务规则
- 练习阶段:让被试熟悉操作
- 正式实验阶段:包含多个trial
- 结束阶段:显示感谢信息
每个trial的基本结构:
- 呈现选择项(如"今天获得50元" vs "1个月后获得100元")
- 记录被试选择
- 记录反应时间
- 进入下一个trial
3.2 关键参数设置
在设计DDT实验时,需要精心设置以下参数:
- 延迟时间梯度:通常设置7个左右的时间点(如1天、1周、1个月、3个月、6个月、1年、2年)
- 金额比例:即时金额与延迟金额的比例(如50/100、80/100等)
- trial数量:每个时间点建议设置3-5个trial,总trial数约30-50个
- 呈现顺序:建议随机化呈现顺序,避免顺序效应
4. 使用PsychoPy构建DDT的详细步骤
4.1 环境准备
首先需要安装PsychoPy:
bash复制pip install psychopy
4.2 创建实验框架
python复制from psychopy import visual, core, event
# 创建窗口
win = visual.Window(size=(800, 600), units='pix')
# 创建文本刺激
instruction = visual.TextStim(win, text="欢迎参加延迟折扣任务实验")
left_option = visual.TextStim(win, text="", pos=(-200,0))
right_option = visual.TextStim(win, text="", pos=(200,0))
4.3 实现核心实验逻辑
python复制# 定义实验参数
delays = [1, 7, 30, 90, 180, 365, 730] # 延迟天数
immediate_amounts = [50, 60, 70, 80] # 即时金额
delayed_amount = 100 # 延迟金额
# 实验主循环
for delay in delays:
for imm_amount in immediate_amounts:
# 设置选项文本
left_option.text = f"今天获得{imm_amount}元"
right_option.text = f"{delay}天后获得{delayed_amount}元"
# 呈现选项
left_option.draw()
right_option.draw()
win.flip()
# 等待并记录反应
response = None
rt_clock = core.Clock()
while response is None:
keys = event.getKeys()
if 'left' in keys:
response = 'immediate'
rt = rt_clock.getTime()
elif 'right' in keys:
response = 'delayed'
rt = rt_clock.getTime()
elif 'escape' in keys:
core.quit()
# 记录数据
trial_data = {
'delay': delay,
'immediate_amount': imm_amount,
'response': response,
'reaction_time': rt
}
# 保存数据到文件...
4.4 数据记录与保存
建议使用csv格式保存数据:
python复制import csv
# 在实验开始前
with open('ddt_data.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['participant_id', 'trial', 'delay', 'immediate_amount',
'response', 'reaction_time'])
# 在每个trial后
with open('ddt_data.csv', 'a', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow([participant_id, trial_num, delay, imm_amount,
response, rt])
5. 数据分析方法
5.1 计算折扣率
常用的折扣率计算模型包括:
-
双曲线模型:V = A/(1+kD)
- V: 主观价值
- A: 实际金额
- D: 延迟时间
- k: 折扣率参数
-
指数模型:V = A*e^(-kD)
其中k值越大,表示个体越倾向于选择即时奖励,冲动性越高。
5.2 Python实现折扣率计算
python复制import numpy as np
from scipy.optimize import curve_fit
# 假设我们已经有了实验数据
delays = np.array([1, 7, 30, 90, 180, 365, 730])
prob_choose_delayed = np.array([0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3]) # 示例数据
# 定义双曲线函数
def hyperbolic(x, k):
return 1 / (1 + k * x)
# 拟合曲线
params, _ = curve_fit(hyperbolic, delays, prob_choose_delayed)
k = params[0]
print(f"估计的折扣率k值为: {k:.4f}")
6. 实验优化与注意事项
6.1 提高实验效度的技巧
- 加入注意力检查:随机插入一些明显偏向某一选项的trial,检验被试是否认真参与
- 金额范围调整:根据预实验结果调整金额比例,确保不会出现天花板或地板效应
- 时间单位统一:所有延迟时间使用相同单位(如统一用"天")
- 加入练习trial:确保被试完全理解任务要求
6.2 常见问题排查
-
刺激呈现时间不准确:
- 确保使用
win.flip()而不是win.update() - 关闭不必要的后台程序
- 在较新的电脑上运行实验
- 确保使用
-
按键反应未被记录:
- 检查键盘映射是否正确
- 确保没有其他程序占用键盘输入
- 测试时使用
print(keys)调试按键检测
-
数据保存失败:
- 检查文件路径是否有写入权限
- 确保每次写入后关闭文件
- 考虑使用
try-except块捕获异常
7. 高级功能扩展
7.1 添加图形化反馈
可以在实验过程中添加进度条或积分反馈,提高被试参与度:
python复制# 创建进度条
progress_bar = visual.Rect(win, width=0, height=20, pos=(0, -250), fillColor='blue')
# 在trial循环中更新
progress_bar.width = (trial_num / total_trials) * 600
progress_bar.draw()
7.2 多模态刺激呈现
除了文本,还可以使用图形或声音刺激:
python复制# 添加图形刺激
money_img = visual.ImageStim(win, image='money.png', size=(100,100))
# 在适当的位置绘制
money_img.pos = (-200, 100)
money_img.draw()
7.3 网络化数据收集
使用PsychoPy的Pavlovia平台进行在线实验:
python复制from psychopy.hardware import keyboard
from psychopy.data import ExperimentHandler
# 创建实验处理器
exp = ExperimentHandler(name='DDT',
saveWideText=True,
dataFileName='data')
# 在每个trial后
exp.addData('response', response)
exp.addData('rt', rt)
exp.nextEntry()
8. 实际应用案例
8.1 临床研究中的应用
在某项关于物质依赖的研究中,研究者使用PsychoPy实现的DDT发现:
- 吸烟者的平均k值为0.08
- 非吸烟者的平均k值为0.03
- 差异具有统计学意义(p<0.01)
这表明吸烟者更倾向于选择即时奖励,延迟满足能力较低。
8.2 教育领域的应用
一项针对大学生的研究发现:
- 高k值(>0.05)的学生更容易出现拖延行为
- 通过DDT筛选出的高冲动性学生,经过干预后学业成绩提升显著
8.3 金融决策研究
在投资决策研究中发现:
- 专业投资者的平均k值为0.02
- 普通投资者的平均k值为0.06
- k值与投资回报率呈负相关(r=-0.45)
9. 实验伦理考量
实施DDT实验时需要注意以下伦理问题:
- 知情同意:确保被试充分了解实验内容和权利
- 数据匿名化:妥善处理个人身份信息
- 报酬合理性:如果提供报酬,应明确说明是否与实际选择相关
- 退出机制:被试应能随时退出实验而不受惩罚
- 结果反馈:考虑是否以及如何向被试提供个人结果
10. 资源与进阶学习
10.1 推荐学习资料
-
PsychoPy官方文档:https://www.psychopy.org/
-
延迟折扣任务经典文献:
- Kirby, K. N. (2009). One-year temporal stability of delay-discount rates.
- Mazur, J. E. (1987). An adjusting procedure for studying delayed reinforcement.
-
Python心理学实验编程:
- 《Python for Experimental Psychologists》
- 《Building Experiments in PsychoPy》
10.2 实用代码库
-
PsyExp:心理学实验常用函数库
bash复制
pip install psyexp -
NeuroKit2:神经科学和心理学数据分析工具
bash复制
pip install neurokit2 -
Pandas:数据处理和分析
bash复制
pip install pandas
10.3 社区支持
- PsychoPy论坛:https://discourse.psychopy.org/
- GitHub仓库:https://github.com/psychopy/psychopy
- 心理学编程交流群:许多大学和研究机构都有相关交流群组
