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

Calculating the probability of incorrect events within independent groups

我有以下结构:

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 毫秒 window(间隔)出现 'incorrect' 的概率。

    例如,第一次 window,前 100 毫秒,有 4 次试验,4 次中有 2 次 'incorrect',所以它将是 2/4 = 0.5

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

非常感谢任何帮助。

这违背了我在回答问题时不让提问者做出任何努力的政策,但这似乎是一个有趣的问题,所以我会破例。


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

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

接下来,您可以做的是在发言时将时间数组中的每个条目除以 100。属于同一 ID 的值表示它们属于一组 100 毫秒。请注意,我们还需要为下一步添加 1...你会明白为什么:

groups = floor(time/100) + 1;

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

具体来说,我们要做的是针对 groups 中指定的每组值,我们将查看 correctincorrect 数字标签并确定通过对每组有多少等于 2 求和,然后除以每组有多少,可以得出多少不正确。这些组需要从索引 1 开始,这就是为什么我们必须将 1 添加到 groups。没有它,第一组实际上将从 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 的倍数上升,直到与我们拥有的组一样多。在我们的例子中,随着时间增加到 395 毫秒,我们有 4 个。

因此,我们得到: