Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 206

 
Quantum:

Интересный факт

Определения значений плотности гамма-распределения в русском переводе

Джонсон Н.Л., Коц С., Балакришнан Н. Одномерные непрерывные распределения. ч. 1 и более ранней английской версии различаются:



но у английской версии есть подозрение на опечатку из-за разных знаков.

Это не опечатка. Если потрудитесь посмотреть несколько разных учебных материалов по гамма... То увидите что по разному саппорт определен... Где-то с нулем, а где-то без нуля.
 
Alexey Burnakov:
Это не опечатка. Если потрудитесь посмотреть несколько разных учебных материалов по гамма... То увидите что по разному саппорт определен... Где-то с нулем, а где-то без нуля.

Вы не утруждаете себя эти самые материалы посмотреть и привести их, в отличие от @Quantum.

И даже ссылки на Эксель и Питон делаете так, чтобы не привести четкого примера.

В остроумии тоже пока только вы упражняетесь.

Не забудьте привести ответ из R, если получите его, конечно.

 

Как разработчики R объяснят свои результаты:

dgamma(0,0.5,1)=inf

pgamma(0,0.5,1)=0

если у них  точка 0 включается (как видели в определении), дает бесконечную плотность в точке x=0, и далее при интегрировании в pgamma(x,0.5,1) бесконечность считается нулем, словно не было ее.

 
Quantum:

Как разработчики R объяснят свои результаты:

Хороший вопрос, но почему вы спрашиваете об этом тут на форуме? Со слов Рената у вас там целая команда учёных разбирает алгоритмы R, спросите это у них, и нам потом расскажите. Разбираться в исходниках R это прямая обязанность вашей команды, если вы хотите полноценный порт сделать.

Мне сейчас кажется что весь ваш "анализ алгоритмов R" - это сделать функции с такими же параметрами как в R, с реализацией по универским учебникам не вникая в детали. А потом из-за этого возникают недоразумения вроде обзывания "0^0=1" ошибкой. 
С текущей тенденцией вы в итоге получите функции с интерфейсом как в R, которые при определённых условиях ведут себя иначе из-за различных реализаций. И если кто-то захочет перенести свой код с R на mql, он в итоге будет получать другие результаты, устанет искать почему результаты отличаются, и плюнет на всё это. Unit тесты помогут выявить только малую часть таких различий, потому что они будут покрывать только какие-то обычные непроблемные данные.

Это очень странный подход - копировать интерфейс R, делать свою реализацию функций даже не изучая исходники R, проверять результаты по wolfram. Что вы вообще хотите получить с таким подходом?
То что вы делаете я могу назвать "самописная статистическая библиотека mql, с интерфейсом скопированным с R, и в непоределённых ситуациях подогнанная под wolfram". Все другие слова об R в https://www.mql5.com/ru/articles/2742 это просто маркетниг, не имеющий к R никакого отношения. Разочарование.

 
Quantum:

и далее при интегрировании в pgamma(x,0.5,1) бесконечность считается нулем, словно не было ее.

Давайте возьмём более простой пример:
x=1*10^(-90)
Число очень маленькое, не ноль, и нету никаких неопределённостей.
> dgamma(1*10^(-90), 0.5, 1)
[1] 5.641896e+44
> pgamma(1*10^(-90), 0.5, 1)
[1] 1.128379e-45

Вольфрам, результат совпадает:
PDF[GammaDistribution[0.5,1], 1*10^(-90)]
5.6419×10^44
CDF[GammaDistribution[0.5,1], 1*10^(-90)]
1.12838×10^-45

Теперь, перефразируя ваш вопрос, без всяких бесконечностей в формулах:
Как можно интегрируя dgamma, которая возвращает такие большие числа как 5.641896e+44, получить в итоге очень маленкое число 1.128379e-45 ?
Ответ - никак не получить.* Интегрирование dgamma() не используется для расчёта pgamma(), там другие формулы, и бесконечность из dgamma() не используется в расчётах.

