Давайте вернемся к исходному утверждению об ошибках R в статье.
Наше мнение остается в силе - ошибки присутствуют и вызваны они небрежностью в реализации.
Ваш специалист не хочет мне отвечать по существу. Ткнул в Вольфрам и все.
Я повторю нашу точку зрения. По гамма распределению ошибки нет. Это вопрос конвенций в математическом сообществе. Есть фраза об ошибке с вашей стороны, которая не корректна.
Вывод нуля для плотности в вашей версии, во-первых, один из возможных вариантов (конвенций). А во-вторых, суть прикладного анализа от выбора этой величины (nan, 0 или 1) ни на что не влияет. Для оценок статистики используются функции распределения. В этой распределение нулевое. И этого достаточно.
По поводу t распределения. я воспроизвел эту ошибку на последней версии R. но в суть алгоритма не вникал. Допускаю, что исправление было реально нужно.
А вы вникните, пересчитайте все, потратьте несколько недель на перепроверки, как сделал это он. Но вместо этого вы даже статью не прочли нашу.
Со своей стороны мы работу сделали. И сделали хорошо. Если для вас и Вольфрам не авторитет, то вы зря затеяли такой способ общения.
Не путайте создателей с пользователями, пожалуйста.
Я ваше мнение уважаю. Но почему вы за него отвечаете?
Повторю.
Вывод нуля для плотности в вашей версии, во-первых, один из возможных вариантов (конвенций). А во-вторых, суть прикладного анализа от выбора этой величины (nan, 0 или 1) ни на что не влияет. Для оценок статистики используются функции распределения. В этой точки распределение нулевое. И этого достаточно.
Добавлю в целом, ускорение расчетов это плюс. То есть объективно реализация функций не хуже и даже лучше, согласно данным вашей статьи.
0^0 and 0! are equal to 1 because of the empty product rule. The IEEE standard says that 0^0 should evaluate 1. So most computer software will evaluate it that way. There are no situations where evaluating to 0 is helpful.
There are many formulas that assume 0^0=1, e.g. notation for polynomials and power series, cardinal number arithmetic, the binomial theorem, etc., these all assume 0^0=1. For example, substituting x=0 into x^0+x^1+x^2+... = 1/(1-x) shows 0^0 = 1.
То есть есть стандарт приведения этого выражения к 1. И нет никакой пользы или вреда от приведения выражения к 0.
Думаю, в R hardcoded 1… а у вас 0.
на этом точка и нет смысла спорить. Компьютер не может рассчитать значение алгебраически.
при x = 0, alpha = 1, beta = 1, в числителе получается неопределенное значение, что приводит всю дробь к неопределенности.
Заявляем, что строго говоря, плотность гамма распределения в точке ноль не определена. А при взятии предела справа плотность равна единице.
В свете этого мы считаем, то формулировка утверждения "ошибки расчетов в R" не является корректной. Точнее, это вопрос конвенций: чем считать равной выражение ноль в степени ноль. Приравнивание плотности гамма распределения к нулю в точке ноль не представляется сколько-либо обусловленной практикой.
не подходит для определения функции, поскольку содержит неопределенность в точке x=0, как Вы указали.
Если вместо x>=0 поставить условие x>0, то неопределенности не будет и можно будет вычислять значения по этой формуле.
По поводу практики - Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов, они выдают 0, т.е. то выражение справедливо только для x>0.
Можно исходить из того, что определить функцию означает задать способ ее вычисления.
Приведенное выражение
не подходит для определения функции, поскольку содержит неопределенность в точке x=0, как Вы указали.
Если вместо x>=0 поставить условие x>0, то неопределенности не будет и можно будет вычислять значения по этой формуле.
По поводу практики - Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов, они выдают 0, т.е. то выражение справедливо только для x>0.
Правильно. Функция определена на положительной области (0,inf).
Почему у вас все же 0 в точке 0? и почему ошибка это 1?
Кстати, интересно. Вольфрам определяет функцию вероятности гамма распределения на пространстве [0,inf]. И поэтому они дают определенное значение в нуле... Что странно.
Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов
Вы взяли ситуацию для которой нету решения, подсмотрели результат который возвращает именно Wolfram, и назвали все другие результаты неверными. Это не инженерные расчёты, а догма.
А могли бы взять за эталон R, и писать о том что нашли ошибку в Wolfram. Полагаю если взять весь математический софт, и поделить их на две группы по признаку что они возвращают в такой ситуации - будет разделение 50%/50%, сможете в статью о mql добавить ещё десяток софтин которые mql превосходит.
За указанные погрешности в AS 243 спасибо. Но не стоит на это сваливать поведение других функций с параметрами для которых нету чёткого решения. Так и надо было писать в статье о преимуществах mql - вот в R есть такая-то функция, которая имеет погрешность в 15 знаке после запятой. А у нас в mql есть другая функция, которая точнее. Всё былобы культурно и научно, а не догматично как сейчас.
Несколько страниц идет спор по различиях алгоритмов Ваших и R по краям области определения функций. Крайние точки - это крайние точки и на практике различиями можно было бы пренебречь.
Но в этом случае у меня возникает гораздо более существенный вопрос:
Где документация на все Ваши функции?
Ранее я считал, что берем Вашу функцию, потом берем документацию на R, так как Ваши функции являются аналогами, и вникаем в те части документации R, которые либо описывают алгоритмы, либо переходим по ссылкам, указанным R. R имеет очень качественную документацию и справочный аппарат.
В ходе спора я выяснил, что Ваши функции отличаются от R - это некие другие функции, алгоритмы которых опираются на иные источники. В самой статье об этом ничего нет, документации нет. И об этом мы узнаем от Рената совершенно в другом контексте.
На практике следует однозначный вывод, что перенос кода с R на MQL5 невозможен.
И вот почему.
Для меня совершенно очевидно, что если написано "аналог R" и не дана документация на аналог, то это 100% аналог и я могу, не заморачиваясь, переносить код из интерпретатора в компилятор. А если это не так, то достаточно одного случая, чтобы поставить крест на идее переноса кода из R в MQL5. Никто не захочет получить совершенно тупиковый головняк, когда при переносе работающего кода в R получаешь не работающий код MQL из-за тонкостей в реализации алгоритмов.
Ранее я считал, что берем Вашу функцию, потом берем документацию на R, так как Ваши функции являются аналогами, и вникаем в те части документации R, которые либо описывают алгоритмы, либо переходим по ссылкам, указанным R. R имеет очень качественную документацию и справочный аппарат.
В ходе спора я выяснил, что Ваши функции отличаются от R - это некие другие функции, алгоритмы которых опираются на иные источники. В самой статье об этом ничего нет, документации нет. И об этом мы узнаем от Рената совершенно в другом контексте.
На практике следует однозначный вывод, что перенос кода с R на MQL5 невозможен.
И вот почему.
Для меня совершенно очевидно, что если написано "аналог R" и не дана документация на аналог, то это 100% аналог и я могу, не заморачиваясь, переносить код из интерпретатора в компилятор. А если это не так, то достаточно одного случая, чтобы поставить крест на идее переноса кода из R в MQL5. Никто не захочет получить совершенно тупиковый головняк, когда при переносе работающего кода в R получаешь не работающий код MQL из-за тонкостей в реализации алгоритмов.
Функция рассчитывает значения функции плотности вероятности нормального распределения с параметрами mu и sigma для массива случайных величин x[]. В случае ошибки возвращает false. Аналог dnorm() в R.
boolMathProbabilityDensityNormal(
constdouble &x[], // [in] Массив со значениями случайной величиныconstdouble mu, // [in] Параметр распределения mean (математическое ожидание)constdouble sigma, // [in] Параметр распределения sigma (среднеквадратическое отклонение) constbool log_mode, // [in] Флаг расчета логарифма значения, если log_mode=true, то рассчитывается натуральный логарифм плотности вероятностиdouble &result[] // [out] Массив для значений функции плотности вероятности
);
2) Аналог pnorm:
Функция рассчитывает значение функции нормального распределения вероятностей с параметрами mu и sigma для массива случайных величин x[]. В случае ошибки возвращает false. Аналог pnorm() в R.
bool MathCumulativeDistributionNormal(
constdouble &x[], // [in] Массив со значениями случайной величиныconstdouble mu, // [in] Математическое ожиданиеconstdouble sigma, // [in] Среднеквадратическое отклонениеconstbool tail, // [in] Флаг расчета, если lower_tail=true, то рассчитывается вероятность того, что случайная величина не превысит xconstbool log_mode, // [in] Флаг расчета логарифма значения, если log_mode=true, то рассчитывается натуральный логарифм вероятности
double &result[] // [out] Массив для значений функции вероятности
);
3) Аналог qnorm:
Для массива значений вероятности probability[] функция рассчитывает значения обратной функции нормального распределения с параметрами mu и sigma. В случае ошибки возвращает false. Аналог qnorm() в R.
boolMathQuantileNormal(
constdouble &probability[],// [in] Массив со значениями вероятностей случайной величиныconstdouble mu, // [in] Математическое ожиданиеconstdouble sigma, // [in] Среднеквадратическое отклонениеconstbool tail, // [in] Флаг расчета, если lower_tail=false, то расчет ведется для вероятности 1.0-probabilityconstbool log_mode, // [in] Флаг расчета, если log_mode=true, то расчет ведется для вероятности Exp(probability)double &result[] // [out] Массив со значениями квантилей
);
Пример их использования:
#include <Math\Stat\Normal.mqh> //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart() { //--- arrays for calculated values double x_values[]; double normal_pdf[]; double normal_cdf[]; double normal_quantile[]; //--- prepare x values constint N=11; ArrayResize(x_values,N); for(int i=0;i<N;i++) x_values[i]=i*1.0/(N-1); //--- set distribution parameters double mu=2.0; double sigma=1.0; //--- calculate pdf, cdf and quantiles MathProbabilityDensityNormal(x_values,mu,sigma,false,normal_pdf); MathCumulativeDistributionNormal(x_values,mu,sigma,true,false,normal_cdf); MathQuantileNormal(normal_cdf,mu,sigma,true,false,normal_quantile); //--- show calculated values for(int i=0;i<N;i++) PrintFormat("1 %d, x=%.20e PDF=%.20e, CDF=%.20e, Q=%.20e,",i,x_values[i],normal_pdf[i],normal_cdf[i],normal_quantile[i]); }
Результат:
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 0, x=0.00000000000000000000e+00 PDF=5.39909665131880628364e-02, CDF=2.27501319481792120547e-02, Q=0.00000000000000000000e+00, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 1, x=1.00000000000000005551e-01 PDF=6.56158147746765951780e-02, CDF=2.87165598160018034624e-02, Q=1.00000000000000088818e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 2, x=2.00000000000000011102e-01 PDF=7.89501583008941493214e-02, CDF=3.59303191129258098213e-02, Q=2.00000000000000177636e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 3, x=2.99999999999999988898e-01 PDF=9.40490773768869470217e-02, CDF=4.45654627585430410108e-02, Q=3.00000000000000266454e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 4, x=4.00000000000000022204e-01 PDF=1.10920834679455543315e-01, CDF=5.47992916995579740225e-02, Q=3.99999999999999911182e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 5, x=5.00000000000000000000e-01 PDF=1.29517595665891743772e-01, CDF=6.68072012688580713080e-02, Q=5.00000000000000222045e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 6, x=5.99999999999999977796e-01 PDF=1.49727465635744877437e-01, CDF=8.07566592337710387195e-02, Q=6.00000000000000310862e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 7, x=6.99999999999999955591e-01 PDF=1.71368592047807355438e-01, CDF=9.68004845856103440793e-02, Q=7.00000000000000177636e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 8, x=8.00000000000000044409e-01 PDF=1.94186054983212952330e-01, CDF=1.15069670221708289515e-01, Q=8.00000000000000044409e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 9, x=9.00000000000000022204e-01 PDF=2.17852177032550525793e-01, CDF=1.35666060946382671659e-01, Q=9.00000000000000133227e-01, 2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 10, x=1.00000000000000000000e+00 PDF=2.41970724519143365328e-01, CDF=1.58655253931457046468e-01, Q=1.00000000000000000000e+00,
Рассмотрены функции для работы с основными статистическими распределениями, реализованными в языке R. Это распределения Коши, Вейбулла, нормальное, логнормальное, логистическое, экспоненциальное, равномерное, гамма-распределение, центральное и нецентральные распределения Бета, хи-квадрат, F-распределения Фишера, t-распределения Стьюдента, а также дискретные биномиальное и отрицательное биномиальные распределения, геометрическое, гипергеометрическое и распределение Пуассона. Есть функции расчета теоретических моментов распределений, которые позволяют оценить степень соответствия реального распределения модельному.
Давайте вернемся к исходному утверждению об ошибках R в статье.
Наше мнение остается в силе - ошибки присутствуют и вызваны они небрежностью в реализации.
Попробую задать вопрос команде поддержки R.
А вы вникните, пересчитайте все, потратьте несколько недель на перепроверки, как сделал это он. Но вместо этого вы даже статью не прочли нашу.
Со своей стороны мы работу сделали. И сделали хорошо. Если для вас и Вольфрам не авторитет, то вы зря затеяли такой способ общения.
Не путайте создателей с пользователями, пожалуйста.
А вы вникните, пересчитайте все, потратьте несколько недель на перепроверки, как сделал это он. Но вместо этого вы даже статью не прочли нашу.
Со своей стороны мы работу сделали. И сделали хорошо. Если для вас и Вольфрам не авторитет, то вы зря затеяли такой способ общения.
Не путайте создателей с пользователями, пожалуйста.
There are many formulas that assume 0^0=1, e.g. notation for polynomials and power series, cardinal number arithmetic, the binomial theorem, etc., these all assume 0^0=1. For example, substituting x=0 into x^0+x^1+x^2+... = 1/(1-x) shows 0^0 = 1.
Можно исходить из того, что определить функцию означает задать способ ее вычисления.
Приведенное выражениеБолее того, согласно:
https://en.wikipedia.org/wiki/Gamma_distribution
при x = 0, alpha = 1, beta = 1, в числителе получается неопределенное значение, что приводит всю дробь к неопределенности.
Заявляем, что строго говоря, плотность гамма распределения в точке ноль не определена. А при взятии предела справа плотность равна единице.
В свете этого мы считаем, то формулировка утверждения "ошибки расчетов в R" не является корректной. Точнее, это вопрос конвенций: чем считать равной выражение ноль в степени ноль. Приравнивание плотности гамма распределения к нулю в точке ноль не представляется сколько-либо обусловленной практикой.
не подходит для определения функции, поскольку содержит неопределенность в точке x=0, как Вы указали.
Если вместо x>=0 поставить условие x>0, то неопределенности не будет и можно будет вычислять значения по этой формуле.
По поводу практики - Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов, они выдают 0, т.е. то выражение справедливо только для x>0.
Можно исходить из того, что определить функцию означает задать способ ее вычисления.
Приведенное выражениене подходит для определения функции, поскольку содержит неопределенность в точке x=0, как Вы указали.
Если вместо x>=0 поставить условие x>0, то неопределенности не будет и можно будет вычислять значения по этой формуле.
По поводу практики - Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов, они выдают 0, т.е. то выражение справедливо только для x>0.
Mathematica и Matlab можно считать промышленными стандартами инженерных расчетов
Вы взяли ситуацию для которой нету решения, подсмотрели результат который возвращает именно Wolfram, и назвали все другие результаты неверными. Это не инженерные расчёты, а догма.
А могли бы взять за эталон R, и писать о том что нашли ошибку в Wolfram. Полагаю если взять весь математический софт, и поделить их на две группы по признаку что они возвращают в такой ситуации - будет разделение 50%/50%, сможете в статью о mql добавить ещё десяток софтин которые mql превосходит.
За указанные погрешности в AS 243 спасибо. Но не стоит на это сваливать поведение других функций с параметрами для которых нету чёткого решения.
Так и надо было писать в статье о преимуществах mql - вот в R есть такая-то функция, которая имеет погрешность в 15 знаке после запятой. А у нас в mql есть другая функция, которая точнее. Всё былобы культурно и научно, а не догматично как сейчас.
Рассмотрим пример с параметрами a=0.5, b=1 в точке x=0
Если не исключать точку x=0, то плотность расходится, а с вероятностью все в порядке.
И дальше тоже никаких проблем:
Получается, что при расчете CDF R исключает точку x=0, бесконечность куда-то исчезла.
Уважаемый коллега!
Несколько страниц идет спор по различиях алгоритмов Ваших и R по краям области определения функций. Крайние точки - это крайние точки и на практике различиями можно было бы пренебречь.
Но в этом случае у меня возникает гораздо более существенный вопрос:
Где документация на все Ваши функции?
Ранее я считал, что берем Вашу функцию, потом берем документацию на R, так как Ваши функции являются аналогами, и вникаем в те части документации R, которые либо описывают алгоритмы, либо переходим по ссылкам, указанным R. R имеет очень качественную документацию и справочный аппарат.
В ходе спора я выяснил, что Ваши функции отличаются от R - это некие другие функции, алгоритмы которых опираются на иные источники. В самой статье об этом ничего нет, документации нет. И об этом мы узнаем от Рената совершенно в другом контексте.
На практике следует однозначный вывод, что перенос кода с R на MQL5 невозможен.
И вот почему.
Для меня совершенно очевидно, что если написано "аналог R" и не дана документация на аналог, то это 100% аналог и я могу, не заморачиваясь, переносить код из интерпретатора в компилятор. А если это не так, то достаточно одного случая, чтобы поставить крест на идее переноса кода из R в MQL5. Никто не захочет получить совершенно тупиковый головняк, когда при переносе работающего кода в R получаешь не работающий код MQL из-за тонкостей в реализации алгоритмов.
Где документация на все Ваши функции?
Ранее я считал, что берем Вашу функцию, потом берем документацию на R, так как Ваши функции являются аналогами, и вникаем в те части документации R, которые либо описывают алгоритмы, либо переходим по ссылкам, указанным R. R имеет очень качественную документацию и справочный аппарат.
В ходе спора я выяснил, что Ваши функции отличаются от R - это некие другие функции, алгоритмы которых опираются на иные источники. В самой статье об этом ничего нет, документации нет. И об этом мы узнаем от Рената совершенно в другом контексте.
На практике следует однозначный вывод, что перенос кода с R на MQL5 невозможен.
И вот почему.
Для меня совершенно очевидно, что если написано "аналог R" и не дана документация на аналог, то это 100% аналог и я могу, не заморачиваясь, переносить код из интерпретатора в компилятор. А если это не так, то достаточно одного случая, чтобы поставить крест на идее переноса кода из R в MQL5. Никто не захочет получить совершенно тупиковый головняк, когда при переносе работающего кода в R получаешь не работающий код MQL из-за тонкостей в реализации алгоритмов.
На текущий момент описание функций есть в статье https://www.mql5.com/ru/articles/2742
Рассмотрим на примере расчета нормального распределения с параметрами mu=2, sigma=1:
n <- 10
k <- seq(0,1,by=1/n)
mu=2
sigma=1
normal_pdf<-dnorm(k, mu, sigma, log = FALSE)
normal_cdf<-pnorm(k, mu, sigma, lower.tail=TRUE,log.p = FALSE)
normal_quantile <- qnorm(normal_cdf, mu,sigma, lower.tail=TRUE,log.p = FALSE)
normal_pdf
normal_cdf
normal_quantile
1) Аналогом R функции dnorm() является функция:
Функция рассчитывает значения функции плотности вероятности нормального распределения с параметрами mu и sigma для массива случайных величин x[]. В случае ошибки возвращает false. Аналог dnorm() в R.
2) Аналог pnorm:
Функция рассчитывает значение функции нормального распределения вероятностей с параметрами mu и sigma для массива случайных величин x[]. В случае ошибки возвращает false. Аналог pnorm() в R.
3) Аналог qnorm:
Для массива значений вероятности probability[] функция рассчитывает значения обратной функции нормального распределения с параметрами mu и sigma. В случае ошибки возвращает false. Аналог qnorm() в R.
Пример их использования:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//--- arrays for calculated values
double x_values[];
double normal_pdf[];
double normal_cdf[];
double normal_quantile[];
//--- prepare x values
const int N=11;
ArrayResize(x_values,N);
for(int i=0;i<N;i++)
x_values[i]=i*1.0/(N-1);
//--- set distribution parameters
double mu=2.0;
double sigma=1.0;
//--- calculate pdf, cdf and quantiles
MathProbabilityDensityNormal(x_values,mu,sigma,false,normal_pdf);
MathCumulativeDistributionNormal(x_values,mu,sigma,true,false,normal_cdf);
MathQuantileNormal(normal_cdf,mu,sigma,true,false,normal_quantile);
//--- show calculated values
for(int i=0;i<N;i++)
PrintFormat("1 %d, x=%.20e PDF=%.20e, CDF=%.20e, Q=%.20e,",i,x_values[i],normal_pdf[i],normal_cdf[i],normal_quantile[i]);
}
Результат:
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 0, x=0.00000000000000000000e+00 PDF=5.39909665131880628364e-02, CDF=2.27501319481792120547e-02, Q=0.00000000000000000000e+00,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 1, x=1.00000000000000005551e-01 PDF=6.56158147746765951780e-02, CDF=2.87165598160018034624e-02, Q=1.00000000000000088818e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 2, x=2.00000000000000011102e-01 PDF=7.89501583008941493214e-02, CDF=3.59303191129258098213e-02, Q=2.00000000000000177636e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 3, x=2.99999999999999988898e-01 PDF=9.40490773768869470217e-02, CDF=4.45654627585430410108e-02, Q=3.00000000000000266454e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 4, x=4.00000000000000022204e-01 PDF=1.10920834679455543315e-01, CDF=5.47992916995579740225e-02, Q=3.99999999999999911182e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 5, x=5.00000000000000000000e-01 PDF=1.29517595665891743772e-01, CDF=6.68072012688580713080e-02, Q=5.00000000000000222045e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 6, x=5.99999999999999977796e-01 PDF=1.49727465635744877437e-01, CDF=8.07566592337710387195e-02, Q=6.00000000000000310862e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 7, x=6.99999999999999955591e-01 PDF=1.71368592047807355438e-01, CDF=9.68004845856103440793e-02, Q=7.00000000000000177636e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 8, x=8.00000000000000044409e-01 PDF=1.94186054983212952330e-01, CDF=1.15069670221708289515e-01, Q=8.00000000000000044409e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 9, x=9.00000000000000022204e-01 PDF=2.17852177032550525793e-01, CDF=1.35666060946382671659e-01, Q=9.00000000000000133227e-01,
2016.11.11 11:56:46.413 Test (EURUSD,H1) 1 10, x=1.00000000000000000000e+00 PDF=2.41970724519143365328e-01, CDF=1.58655253931457046468e-01, Q=1.00000000000000000000e+00,
Результат расчета на R: