分享

MATLAB数据分析和可视化

 钟山紫竹林 2019-11-16

数据分析任务的背景信息介绍:

这次的任务所使用的数据来自作者本人之前做的一个数学认知研究,数据是采用数量比较任务收集的,其原理为整体数量比较过程中,语义距离近的数字对的反应时会比语义距离远的条件的难度大,反应时更长(即,距离效应),错误率越低。

实验:数量比较任务

被试: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循环中的文件全路径准备好之后,接下来我们要做的就是将数据读取出来。

  1. textread函数的基本语法是:[A, B, C, ...] = textread(txtPathName, format)

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;
xlswrite('selection_beData_forSpss',subSeries', 'RTs', 'B1');
xlswrite('selection_beData_forSpss',Matrix_2conditions_RT_ACC(:,:,1), 'RTs', 'C1');

在Excel中,基于数量比较任务的反应时数据,可以画出如下的折线图图表:

最后终于找到了8号被试的数据,它的效应方向跟所有的被试都是反着的,任务完成


本文内容经过原作者蒋挺老师授权转载,写作权归原作者所有。文章仅供学习使用,不用于商业行为,若有侵权及疑问,请后台留言!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多