Я расчёт pgamma(0, 0.5, 1) в этом случае понимаю так - Если взять бесконечный набор чисел [0;Inf), и рандомно выбрать одно из них, какой будет шанс выбрать число <=0 ? Ответ: 1/Inf , или 0. Что соответствует результату pgamma(). Поправьте если что не так, я на уровне интуиции и логики не очень хорошо работаю с бесконечностями и пределами.

 

*там я ступил, недооценив то с какой скоростью убывает результат dgamma() при уменьшении x. пожалуйста игнорьте то завление.

 
Dr.Trader:

Хороший вопрос, но почему вы спрашиваете об этом тут на форуме? Со слов Рената у вас там целая команда учёных разбирает алгоритмы R, спросите это у них, и нам потом расскажите. Разбираться в исходниках R это прямая обязанность вашей команды, если вы хотите полноценный порт сделать.

Мне сейчас кажется что весь ваш "анализ алгоритмов R" - это сделать функции с такими же параметрами как в R, с реализацией по универским учебникам не вникая в детали. А потом из-за этого возникают недоразумения вроде обзывания "0^0=1" ошибкой. 
С текущей тенденцией вы в итоге получите функции с интерфейсом как в R, которые при определённых условиях ведут себя иначе из-за различных реализаций. И если кто-то захочет перенести свой код с R на mql, он в итоге будет получать другие результаты, устанет искать почему результаты отличаются, и плюнет на всё это. Unit тесты помогут выявить только малую часть таких различий, потому что они будут покрывать только какие-то обычные непроблемные данные.

Это очень странный подход - копировать интерфейс R, делать свою реализацию функций даже не изучая исходники R, проверять результаты по wolfram. Что вы вообще хотите получить с таким подходом?
То что вы делаете я могу назвать "самописная статистическая библиотека mql, с интерфейсом скопированным с R, и в непоределённых ситуациях подогнанная под wolfram". Все другие слова об R в https://www.mql5.com/ru/articles/2742 это просто маркетниг, не имеющий к R никакого отношения. Разочарование.

По  поводу R мы сами себя, включая меня, ввели в заблуждение. Можно конечно свалить это заблуждение на метаквотов, но правда состоит в другом.

Люди, использующие R, могут вспомнить историю продвижения R на его олимп. Цельносодранный в 1993 году с S, вся система R еще лет 10 была широко известен в узких кругах. И только спустя 10 лет от своего создания, имея 20 летнюю историю использования S, с начала нулевых начал постепенное восхождение и пробился в первую десятку лет пять назад и на сегодняший день имеет единственного конкурента - питон. На сегодня R- это огромная система, представляющая стандарт в области статистики.

Отсюда вывод: аналоги R в рамках MKL невозможны.

С чем мы имеем дело?

Мы имеем дело с очень положительным процессом развития МКЛ5 в плане математических функций. Если метаквотам удастся пополнить набор математических функций аналогами функций из пакета stats R, то такой процесс надо только приветствовать. При этом очень правильный выбор брать в качестве оригинала для подражания именно R, а не какой-либо другой математический пакет. Но это не импорт функций из R - это вновь написанные функции, которые являются аналогами, и которые имеют право совпадать или не совпадать с оригиналом. Но не совпадение совершенно не умаляет важность начатой метаквотами работы. А людям, которые решат переносить код из R в МКЛ5 следует помнить, что это другая по отношению к R реализация со своими нюансами, своими багами, своим языковым окружением. 

Поэтому сравнивать ничего не надо. Идет расширение МКЛ5 за счет статистических функций и это замечательно. Если к это добавится метод plot, то это вообще будет революция в средствах графики МКЛ5.

 

ПС

А разочарование Вы, я и многие другие пользователи R не будут испытывать только в одном случае: терминал будет переписан и языком программирования в нем будет R.  

 

Первая версия плота уже появилась: https://www.mql5.com/ru/forum/97153/page10#comment_3831485

