数据分析任务的背景信息介绍:
这次的任务所使用的数据来自作者本人之前做的一个数学认知研究,数据是采用数量比较任务收集的,其原理为整体数量比较过程中,语义距离近的数字对的反应时会比语义距离远的条件的难度大,反应时更长(即,距离效应),错误率越低。
实验:数量比较任务
被试:20人
材料:24组数字对,其中1~12为近距离数字对,13~24为远距离数字对
实验程序:要求被试比较数字对中两数字的大小,按键完成相应判断。24组数字为1个循环,每名被试将进行8个循环的实验操作
数据收集:反应时,正确率
实验流程:
![8ad21d39a002c81b174e465fe0038e13.png](https://i-blog.csdnimg.cn/blog_migrate/0d3b942deff7e7a51edf4dcba7eab16c.jpeg)
数据样例:
![bbe679f9677979fc9388d31ccf0249fa.png](https://i-blog.csdnimg.cn/blog_migrate/342793348c713705a994006847d00a85.jpeg)
以上是实验部分的相关内容,我们最终用Matlab要解决的问题在于:计算每名被试在2种语义距离条件下的平均反应时,试对以下实验数据进行分析。
数据所在的百度云盘的位置如下:
链接:(点击左下角阅读原文) 密码:d0at
Matlab数据分析有一个基本流程:
(1)准备好文件路径;
(2)读取数据;
(3)矩阵操作;
(4)输出结果。
(1)准备好文件路径
首先我们要分析数据的分布情况,以数字对比较任务的数据为例子,它分为20个被试文件夹(sub1, sub2, sub3, ... ... sub20),每个被试的文件夹中有一个数据文件,它的文件名叫做:“result_selectionA_1.txt”。
获取这个文件路径,要用到for循环+路径字符串拼接sprintf() 函数。
基本语法[1]:for 循环变量 =初值:步长:终值
注:每个for循环语句都必须用end结束
![0030ea59d36c0c90657f603d047aa1b2.png](https://i-blog.csdnimg.cn/blog_migrate/8ded67da8464c2ed24d0b5395fa3cbc6.jpeg)
SubjectNo = 20;
% LOOP: index is i
for i = 1:SubjectNo
准备文件全路径的执行语句(具体见下边的基本语法[2])
end
基本语法[2]
% 获取当前的工作目录,也就是当前.m文件所在的目录
CurrentWorkingPath = fileparts(mfilename('fullpath'));
% 准备每个被试文件夹名
tmpSubjectFolder = sprintf('sub%d', i);
% 准备每个被试的数据文件名
txtFileName = 'result_selectionA_1.txt';
% 拼接路径和文件名字符串
txtPathName = sprintf('%s\\%s\\%s', CurrentWorkingPath , tmpSubjectFolder, txtFileName );
(2)读取数据
当for循环中的文件全路径准备好之后,接下来我们要做的就是将数据读取出来。
textread函数的基本语法是:[A, B, C, ...] = textread(txtPathName, format)
2. 该函数的语法含义:将 txtPathName 中的数据按顺序依次读取到变量列表 A, B, C当中,format为变量A,B,C的数据格式。
(1)[A,B,C,...]:指变量列表
(2)txtPathName:指文本文件的全路径
(3)format中定义的指代个数要与[ ]里变量的个数要一致
我们首先要分析数据的格式,具体见下图:
![15aed87d4ca3fe8557b0e7b09ce47689.png](https://i-blog.csdnimg.cn/blog_migrate/119283dd0ecd2943e7e694413de4fa2d.jpeg)
这个数据总共有8列数据,但是前两列的数据没有用。
第3列是 Trial ID,第4-5列是数字对的具体数字,第6列是条件Type,第7列是反应时,第8列是正确率(正确反应记为1,错误反应记做0)。
我们会采用 textread这个函数读取数据:
[useless1, useless2, Trial, digit1, digit2, Type, ReactionTime, Accurate] = textread(Filepath,'%s %s %d %d %d %d %d %d','delimiter', ' ');
(3)矩阵操作
数据读取之后,要根据我们设定的条件,也就是第6列Type的信息,进行条件分类(语义距离:近距离 vs. 远距离),1-12属于近距离,13-24属于远距离。
具体实现分为两步,一是将数据合并成一个完整的矩阵,二是mean函数的使用。
Part. 1 将数据合并成一个完整的矩阵,
首先要准备这么一个矩阵dataMatrix,里边的数值可以先设为0
dataMatrix=zeros(Subno, 192, 6);
然后,将读取的Trial, digit1, digit2, Type, ReactionTime 和 Accurate向量依次赋值给dataMatrix这个矩阵:
dataMatrix(i,:,1) = Trial
dataMatrix(i,:,2) = digit1
dataMatrix(i,:,3) = digit2
dataMatrix(i,:,4) = Type
dataMatrix(i,:,5) = ReactionTime
dataMatrix(i,:,6) = Accurate
Part. 2 Mean函数的使用
mean函数的使用方法见下图:
![4c5752064795099df5bfa31fc7c1b42d.png](https://i-blog.csdnimg.cn/blog_migrate/25aaceb99120131f701758a2c634e990.jpeg)
需要说明的是,在进行数据筛选时,往往会用到逻辑运算符:或(||);且(&&);非(~)
(1)“或”:一真为真
(2)“且”:一假为假
(3)“非”:相反
求过平均之后,每个被试应该有4个数据,分别是反应时的近距离+远距离;正确率的近距离+远距离。
SubjectNo = 20;
Matrix_2conditions_RT_ACC = zeros(SubjectNo ,2,2)
我们举对近距离的反应时求平均的例子:
Matrix_2conditions_RT_ACC(i,1,1) = Mean(dataMatrix(i,dataMatrix(i,:,4)==1|dataMatrix(i,:,4)==2|dataMatrix(i,:,4)==3|dataMatrix(i,:,4)==4|dataMatrix(i,:,4)==5|dataMatrix(i,:,4)==6|dataMatrix(i,:,4)==7|dataMatrix(i,:,4)==8|dataMatrix(i,:,4)==9|dataMatrix(i,:,4)==10|dataMatrix(i,:,4)==11|dataMatrix(i,:,4)==12&dataMatrix(i,:,6)==1,5));
这句话的含义是,将所有符合条件(Type在1-12范围内,而且正确率必须为1)的所有trial对应的反应时做平均叠加。
这样写实际上是很傻的,还好这里的type只有12个,如果是120个估计要写到抽筋了。如果你理解了这段代码背后的含义,还有一种更简单的写法
Matrix_2conditions_RT_ACC(i,1,1) = Mean(dataMatrix(i,dataMatrix(i,:,4)<=12 & dataMatrix(i,:,6)==1, 5));
以此类推,远距离的反应时求平均的代码如下:
Matrix_2conditions_RT_ACC(i,2,1) = Mean(dataMatrix(i,dataMatrix(i,:,4)>12 & dataMatrix(i,:,6)==1, 5));
近距离的正确率求平均:
Matrix_2conditions_RT_ACC(i,1,2)= Mean(dataMatrix(i,dataMatrix(i,:,4)<=12,6));
远距离的正确率求平均:
Matrix_2conditions_RT_ACC(i,2,2)= Mean(dataMatrix(i,dataMatrix(i,:,4)>12,6));
(4)输出结果
我们会将计算所得的结果,分为反应时和正确率两个Sheets,输出到Excel文件里边。
![4933dac4499b656015130398c98cbb1e.png](https://i-blog.csdnimg.cn/blog_migrate/c7f3145c2dc0789acb4f7fbe226a7237.jpeg)
Excel写入文件的操作采用的是 xlswrite函数:
[success, message] = xlswrite(excelPathName, sMatrix, ‘sheet’, ‘range’) ;
将矩阵sMatrix的数据写入名为excelPathName的Excel文件中,在xlswrite函数中还需要指定矩阵变量,sheet名和范围。
当然,除了数据之外,还需要在数据的左侧添加被试的序号
完整的代码如下:
subSeries=1:1:Subno;
xlswrite('selection_beData_forSpss',subSeries', 'RTs', 'B1');
xlswrite('selection_beData_forSpss',Matrix_2conditions_RT_ACC(:,:,1), 'RTs', 'C1');
在Excel中,基于数量比较任务的反应时数据,可以画出如下的折线图图表:
![d8423cf61052002112da4419c1a10529.png](https://i-blog.csdnimg.cn/blog_migrate/464fb7cbbf421b05bb2db7fd0b4df1ce.jpeg)
最后终于找到了8号被试的数据,它的效应方向跟所有的被试都是反着的,任务完成
本文内容经过原作者蒋挺老师授权转载,写作权归原作者所有。文章仅供学习使用,不用于商业行为,若有侵权及疑问,请后台留言!
赞赏小编
52brain,Connect Young Brains.
推荐阅读:
心理学MATLAB初学者教程 --前言及目录Matlab中EEGLAB工具箱的下载及安装心理学MATLAB初学者教程 -- 脑电数据读取
心理学MATLAB初学者教程--简单数据类型介绍
心理学MATLAB初学者教程--MATLAB界面介绍以及如何查
心理学MATLAB初学者教程--Psychtoolbox介绍
心理学MATLAB初学者教程--循环语句的使用