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

问题描述 投票:0回答:1

我正在研究一种能够在认知任务中重现人们表现的模拟。任务是提供对某些对象在屏幕上显示的时间的估计。

我有什么数据,他们的反应的平均误差,他们的错误的标准偏差,数据的偏度和他们的估计的百分比误差。

我模拟其性能的方式是随机为模拟器提供一个“时间”值,该值对应于对象在实验中保留在屏幕上的真实时间。

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

这是我目前拥有的代码几乎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

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

python random simulation sampling
1个回答
1
投票

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

  1. 参数化(因此从我们的值可以猜出参数)
  2. 在[0 ...无穷大]范围内
  3. 有点高斯:单峰,0为0,0无穷远
  4. 但有歪斜

那么,只需看一些分布,看看它们是否合适。我会从log-normal开始

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

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

© www.soinside.com 2019 - 2024. All rights reserved.