2015-06-23 35 views
0

我有以下結構:計算獨立的組內不正確的事件的概率

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'出4所以這將是2/4 = 0.5

  2. 我要繪製的概率的條形圖每個100毫秒的時間窗口。 x軸將是時間,每個條的寬度將是100毫秒,其高度是該特定窗口的概率。

我真的很感激任何幫助。

回答

6

這不符合我在回答問題時的政策,沒有問題poser做出的任何努力,但這似乎是一個有趣的問題,所以我會例外。


首先,拆分每個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個。

因此,我們得到:

enter image description here

+1

我同意:這是很難回答的不要,即使問題沒有顯示出努力:-) –

+1

@LuisMendo - 謝謝:)其實我有問題不正確(雙語非常好)。我計算了正確的事件數量,而不是錯誤的數量......只需稍微更改'accumarray'中的匿名函數並更改圖形即可。 – rayryeng

+1

@rayryeng非常感謝您的回答。其實我試圖找出答案爲2天,但我總是會得到一個醜陋的結果,我的想法是如此全面,我真的不知道如何把它們放在一起寫在這裏。非常感謝。我確信我以後也會回答我的問題。 :-) –