2015-06-02 42 views
0

我正在使用PsychoPy Builder,並且只使用代碼基本。 現在我遇到了一個問題,我認爲編碼是不可避免的,但我不知道如何去做,到目前爲止,我在網絡中找不到有用的答案。以僞隨機方式在可能巨大的條件文件中只選擇少量試驗

我有一個3價(負面,中性,正面)圖片的實驗。 在圖片的其中一個角落,可以隨機出現附加圖片(字母和數字)(隨機在4個位置之一)。總之,所有的組合(考慮到字母/數字的身份),我有超過2000個試驗的可能性。 但是我只需要72次試驗,條件是每個化合價出現24次(或者:每36次2次),每次潛伏36次。因此,價和延遲應該是平衡的,但是字母和數字的位置和身份可以是隨機的。然而,按照特定的比例(在25%的試驗中),角落裏沒有字母/數字。

有沒有辦法做到這一點?

回答

0

在構建器中添加一個非常簡單的代碼組件將爲您做到這一點。我對這些條件有點困惑,但你可能會得到一般想法。假設您在條件文件中有72個「固定」條件,並且具有針對這些條件中的每一個運行的例程的循環。

我假設你的刺激程序中有一個TextStim。假設你稱之爲'letternumber'。然後,一般策略是預先計算72個試驗中隨機化字符和位置的列表,然後在我們穿過實驗時只顯示它們。要做到這一點,添加代碼組件添加到您的刺激程序的頂部,並添加在「開始實驗」:

import random # we'll use this module to pick random elements from below 
# Indicator sequence, specifying whether letter/number should be shown. False= do not show. True = do show. 
show_letternumber = [False] * 18 + [True] * 54 # 18/72=25%, 54/72=75%. 
random.shuffle(show_letternumber) 

# Sets of letters and numbers to present 
char_set = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g'] # ... and so on. 
char_trial = [random.choice(char_set) if show_char else '' for show_char in char_set] # list with characters 

# List of positions 
pos_set = [(0.5, 0.5),(-0.5, 0.5),(-0.5,-0.5),(0.5, -0.5)] # coordinates of your four corners 
pos_trial = [random.choice(pos_set) for char in char_trial] 

然後在代碼組件「開頭常規」下,設置lettersnumbers顯示的character_trial值對於該試驗和在pos_trial中的位置。

letternumbers.pos = pos_trial[trials.thisN] # set position. trials.thisN is the current trial number 
letternumbers.text = char_trial[trials.thisN] # set text 

# Save to data/log 
trials.addData('pos', pos_trial[trials.thisN]) 
trials.addData('char', char_trial[trials.thisN]) 

您可能需要勾選「設置每個重複」在Builder中lettersnumbers組件的實際顯示文本。

+0

因爲我真的很陌生,我花了一段時間才發現,在「每個試驗」(whis在我的版本中稱爲「每個框架」)代碼組成部分中,「試驗」代表循環。但現在它似乎工作。謝謝! – Sarah

+0

啊,對不起,這是「開始例行公事」。並在「開始例程」中插入第二個代碼片段。你只需要按照慣例做一次,這樣可以節省一些性能,但更重要的是,更有意義。相應地更新了答案。 –

+0

不幸的是,經過幾次試驗後,我收到錯誤反饋,程序停止。錯誤反饋是: ... letternumbers.pos = pos_trial [trials.thisN] IndexError:列表索引超出範圍 – Sarah

0

以下是您可以嘗試的策略,但由於我不使用構建器,因此無法將其集成到該工作流程中。

準備一個列表,其中包含寫數字中需要的試驗類型。如果需要,您可以手動輸入。例如mytrials = ['a','a',...'d','d']這些字母代表您想要的試用類型組合的某個標籤。

然後打開控制檯並對該列表進行置換(即對其進行混洗)。

import random 
random.shuffle(mytrials) 

這將改變周圍的心房。你可以通過打印來看到。當你高興與粘貼到您的代碼中帶有某種循環像

t in mytrials: 
    if t == 'a': 
     <grab a picture of type 'a'> 
    elseif t == 'b': 
     <grab a picture of type 'b'> 
    else: 
     <grab a picture of type 'c'> 
    <then show the picture you grabbed> 

有編程的方式建立與重複的正確數量的名單,但你在做什麼,它可能更容易剛開始寫一張手寫清單,然後擔心一旦有效就讓它變得更有趣。