Как я могу создать функцию из этих данных? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть набор данных в виде таблицы:

Score   Percentile
 381         1
 382         2
 383         2
      ...
 569        98
 570        99

Полная таблица здесь в виде таблицы Google .

В настоящее время я вычисляю счет, а затем выполняю поиск по этому набору данных (таблице), чтобы найти соответствующий процентильный ранг.

Можно ли создать функцию для расчета соответствующего процентильного ранга для данного балла, используя формулу вместо поиска в таблице?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Невозможно воссоздать функцию, сгенерировавшую данную таблицу данных, если не предоставлена ​​информация о процессе, стоящем за этими данными.

При этом мы можем сделать некоторые предположения.

Поскольку это «процентильная» функция, она, вероятно, представляет собой совокупное значение некоторого распределения вероятностей. Очень распространенным распределением вероятностей является нормальное распределение, чьим «кумулятивным» аналогом (т.е. его интегралом) является так называемая «функция ошибки» (« erf »).

На самом деле ваши табличные данные очень похожи на функцию ошибки для переменной со средним значением 473.09:

enter image description here

ваш набор данных: оранжевый; встроенная функция ошибки ( erf ): синий

Однако соглашение не является совершенным, и это может быть вызвано тремя причинами:

  1. процедура подгонки, которую я использовал для генерации параметров для функции ошибки, не использовала правильные ограничения (потому что я понятия не имею, что я моделирую!)
  2. ваш набор данных не представляет собой точное нормальное распределение, а представляет собой данные реального мира, базовое распределение которых является нормальным распределением. Особенности ваших выборочных данных, которые отличаются от модели, полностью игнорируются.
  3. базовое распределение вовсе не является нормальным распределением, его интеграл просто случайно выглядит как функция ошибки.

Буквально я не могу сказать!

Если вы хотите использовать эту функцию, это ее определение:

import numpy as np
from scipy.special import erf
def fitted_erf(x):
    c = 473.09090474
    w =  37.04826334
    return 50+50*erf((x-c)/(w*np.sqrt(2)))

Тесты:

In [2]: fitted_erf(439) # 17 from the table
Out[2]: 17.874052406601457

In [3]: fitted_erf(457) # 34 from the table
Out[3]: 33.20270318344252

In [4]: fitted_erf(474) # 51 from the table
Out[4]: 50.97883169390196

In [5]: fitted_erf(502) # 79 from the table
Out[5]: 78.23955071273468

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


приписка

Если вам интересно, это код, используемый для получения параметров:

import numpy as np
from scipy.special import erf
from scipy.optimize import curve_fit

tab=np.genfromtxt('table.csv', delimiter=',', skip_header=1)
# using a 'table.csv' file generated by Google Spreadsheets
x = tab[:,0]
y = tab[:,1]

def parametric_erf(x, c, w):
    return 50+50*erf((x-c)/(w*np.sqrt(2)))

pars, j = curve_fit(parametric_erf, x, y, p0=[475,10])

print(pars)
# outputs [  473.09090474,   37.04826334]

и для генерации сюжета

import matplotlib.pyplot as plt

plt.plot(x,parametric_erf(x,*pars))
plt.plot(x,y)
plt.show()
0 голосов
/ 29 августа 2018

Ваш вопрос довольно расплывчатый, но, похоже, все вычисления, которые вы делаете, заканчиваются числом в диапазоне 381-570, это правильно. У вас есть многострочный расчет, который дает это число? Я предполагаю, что вы повторяете это во многих местах своего кода, поэтому вы хотите повторить это?

Для любого вычисления вы можете заключить его в функцию. Например:

answer = variable_1 * variable_2 + variable_3

можно записать как:

def calculate(v1, v2, v3):
    ''' calculate the result from the inputs
    '''
    return v1 * v2 + v3

answer = calculate(variable_1, variable_2, variable_3)

если вы хотите получить окончательный ответ, просто опубликуйте свой расчет, и я могу превратить его в функцию для вас

...