The One with ...

思いついたことや作業メモなどを公開しています

oTree: ラウンド毎のパラメータのランダム化

ラウンド毎にパラメータをランダム化する方法

最初はよく分からないので

def set_parameters(group: Group):#グループオブジェクトを引数にした関数,引数groupのタイプ(クラス)がGroupであることを指定
    rvec = C.Rvec.copy()
    random.shuffle(rvec)
    group.R = rvec[group.round_number-1]
    group.PROFIT = group.R*100-100
    nvec2=C.nvec.copy()
    random.shuffle(nvec2)
    group.n = nvec2[group.round_number-1]

のようにグループオブジェクトの関数としてWaitPageで実行させていた.

これでも一応シャッフルするが,復元抽出になってしまい,被験者が同じパラメータに暴露されることになり効率が悪い.

解決法

groupやsubsessionで定義しても怒られるので,結局,

#class の前に定義
v1=[3,5,6,4]
v2=[1,2,4,9]
random.shuffle(v1)
random.shuffle(v2)


class C(BaseConstants):
    NAME_IN_URL = 'single_rd'
    PLAYERS_PER_GROUP = None # 被験者は一人
    NUM_ROUNDS = 4
#    NUM_SUCCESS = random.randint(1,5)
    Rvec = v1#セッション毎に変わるグループ共通の利益率
    nvec = v2#random.shuffle(seed2) # N=10とおく

で解決した.被験者毎にシャッフルしたパラメータをラウンド数で呼び出して重複なく使う. oTreeは独自のルールが多すぎて,体系的に全然理解できない.

まあ動けばいいか.