Python因子级别组合

时间:2015-10-20 17:00:20

标签: python numpy pandas

我正在尝试创建一个关注网络任务的python版本。请参阅此参考(第3页):http://www.researchgate.net/publication/7834908_The_Activation_of_Attentional_Networks

我总共进行了216次试验。其中一半将是“一致”,一半是“不一致”。此外,216中的三分之一将是“nocue”,另外三分之一将是“中心”,最后三分之一将是“空间”

216项试验中的每一项都将是上述的一些组合(例如全等空间,不一致)

这就是我现在正在创建这些试验的方式:

import pandas as pd
import numpy as np
import random

#set number of trials
numTrials = 216
numCongruent = numTrials / 2
numCue = numTrials / 3

#create shuffled congruency conditions
congruent = ["congruent"] * numCongruent
incongruent = ["incongruent"] * numCongruent
congruentConditions = congruent + incongruent
random.shuffle(congruentConditions)

#create shuffled cue conditions
noCue = ["none"] * numCue
centerCue = ["center"] * numCue
spatialCue = ["spatial"] * numCue
cueConditions = noCue + centerCue + spatialCue
random.shuffle(cueConditions)

#put everything into a dataframe
df = pd.DataFrame()

congruentArray = np.asarray(congruentConditions)
cueArray = np.asarray(cueConditions)
df["congruent"] = congruentArray
df["cue"] = cueArray
print df

2个问题......

  1. 现在,这是有效的,但重要的一点是确保均衡分布。
  2. 例如,我需要确保所有“一致”试验都有相同数量的“nocue”,“center”和“spatial”试验。相反,例如,所有“nocue”试验都需要进行相同数量的“一致”和“不一致”试验。

    鉴于我随机改变条件的方式,目前无法确保这一点。这甚至会超出无限的样本大小,但这不是这种情况。

    我如何确保平等分配?

    我看过笛卡尔积(https://docs.python.org/2/library/itertools.html#itertools.product),但我并不完全会帮助我解决平等问题

    1. 一旦上述问题得到解决,我就需要确保在最终的混洗清单中,每个试验类型(例如全等空间)在列表顺序中按照相同的次数跟随对方试用类型

1 个答案:

答案 0 :(得分:3)

一个简单的选择是生成216个试验的清单并将其改组:

In [16]: opt1 = ["congruent", "incongruent"]

In [17]: opt2 = ["nocue", "center", "spatial"]

In [18]: from itertools import product

In [19]: trials = list(product(opt1, opt2))*36

In [20]: np.random.shuffle(trials)
然后,试验将是一个随机排序的列表,每个对中有36个。

编辑:你的编辑是一个更难的问题,老实说,我需要更多地考虑它,以确定是否有解决方案或证明你不能拥有所需的财产。

如果“足够接近”甚至可以正常工作,我能想到的最好的方法就是采用一种方法:对列表进行洗牌,检查所有a-> b计数是否在4-8之间,如果它们重新开始不是。通常在我的机器上运行1-5秒:

def checkvals(v):
    return all(x in (4,5,6,7,8) for x in v[1].value_counts().values)

def checkall(trials):
    return all(checkvals(v) for k, v in pd.DataFrame(zip(trials, trials[1:])).groupby(0))

while not checkall(trials):
    np.random.shuffle(trials)