2015-11-05 3 views
0

Я работаю над симуляцией, которая способна воспроизводить работу людей по когнитивной задаче. Задача состоит в том, чтобы предоставить оценку времени, когда какой-либо объект отображается на экране.Использование искаженного распределения для имитации «ошибки» участника в когнитивной задаче

Какие данные у меня есть, средняя ошибка их ответов, стандартное отклонение их ошибки, асимметрия данных и процентная погрешность их оценок.

Способ, которым я имитирую их работу, заключается в случайном обеспечении симулятора значением «времени», которое соответствует истинному количеству времени, которое объект останется на экране в эксперименте.

Как я имитирую их производительность, умножая это истинное значение времени на образец из распределения, состоящего из их средней ошибки и стандартного отклонения этой ошибки. Это эффективно воспроизводит их «оценку».

Вот код, который у меня сейчас работает, почти 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 

Я был бы рад предоставить более подробное разъяснение, если это необходимо, спасибо всем, кто считает помощь.

+0

Вы признаете, что существуют миллиарды распределений, имеющие одинаковое среднее значение, stddev и перекос? У вас есть только три момента расчета вашего распределения, и недостаточно информации для восстановления дистрибутива –

+0

и что вы делаете с образцами из нормалей, когда есть большие негативы? –

+0

Да, я знаю, что этих моментов недостаточно для определения значимого распределения, мне просто интересно, были ли люди знакомы с лучшими, но простыми вариантами, чем обычный, который я использовал. Это не имеет смысла физически, но я принимаю отрицательные оценки времени от симулятора, от тестирования я обнаружил, что отрицательные оценки очень необычны, и проблема будет лучше объясняться с систематической слабостью распределения, чем те небольшие отклонения. После того, как у меня будет более представительное распространение, я могу видеть, насколько я хотел бы иметь дело с негативными отчетами. – Bonbon

ответ

1

Хорошо, давайте сделаем некоторые требования. Мы предпочитаем наше распределение быть:

  1. Parametric (так от наших ценностей, которые мы могли бы догадаться, параметры)
  2. В диапазоне [0 ... бесконечность)
  3. Несколько гауссовые: одиночный пик, 0 0, 0 на бесконечности
  4. Но с косым

Так, то просто посмотрите на некоторых дистрибутивах и посмотреть, если они хорошо подходят.Я хотел бы начать с Логнормальным

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

Легко проверить, если это нормально. Он имеет два параметра, поэтому из вашего среднего значения stddev вы можете выбрать mu и sigma. Затем вы можете проверить, подходит ли косые значения. Если это так, есть хорошее распространение для использования. Если нет, посмотрите на другой подобный

+0

О, я, наверное, должен был упомянуть, что я прошел через все опции в случайной выборке numpy и многие в непрерывных непрерывных дистрибутивах с использованием метода rvs. Но могло случиться так, что я пропустил некоторые вещи. – Bonbon

+0

@Bonbon вы попробовали подход, который я предложил? Работает? –

Смежные вопросы