【问题标题】:Calculating the probability of incorrect events within independent groups计算独立组内不正确事件的概率
【发布时间】:2015-06-23 01:28:11
【问题描述】:

我有以下结构:

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 个试验,4 个试验中有 2 个是 'incorrect',所以它是 2/4 = 0.5

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

我非常感谢任何帮助。

【问题讨论】:

    标签: arrays matlab struct histogram probability


    【解决方案1】:

    这违反了我在没有问题提出者做出任何努力的情况下回答问题的政策,但这似乎是一个有趣的问题,所以我会破例。


    首先,拆分 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 数字标签,并通过汇总来确定有多少是不正确的many等于每组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 个。

    因此,我们得到:

    【讨论】:

    • 我同意:很难不回答,甚至问题都表明没有努力:-)
    • @LuisMendo - 谢谢 :) 实际上我的问题不正确(双关语非常好)。我计算了正确的事件数量,而不是错误的数量……只需要稍微更改 accumarray 中的匿名函数并更改图表。
    • @rayryeng 非常感谢您的出色回答。我实际上试图找出答案 2 天,但我总是会得到一个丑陋的结果,而且我的想法到处都是,我真的不知道如何将它们放在一起并写在这里。非常感谢。我确保我稍后也会为我的问题提供答案。 :-)
    • @chinkare_16 - 没问题 :) 这仍然是一个有趣的问题。我已经看到了您之前的问题,并且您确实表现出了努力,所以我可能不应该发表我的评论。我很高兴我们解决了这个问题。祝你好运!
    猜你喜欢
    • 2021-09-30
    • 2015-05-13
    • 2021-04-29
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2021-03-18
    • 2014-07-20
    相关资源
    最近更新 更多