С ошибками в R вам придется смириться, вера в безгрешность - плохой соратник. Миф про скорость вычислений в R мы тоже развенчали. Код там написан в лоб и небрежно.

Ошибка с применением AS 243 бесспорна и доказана нашими исследованиями качества результатов и подтверждена сторонними материалами.

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

Еще раз повторю - мы проделали качественную работу, разобрались с темой и покрыли все тестами.

Обсуждение статьи "Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее"
Обсуждение статьи "Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее"
  • www.mql5.com
Опубликована статья Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее: Автор: MetaQuotes Software Corp...
 

В языке R, который - правильно - идет из S и насчитывает уже как минимум 15 лет, а то и 20, на каждый функционал по статистике коды предоставляют люди с учеными степенями. ПРофессора, доценты кафедр статистики, во-многом, американских универститетов. Их расчеты не просто тупо принимаются в коммит, потому что они аж бесплатно это сделали, а сопровождаются научными публикациями в реферируемых журналах. И это касается любой более менее важной функции и пакета. И это важно! Я например, когда использую функцию для нахождения мощности теста, должен внести аргумент величины эффекта. И в документации я читаю, что pooled standard deviation считается таким-то способом. Я захожу в интернет, нахожу Автора метода, читаю про него... И аргументированно говорю о результатах применения этой функции.

 

dgamma основана на коде биномиального распределения, предоставленного Catherine Loader. Ее статья для этого метода от 2000 года. МОжете почитать. 

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

Есть ли в вашей справке отсылки типа? 

 

pwr.t2n.test {pwr} R Documentation

Power calculations for two samples (different sizes) t-tests of means


Description


Compute power of tests or determine parameters to obtain target power (similar to as power.t.test).


Usage


pwr.t2n.test(n1 = NULL, n2= NULL, d = NULL, sig.level = 0.05, power = NULL,

 alternative = c("two.sided", 

        "less","greater"))

Arguments


n1

Number of observations in the first sample

n2

Number of observations in the second sample

d

Effect size

sig.level

Significance level (Type I error probability)

power

Power of test (1 minus Type II error probability)

alternative

a character string specifying the alternative hypothesis, must be one of "two.sided" (default), "greater" or "less"

Details


Exactly one of the parameters 'd','n1','n2','power' and 'sig.level' must be passed as NULL, and that parameter is determined from the others. Notice that the last one has non-NULL default so NULL must be explicitly passed if you want to compute it.


Value


Object of class '"power.htest"', a list of the arguments (including the computed one) augmented with 'method' and 'note' elements.


Note


'uniroot' is used to solve power equation for unknowns, so you may see errors from it, notably about inability to bracket the root when invalid arguments are given.


Author(s)


Stephane Champely <champely@univ-lyon1.fr> but this is a mere copy of Peter Dalgaard work (power.t.test)


References


Cohen, J. (1988). Statistical power analysis for the behavioral sciences (2nd ed.). Hillsdale,NJ: Lawrence Erlbaum.

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

 

Для gamma семейства функций:

 

GammaDist {stats} R Documentation

The Gamma Distribution


Description


Density, distribution function, quantile function and random generation for the Gamma distribution with parameters shape and scale.


Usage


dgamma(x, shape, rate = 1, scale = 1/rate, log = FALSE)

pgamma(q, shape, rate = 1, scale = 1/rate, lower.tail = TRUE,

       log.p = FALSE)

qgamma(p, shape, rate = 1, scale = 1/rate, lower.tail = TRUE,

       log.p = FALSE)

rgamma(n, shape, rate = 1, scale = 1/rate)

Arguments


x, q

vector of quantiles.

p

vector of probabilities.

n

number of observations. If length(n) > 1, the length is taken to be the number required.

rate

an alternative way to specify the scale.

shape, scale

shape and scale parameters. Must be positive, scale strictly.

log, log.p

