ラウンド毎にパラメータをランダム化する方法
最初はよく分からないので
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は独自のルールが多すぎて,体系的に全然理解できない.
まあ動けばいいか.