计算独立组内不正确事件的概率
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'});
我想执行以下两个任务:
我想得到每 100 毫秒 window(间隔)出现 'incorrect'
的概率。
例如,第一次 window,前 100 毫秒,有 4 次试验,4 次中有 2 次 'incorrect'
,所以它将是 2/4 = 0.5
我想绘制每 100 毫秒时间的概率条形图 window。 x
轴是时间,每个条的宽度是 100 毫秒,它的高度是特定 window 的概率。
非常感谢任何帮助。
这违背了我在回答问题时不让提问者做出任何努力的政策,但这似乎是一个有趣的问题,所以我会破例。
首先,拆分每个 Time
和 Trial
字段,使它们位于单独的数组中。对于 Trial
字段,我将它们转换为标签 1 和 2 以表示 correct
和 incorrect
以便于实施:
time = [T.Time].';
trial = {T.Trial}.';
[~,~,trial_ID] = unique(trial);
接下来,您可以做的是在发言时将时间数组中的每个条目除以 100。属于同一 ID 的值表示它们属于一组 100 毫秒。请注意,我们还需要为下一步添加 1...你会明白为什么:
groups = floor(time/100) + 1;
现在,这可能是您可以在 MATLAB 中使用的最漂亮的函数之一:accumarray
。 accumarray
根据 ID 对数组的各个部分进行分组,然后将一个函数应用于每组的所有值。在我们的例子中,我们希望根据 groups
数组对所有正确和不正确的 ID 进行分组,然后从那里我们确定每组不正确的值的总分数。
具体来说,我们要做的是针对 groups
中指定的每组值,我们将查看 correct
和 incorrect
数字标签并确定通过对每组有多少等于 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 个。
因此,我们得到:
我有以下结构:
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'});
我想执行以下两个任务:
我想得到每 100 毫秒 window(间隔)出现
'incorrect'
的概率。例如,第一次 window,前 100 毫秒,有 4 次试验,4 次中有 2 次
'incorrect'
,所以它将是2/4 = 0.5
我想绘制每 100 毫秒时间的概率条形图 window。
x
轴是时间,每个条的宽度是 100 毫秒,它的高度是特定 window 的概率。
非常感谢任何帮助。
这违背了我在回答问题时不让提问者做出任何努力的政策,但这似乎是一个有趣的问题,所以我会破例。
首先,拆分每个 Time
和 Trial
字段,使它们位于单独的数组中。对于 Trial
字段,我将它们转换为标签 1 和 2 以表示 correct
和 incorrect
以便于实施:
time = [T.Time].';
trial = {T.Trial}.';
[~,~,trial_ID] = unique(trial);
接下来,您可以做的是在发言时将时间数组中的每个条目除以 100。属于同一 ID 的值表示它们属于一组 100 毫秒。请注意,我们还需要为下一步添加 1...你会明白为什么:
groups = floor(time/100) + 1;
现在,这可能是您可以在 MATLAB 中使用的最漂亮的函数之一:accumarray
。 accumarray
根据 ID 对数组的各个部分进行分组,然后将一个函数应用于每组的所有值。在我们的例子中,我们希望根据 groups
数组对所有正确和不正确的 ID 进行分组,然后从那里我们确定每组不正确的值的总分数。
具体来说,我们要做的是针对 groups
中指定的每组值,我们将查看 correct
和 incorrect
数字标签并确定通过对每组有多少等于 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 个。
因此,我们得到: