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

时间:2015-06-23 01:28:11

标签: arrays matlab struct histogram probability

我有以下结构:

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'});

我想执行以下两项任务:

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

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

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

  3. 我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

这违背了我在回答问题时没有做出任何问题的政策,但这似乎是一个有趣的问题,所以我会例外。

首先,拆分每个TimeTrial字段,使它们位于不同的数组中。对于Trial字段,我要将它们转换为标签1和2以表示correctincorrect以便于实施:

time = [T.Time].';
trial = {T.Trial}.';
[~,~,trial_ID] = unique(trial);

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

groups = floor(time/100) + 1;

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

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

per = accumarray(groups, trial_ID, [], @(x) sum(x == 2) / numel(x));

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

>> per

per =

    0.5000
    0.3333
    0.2500
    0.6667

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

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

bar(100*(1:numel(per)), per);
xlabel('Time (ms)');
ylabel('Probability');

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

因此,我们得到:

enter image description here