计算独立组内不正确事件的概率

chi*_*_16 0 arrays matlab struct probability histogram

我有以下结构:

T = struct('Time',{20, 40, 50, 80, 120, 150, 190, 210, 250, 260, 270, 320, 350, 380, 385, 390, 395},...
           'Trial',{'correct','incorrect','incorrect','correct','correct','correct','incorrect','incorrect','correct','correct','correct','incorrect','incorrect','correct','correct','incorrect','incorrect'});
Run Code Online (Sandbox Code Playgroud)

我想执行以下两个任务:

  1. 我希望得到'incorrect'每100毫秒时间窗口(间隔)的概率.

    例如,对于第一个时间窗口,前100毫秒,有4个试验,2个是'incorrect'4个,所以它会是2/4 = 0.5

  2. 我想绘制每个100毫秒时间窗口概率的条形图.所述x轴是时间,而每个条形的宽度将是100毫秒,其高度为用于该特定窗口的概率.

我非常感谢任何帮助.

ray*_*ica 6

这违背了我的回答问题的政策而没有提出问题的任何努力,但这似乎是一个有趣的问题,所以我会例外.


首先,拆分每个TimeTrial字段,使它们位于不同的数组中.对于Trial字段,我将它们转换为标签1和2以表示correct并且incorrect易于实现:

time = [T.Time].';
trial = {T.Trial}.';
[~,~,trial_ID] = unique(trial);
Run Code Online (Sandbox Code Playgroud)

接下来,您可以做的是获取时间数组中的每个条目,并在发言时除以100.属于同一ID的值意味着它们属于100 ms的组.请注意,我们还需要为下一步添加1 ...您将看到原因:

groups = floor(time/100) + 1;
Run Code Online (Sandbox Code Playgroud)

现在,这可能是您在MATLAB中可以使用的最美丽的函数之一:accumarray. accumarray根据ID对数组的部分进行分组,并将函数应用于每个组的所有值.在我们的例子中,我们希望根据groups数组对所有正确和不正确的ID进行分组,然后从那里我们确定每组不正确的值的总分数.

具体来说,我们要做的是对于指定的每组值groups,我们将查看correctincorrect数字标签,并通过总计每个组的等于2的数量来确定有多少是不正确的,然后除以每组有多少人.这些组需要从索引1开始,这就是我们必须添加1的原因groups.没有它,第一组实际上从0开始,MATLAB开始索引为1,因此偏移:

per = accumarray(groups, trial_ID, [], @(x) sum(x == 2) / numel(x));
Run Code Online (Sandbox Code Playgroud)

per 包含每组正确的分数,我们得到:

>> per

per =

    0.5000
    0.3333
    0.2500
    0.6667
Run Code Online (Sandbox Code Playgroud)

非常好!快速手动计算将证明您获得了正确的结果.


现在最后一部分是在条形图上绘制概率.这非常简单:

bar(100*(1:numel(per)), per);
xlabel('Time (ms)');
ylabel('Probability');
Run Code Online (Sandbox Code Playgroud)

我创建一个从100开始的向量,并以100的倍数上升,直到我们拥有多个组.在我们的例子中,我们有4个,时间长达395毫秒.

因此,我们得到:

在此输入图像描述