logical; if TRUE, probabilities/densities p are returned as log(p).

lower.tail

logical; if TRUE (default), probabilities are P[X ≤ x], otherwise, P[X > x].

Details


If scale is omitted, it assumes the default value of 1.


The Gamma distribution with parameters shape = a and scale = s has density


f(x)= 1/(s^a Gamma(a)) x^(a-1) e^-(x/s)


for x ≥ 0, a > 0 and s > 0. (Here Gamma(a) is the function implemented by R's gamma() and defined in its help. Note that a = 0 corresponds to the trivial distribution with all mass at point 0.)


The mean and variance are E(X) = a*s and Var(X) = a*s^2.


The cumulative hazard H(t) = - log(1 - F(t)) is


-pgamma(t, ..., lower = FALSE, log = TRUE)

Note that for smallish values of shape (and moderate scale) a large parts of the mass of the Gamma distribution is on values of x so near zero that they will be represented as zero in computer arithmetic. So rgamma may well return values which will be represented as zero. (This will also happen for very large values of scale since the actual generation is done for scale = 1.)


Value


dgamma gives the density, pgamma gives the distribution function, qgamma gives the quantile function, and rgamma generates random deviates.


Invalid arguments will result in return value NaN, with a warning.


The length of the result is determined by n for rgamma, and is the maximum of the lengths of the numerical arguments for the other functions.


The numerical arguments other than n are recycled to the length of the result. Only the first elements of the logical arguments are used.


Note


The S (Becker et al (1988) parametrization was via shape and rate: S had no scale parameter. In R 2.x.y scale took precedence over rate, but now it is an error to supply both.


pgamma is closely related to the incomplete gamma function. As defined by Abramowitz and Stegun 6.5.1 (and by ‘Numerical Recipes’) this is


P(a,x) = 1/Gamma(a) integral_0^x t^(a-1) exp(-t) dt


P(a, x) is pgamma(x, a). Other authors (for example Karl Pearson in his 1922 tables) omit the normalizing factor, defining the incomplete gamma function γ(a,x) as gamma(a,x) = integral_0^x t^(a-1) exp(-t) dt, i.e., pgamma(x, a) * gamma(a). Yet other use the ‘upper’ incomplete gamma function,


Gamma(a,x) = integral_x^Inf t^(a-1) exp(-t) dt,


which can be computed by pgamma(x, a, lower = FALSE) * gamma(a).


Note however that pgamma(x, a, ..) currently requires a > 0, whereas the incomplete gamma function is also defined for negative a. In that case, you can use gamma_inc(a,x) (for Γ(a,x)) from package gsl.


See also https://en.wikipedia.org/wiki/Incomplete_gamma_function, or http://dlmf.nist.gov/8.2#i.


Source


dgamma is computed via the Poisson density, using code contributed by Catherine Loader (see dbinom).


pgamma uses an unpublished (and not otherwise documented) algorithm ‘mainly by Morten Welinder’.


qgamma is based on a C translation of


Best, D. J. and D. E. Roberts (1975). Algorithm AS91. Percentage points of the chi-squared distribution. Applied Statistics, 24, 385–388.


plus a final Newton step to improve the approximation.


rgamma for shape >= 1 uses


Ahrens, J. H. and Dieter, U. (1982). Generating gamma variates by a modified rejection technique. Communications of the ACM, 25, 47–54,


and for 0 < shape < 1 uses


Ahrens, J. H. and Dieter, U. (1974). Computer methods for sampling from gamma, beta, Poisson and binomial distributions. Computing, 12, 223–246.


References


Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.


Shea, B. L. (1988) Algorithm AS 239, Chi-squared and incomplete Gamma integral, Applied Statistics (JRSS C) 37, 466–473.


Abramowitz, M. and Stegun, I. A. (1972) Handbook of Mathematical Functions. New York: Dover. Chapter 6: Gamma and Related Functions.


NIST Digital Library of Mathematical Functions. http://dlmf.nist.gov/, section 8.2.


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

 

Эта часть - ахинея научная:

6. Обнаруженные ошибки расчетов в R

В процессе тестирования расчетов в R была обнаружена ошибка расчета функции плотности для распределений Gamma, и ChiSquare и Noncentral ChiSquare в точке x=0.

> n <- 5
> k <- seq(0,1,by=1/n)
> gamma_pdf<-dgamma(k, 1,1, log = FALSE)
> gamma_cdf<-pgamma(k, 1,1, log = FALSE)
> k
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> gamma_pdf
[1] 1.0000000 0.8187308 0.6703200 0.5488116 0.4493290 0.3678794
> gamma_cdf
[1] 0.0000000 0.1812692 0.3296800 0.4511884 0.5506710 0.6321206

Значение вероятности гамма-распределения в точке x=0 считается верно (gamma_cdf=0), но значение плотности гамма-распределения (функция dgamma() в R) в точке x=0 должно быть равно 0 (а показывает gamma_pdf=1) по определению плотности вероятности гамма-распределения.

Для функций ChiSquare и Noncentral ChiSquare плотность вероятности в точке x=0 также вычисляется с ошибкой:

> n <- 5
> k <- seq(0,1,by=1/n)
> chisquare_pdf<-dchisq(k,2,log = FALSE)
> chisquare_cdf<-pchisq(k,2,log = FALSE)
> k
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> chisquare_pdf
[1] 0.5000000 0.4524187 0.4093654 0.3704091 0.3351600 0.3032653
> chisquare_cdf
[1] 0.00000000 0.09516258 0.18126925 0.25918178 0.32967995 0.39346934
> n <- 5
> k <- seq(0,1,by=1/n)
> nchisquare_pdf<-dchisq(k,2,1,log = FALSE)
> nchisquare_cdf<-pchisq(k,2,1,log = FALSE)
> k
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> nchisquare_pdf
[1] 0.3032653 0.2882986 0.2737496 0.2596492 0.2460204 0.2328798
> nchisquare_cdf
[1] 0.00000000 0.05914973 0.11534730 0.16867948 0.21923842 0.26712020

В точке x=0 функция dchisq()  выдает ненулевые значения 0.5 и 0.3032653, при этом функция pchisq() вероятности вычисляет правильно (они равны 0).

 Ее следует назвать - отличия в конвенциях при расчете функций плотности в крайней точке для односторонних распределений. И пояснить для статистиков - а почему вы придерживаетесь других конвенций и не на уровне 3 курса (потому что в Wolfram так думают).

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

Для расчета вероятности нецентрального T-распределения Стьюдента в языке R используется алгоритм AS 243, предложенный Lenth [6]. Достоинством этого метода является быстрый рекуррентный расчет членов бесконечного ряда с неполной бета-функций. Но в статье [7] было показано, что из-за ошибки оценки точности при суммировании членов ряда данный алгоритм приводит к ошибкам (таблица 3 в статье [7]), особенно для больших значений параметра нецентральности delta. Авторы статьи [7] предложили скорректированный алгоритм рекуррентного расчета вероятности нецентрального T-распределения.

У нас в в статистической библиотеке MQL5 используется правильный алгоритм для расчета вероятностей из статьи [7] , что дает точные результаты.

 

Я же говорю - вовсю пытаетесь уйти в сторону от конкретного обсуждения.

Ладно хоть один косяк признали. Забыли только признать, что у нас есть специалисты, способные провести проверки, разобраться и найти более правильное решение.

Алексей, ждите ответа от R. И обратите внимание, как вы перестали отвечать на вопросы @Quantum. Он специально вас аккуратно ведет к известной цели.

Пока на нашей стороне Mathematica + Wolfram Alpha + Mathlab + MQL5, а на вашей опенсорсный R. Код которого написан небрежно и абсолютно не вылизан, что ожидалось бы от 20 летнего проекта.
Причина обращения: