使用偏斜分布来模拟参与者的错误"在认知任务中

时间:2015-11-05 07:28:10

标签: python random simulation sampling

我正在进行一项能够在认知任务中重现人们表现的模拟。任务是提供某个对象在屏幕上显示的时间估计值。

我的数据是,他们的回答的平均误差,误差的标准偏差,数据的偏度以及估算的误差百分比。

我模拟他们表现的方式是随机为模拟器提供一个"时间"该值对应于对象在实验中保留在屏幕上的真实时间。

我如何模拟他们的表现是通过将真实时间值乘以由其平均误差和该误差的标准偏差组成的分布中的样本。这有效地复制了他们的估计"。

以下是我目前使用的代码几乎100%符合我的需要,但是有一个问题。

import random
import numpy
import csv


A = [2502,4376,6255] #the two pools of time (in miliseconds) duration an object will actually remain on the screen
B = [3753,6572,9374]


def time_and_number(pnum, dots, trials):

data = list(csv.reader(open('workingdurationavgdata.csv', 'rb'))) #gutted helper function that pulls the relevant data from a CSV but these values could be anything.
ratio_avg = float(data[pnum-1][dots-1]) #mean error
ratio_std = float(data[pnum-1][dots+3]) #standard deviation of error
ideal_ratio = float(data[pnum-1][dots+7]) #the partipant's 'true' percent error of their estimates gathered experimentally this is used as a comparison to see if the simulation is accurately reproducing performance

estlist = [] #list of generated 'estimates'
errorlist = [] #list of errors
for i in range(trials):  #This randomly chooses between which time pool (above) will be chosen to submit a random entry from it
    poolchoice = numpy.random.randint(1,2)
    if poolchoice == 1:
        pool = A
    elif poolchoice == 2:
        pool = B

    time = random.choice(pool) #gives the simulator a random time from the selected pool
    estimate = time * numpy.random.normal(ratio_avg, ratio_std) #'errors' the true value by multiplying it by a value from a distribution that was generated using mean and standard deviation 
    percent_error = (abs((estimate - time ))/time) * 100 #percent error of this estimate
    estlist.append(estimate) #creating a list of our estimates
    errorlist.append(percent_error) #creating a list of percent errors

estimateavg = sum(estlist)/float(len(estlist)) #average estimate
erroravg = sum(errorlist) / float(len(errorlist)) #average error
return erroravg/ideal_ratio #comparing our average error to the one found experimentally as close to 1 as possible is the goal

这样做是使用正态分布根据参与者的错误生成模拟的参与者表现估计值。

问题是numpy提供的这种正常分布太不灵活了。我们所拥有的数据不太合适,因此我们期望系统地高估误差。

我需要的是与此相似的功能,但我能够更灵活地提供偏斜等参数以更好地适应数据。

从根本上说,我需要一个函数或方法来创建一个可以接受的函数:

平均值,标准偏差和偏斜值,并从该分布中采样值乘以时间值。这模拟了一个人做出估计。或者:准确地做到这一点的更好的理论分布,但仍然依赖于平均值和标准差作为参数。

由于您无法访问数据,因此如果您想自行运行此数据,我可以提供一些示例数字,以了解其执行的操作:

ratio_avg = 0.838986407552044
ratio_std = 0.226132603313837
ideal_ratio = 24.814422079321

如果需要,我很乐意提供更多说明,感谢任何考虑帮助的人。

1 个答案:

答案 0 :(得分:1)

好的,我们提出一些要求。我们更喜欢我们的发行版:

  1. 参数(因此从我们的值可以猜出参数)
  2. 在[0 ...无穷大]范围内
  3. 有点高斯:单峰,0为0,0无穷远
  4. 但是有歪斜
  5. 那么,那么只需看看一些发行版,看看它们是否合适。我会从log-normal

    开始

    https://en.wikipedia.org/wiki/Log-normal_distribution

    很容易检查它是否正常。它有两个参数,所以根据你的意思,stddev你可以选择mu和sigma。然后你可以检查偏斜值是否合适。如果是,则使用良好的分发。如果不是,请查看另一个类似的