数据分析任务的背景信息介绍: 这次的任务所使用的数据来自作者本人之前做的一个数学认知研究,数据是采用数量比较任务收集的,其原理为整体数量比较过程中,语义距离近的数字对的反应时会比语义距离远的条件的难度大,反应时更长(即,距离效应),错误率越低。 实验:数量比较任务 被试:20人 材料:24组数字对,其中1~12为近距离数字对,13~24为远距离数字对 实验程序:要求被试比较数字对中两数字的大小,按键完成相应判断。24组数字为1个循环,每名被试将进行8个循环的实验操作 数据收集:反应时,正确率 实验流程: 数据样例: 以上是实验部分的相关内容,我们最终用Matlab要解决的问题在于:计算每名被试在2种语义距离条件下的平均反应时,试对以下实验数据进行分析。 数据所在的百度云盘的位置如下: 链接:(点击左下角阅读原文) 密码:d0at Matlab数据分析有一个基本流程: (1)准备好文件路径; (2)读取数据; (3)矩阵操作; (4)输出结果。 (1)准备好文件路径 首先我们要分析数据的分布情况,以数字对比较任务的数据为例子,它分为20个被试文件夹(sub1, sub2, sub3, ... ... sub20),每个被试的文件夹中有一个数据文件,它的文件名叫做:“result_selectionA_1.txt”。 获取这个文件路径,要用到for循环+路径字符串拼接sprintf() 函数。 基本语法[1]:for 循环变量 =初值:步长:终值 注:每个for循环语句都必须用end结束 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循环中的文件全路径准备好之后,接下来我们要做的就是将数据读取出来。
2. 该函数的语法含义:将 txtPathName 中的数据按顺序依次读取到变量列表 A, B, C当中,format为变量A,B,C的数据格式。 (1)[A,B,C,...]:指变量列表 (2)txtPathName:指文本文件的全路径 (3)format中定义的指代个数要与[ ]里变量的个数要一致 我们首先要分析数据的格式,具体见下图: 这个数据总共有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函数的使用方法见下图: 需要说明的是,在进行数据筛选时,往往会用到逻辑运算符:或(||);且(&&);非(~) (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文件里边。 Excel写入文件的操作采用的是 xlswrite函数: [success, message] = xlswrite(excelPathName, sMatrix, ‘sheet’, ‘range’) ; 将矩阵sMatrix的数据写入名为excelPathName的Excel文件中,在xlswrite函数中还需要指定矩阵变量,sheet名和范围。 当然,除了数据之外,还需要在数据的左侧添加被试的序号 完整的代码如下: subSeries=1:1:Subno; 在Excel中,基于数量比较任务的反应时数据,可以画出如下的折线图图表: 最后终于找到了8号被试的数据,它的效应方向跟所有的被试都是反着的,任务完成 本文内容经过原作者蒋挺老师授权转载,写作权归原作者所有。文章仅供学习使用,不用于商业行为,若有侵权及疑问,请后台留言! |
|