1. 剑桥博弈任务(CGT)简介
剑桥博弈任务(Cambridge Gambling Task, CGT)是认知心理学和神经科学领域广泛使用的一种决策行为评估工具。它最初由剑桥大学的研究团队开发,用于测量个体的风险决策能力、冲动控制水平和奖赏敏感性等高级认知功能。
这个任务的核心在于让参与者在不同风险条件下做出一系列选择,通过分析他们的决策模式来评估:
- 风险偏好程度(risk-taking propensity)
- 决策质量(decision quality)
- 对概率信息的敏感度(probability sensitivity)
- 延迟满足能力(delayed gratification)
在临床应用中,CGT常用于评估前额叶皮层功能,特别是眶额叶皮层(OFC)和腹内侧前额叶皮层(vmPFC)的损伤情况。这些脑区受损的患者往往表现出异常的风险决策模式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PsychoPy平台与CGT实现
2.1 为什么选择PsychoPy
PsychoPy是一个开源的心理学实验构建平台,使用Python作为脚本语言。它特别适合实现CGT这类需要精确计时和复杂交互的实验范式,主要优势包括:
- 跨平台兼容性:支持Windows、macOS和Linux系统
- 毫秒级计时精度:满足认知实验的时间敏感性要求
- 灵活的刺激呈现:支持图片、文字、视频等多种刺激材料
- 数据记录完整:自动保存反应时、选择结果等关键数据
2.2 实验基本结构
一个标准的CGT实验通常包含以下组件:
- 指导语界面:用简明语言说明任务规则
- 练习试次:让被试熟悉操作流程
- 正式实验模块:包含多个风险等级不同的试次
- 结果反馈:显示累计得分或报酬
每个试次的基本流程为:
- 呈现选项(通常是不同颜色的盒子或柱状图)
- 显示各选项的获胜概率(如红盒70%,蓝盒30%)
- 被试做出选择
- 显示结果(赢/输及对应点数)
3. 使用鲲码园PsychoPy实现CGT
3.1 环境准备
首先需要安装PsychoPy环境:
bash复制pip install psychopy
建议使用鲲码园提供的定制版PsychoPy,它预装了常用的实验模板和中文支持:
bash复制git clone https://github.com/kunmayuan/psychopy-cgt-template.git
cd psychopy-cgt-template
pip install -r requirements.txt
3.2 实验参数配置
创建一个config.py文件存储实验参数:
python复制# 试次数量
TRIALS = 60
# 风险等级设置
RISK_LEVELS = {
'low': {'prob': 0.7, 'ratio': '70:30'},
'medium': {'prob': 0.6, 'ratio': '60:40'},
'high': {'prob': 0.5, 'ratio': '50:50'}
}
# 点数设置
POINT_VALUES = {
'win': 10,
'loss': -5
}
# 颜色配置
COLORS = {
'option1': '#FF6B6B',
'option2': '#4ECDC4',
'background': '#F7FFF7'
}
3.3 核心实验代码
主实验程序cgt_main.py的关键部分:
python复制from psychopy import visual, event, core
import random
from config import *
def run_trial(win, risk_level):
# 创建刺激材料
option1 = visual.Rect(win, width=0.3, height=0.5, fillColor=COLORS['option1'])
option2 = visual.Rect(win, width=0.3, height=0.5, fillColor=COLORS['option2'])
prob_text = visual.TextStim(win, text=RISK_LEVELS[risk_level]['ratio'], height=0.08)
# 随机左右位置
positions = [-0.4, 0.4]
random.shuffle(positions)
# 呈现刺激
option1.pos = (positions[0], 0)
option2.pos = (positions[1], 0)
prob_text.pos = (0, -0.3)
option1.draw()
option2.draw()
prob_text.draw()
win.flip()
# 等待响应
clock = core.Clock()
response = None
while clock.getTime() < 5: # 5秒超时
keys = event.getKeys(keyList=['left', 'right', 'escape'])
if 'escape' in keys:
return 'abort'
elif 'left' in keys:
response = 'left'
break
elif 'right' in keys:
response = 'right'
break
# 确定选择结果
if response:
chosen_option = option1 if response == 'left' else option2
win_prob = RISK_LEVELS[risk_level]['prob'] if chosen_option == option1 else 1 - RISK_LEVELS[risk_level]['prob']
outcome = 'win' if random.random() < win_prob else 'loss'
points = POINT_VALUES[outcome]
else:
outcome = 'timeout'
points = 0
return {
'response': response,
'outcome': outcome,
'points': points,
'rt': clock.getTime() if response else None
}
4. 实验设计注意事项
4.1 风险等级平衡
为确保实验结果可靠,建议采用完全平衡设计:
- 每个风险等级(低、中、高)的试次数相同
- 高奖励选项的位置(左/右)随机化
- 不同颜色与选项的关联随机化
4.2 数据记录要点
除了记录被试的选择和结果外,还应收集:
- 反应时(从刺激呈现到做出选择的时间)
- 选择策略变化(是否随实验进程调整)
- 对反馈的情绪反应(可通过面部表情或生理指标)
示例数据记录结构:
python复制{
'trial_num': 1,
'risk_level': 'low',
'option_positions': {'left': 'red', 'right': 'blue'},
'chosen_option': 'red',
'outcome': 'win',
'points': 10,
'rt': 1.234,
'total_points': 10,
'timestamp': '2023-05-15 14:30:22'
}
4.3 常见问题排查
-
计时不准确:
- 确保使用
core.Clock()而非time.time() - 关闭不必要的后台程序
- 在实验开始前进行时间校准测试
- 确保使用
-
刺激呈现错位:
- 检查屏幕分辨率和PsychoPy单位设置(建议使用'height'单位)
- 验证刺激物的锚点位置(默认是中心)
-
数据丢失:
- 实现自动备份机制(每5个试次保存一次)
- 添加异常处理捕获可能的错误
5. 数据分析方法
5.1 核心指标计算
完成实验后,通常计算以下行为指标:
-
风险选择比例:
python复制risk_choices = sum(1 for t in trials if t['risk_level'] == 'high' and t['response']) total_high_risk = sum(1 for t in trials if t['risk_level'] == 'high') risk_propensity = risk_choices / total_high_risk -
决策质量指数:
python复制optimal_choices = sum(1 for t in trials if ((t['risk_level'] == 'low' and t['chosen_option'] == 'red') or (t['risk_level'] in ['medium','high'] and t['chosen_option'] == 'blue'))) decision_quality = optimal_choices / len(trials) -
反应时模式:
python复制mean_rt = sum(t['rt'] for t in trials if t['rt']) / sum(1 for t in trials if t['rt']) rt_variability = statistics.stdev(t['rt'] for t in trials if t['rt'])
5.2 结果可视化
使用matplotlib创建关键结果图表:
python复制import matplotlib.pyplot as plt
import numpy as np
# 风险选择比例柱状图
risk_levels = ['low', 'medium', 'high']
prop_risky = [
sum(1 for t in trials if t['risk_level']==lvl and t['chosen_option']=='blue') /
sum(1 for t in trials if t['risk_level']==lvl)
for lvl in risk_levels
]
plt.bar(risk_levels, prop_risky)
plt.title('Risk Taking by Condition')
plt.ylabel('Proportion of Risky Choices')
plt.ylim(0, 1)
plt.show()
6. 实验变体与扩展
6.1 动态调整版本
为增加挑战性,可以实现在线调整算法:
python复制def adaptive_difficulty(performance_history):
"""根据近期表现动态调整风险等级"""
last_5 = performance_history[-5:]
win_rate = sum(1 for p in last_5 if p['outcome'] == 'win') / 5
if win_rate > 0.7:
return 'high'
elif win_rate > 0.5:
return 'medium'
else:
return 'low'
6.2 多模态测量扩展
结合其他测量方式获取更丰富数据:
- 眼动追踪:记录选项注视时间
- 皮肤电反应:测量决策时的生理唤醒
- fMRI兼容版:使用PsychoPy的MRI模式
6.3 临床应用调整
针对特殊人群的修改建议:
- 儿童版:使用更简单的视觉刺激和游戏化反馈
- 临床患者版:延长反应时间限制,增加练习试次
- 跨文化研究:调整颜色象征意义和点数价值
7. 实际应用中的经验分享
在多个研究项目中使用PsychoPy实现CGT后,总结出以下实用建议:
-
预实验检查清单:
- 确认所有依赖库版本兼容
- 测试不同屏幕分辨率的显示效果
- 准备备用数据存储方案(如USB即时备份)
-
提高参与度技巧:
- 添加进度条显示实验完成度
- 设置间歇性鼓励反馈(如"做得很好,继续保持!")
- 使用有意义的点数兑换规则(如兑换小礼品)
-
调试技巧:
- 在开发模式使用
win = visual.Window(size=(800,600))方便调试 - 添加
print语句记录关键节点状态 - 使用
psychopy.logging模块记录详细运行日志
- 在开发模式使用
-
性能优化:
- 预加载所有刺激材料
- 避免在试次循环中创建新对象
- 对于复杂动画,考虑使用OpenGL加速
通过鲲码园提供的PsychoPy模板和这些实践建议,研究者可以快速构建出专业级的剑桥博弈任务实验,获得可靠的决策行为数据。这种实现方式既保持了实验范式的标准化,又提供了足够的灵活性来适应不同的研究需求。
