Тест Колмогорова-Смирнова

В прошлый раз я затронул тему статистических гипотез и пообещал провести тест и проверить нулевую статистическую гипотезу H0, которая состоит в следующем: приращения логарифмов рыночных цен распределены по нормальному закону. Ране я показал графически, что эта гипотеза неверна и её стоит отклонить. Для проверки гипотезы H0 я выбрал тогда тест Лиллиефорса. Однако провести данный тест сегодня я не смогу, потому что будет совершенно ничего не понятно. Я решил быть более последовательным и рассказать все, по возможности, простым языком.

Дело в том, что тест Лиллиефорса основан на тесте Колмогорова-Смирнова. В открытом доступе информации об этом тесте очень много, но она разрознена. И часто такое ощущение, что написана не для людей, а исключительно для самого автора, который пытается показать свою «научность», «ум», теряя при этом ценность своей работы для других людей. Я постараюсь этого не делать.

Так вот. Тест Колмогорова-Смирнова может одинаково хорошо применятся для выборок ВР различного объёма. Однако у данного теста есть серьёзные ограничения, по причине которых, его нельзя применять к ВР, для которых математическое ожидание и дисперсия точно неизвестны (а ВР рыночных цен таковы). Но ведь такая ошибка встречается на практике весьма часто. Понять, почему нельзя применять данный тест, можно лишь прочитав то, что я напишу ниже.

Вычисление значения теста основывается на сравнении эмпирической функции распределения вероятностей ВР с теоретической.

Эмпирическая функция распределения вероятностей строится непосредственно по тестируемой выборке (ВР).

Простой пример. Допустим у нас есть ВР={2,1,1,1,2,1,1,1,2,3,1,1}. В этом ВР встречаются следующие значения: 1 – 8 раз, 2 – 3 раза, 3 – 1 раз. Всего 12 значений. Упорядочив встреченные значения по возрастанию, разделив их частоты (сколько раз они встречаются) на 12, получим 1 – 0.667, 2 – 0.25, 3 – 0.083. Тогда эмпирическая функция распределения вероятностей будет иметь вид: 0 – 0; 1 – 0.667; 2 – 0.667+0.25=0.917; 3 – 0.917+0.083=1.

В среде R для расчета эмпирической функции можно выполнить следующие команды (скрипт №1):

x<-c(2,1,1,1,2,1,1,1,2,3,1,1) #исходные данные
x<-sort(x) #сортировка по возрастанию
xu<-unique(x) #выбор неповторяющихся значений
#подсчет частот и построение эмпирической функции распределения
ef=cumsum(tabulate(match(x,xu)))/length(x)
print(ef) #вывод результата

 Формализуем тест Колмогорова-Смирнова.

Пусть F0(ui) – это теоретическая функция распределения случайной величины, а Fn(ui) – это эмпирическая функция распределения, построенная по выборке длинной n, где ui – не повторяющиеся значения, упорядоченные по возрастанию, которые встречаются во ВР.

Вычислим такую величину:

Dn=max| F0(ui)- Fn(ui)|            (1)

Если DnDкр, то гипотеза H0 отвергается.

Dкр рассчитывается по формуле при n>50:

Dкр=sqrt(-0.5*log(α/2)/n)       (2)

или находится по специальным таблицам для n<50, где α – это уровень значимости (вероятность ошибки, в случае отклонения H0).

Вот скрипт для вычисления величины Dn при α=0.05 (скрипт №2).

x<-rnorm(100)x<-sort(x)
xu<-unique(x)
ef=cumsum(tabulate(match(x,xu)))/length(x)
#вычисляем истинные (теоретические) вероятности 
№для соответствующих среднего и дисперсии
tf<-pnorm(xu)
d<-c(d,max(abs(ef-tf)))
dkr<-sqrt(-0.5*log(0.05/2)/length(x)) #расчет Dкр

В моем случае получилось, что Dn=0.08, а Dкр=0.14. Т.к. Dn<Dкр, гипотеза H0 принимается. Мы ничего не доказали, а только подтвердили гипотезу и с 95% уверенностью можем заключить, что проверяемая выборка распределена нормально! Что она распределена нормально доказывает сам скрипт №2.

А вообще откуда берутся табличные значения Dкр, ну, или, хотя бы, сама формула его вычисления (2)…? Откуда все это?

Постараюсь объяснить. Начну издалека.

Дело в том, что Fn(ui) – эмпирическая функция распределения случайной величины есть величина случайная. То есть для различных выборок ВР, с одинаковым математическим ожиданием и дисперсией, эта функция будет принимать различные значения (испытывать некоторые изменения, незначительные). Следовательно, величина Dn – также есть величина случайная. А значит она имеет какое-то распределение вероятностей тоже. Зная формулу распределения вероятностей случайной величины Dn можно рассчитать такое значение Dn при котором вероятность появления других значений равных, либо меньших заданного Dn, будет равно вероятности 1- α. Такое значение Dn и есть Dкр. Умные люди (ученые) находили это значения с помощью виртуозных математических ухищрений, аналитически по различным формулам, и заносили в таблицы, когда не было компьютеров. В частности, формула (2) – это аппроксимация помогающая приближенно (в тоже время достаточно точно) вычислить значение Dкр без таблиц и компьютера.

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

Для этого сделаем следующее.

1. Сгенерируем нормально распределённую выборку ВР с количеством элементов n (я выбрал 1000), математическим ожиданием равным 0 и дисперсией равной 1 (мы ведь буем строить эмпирическую функцию распределения вероятностей для величины Dn, выступающей критерием нормальности).
2. Рассчитаем величину Dn (скрипт №2 для вычисления величины Dn).
3. Повторим шаг 1 и 2 много раз (я провел 10000 итераций) и получим набор значений Dn,i.
4. Построим по набору значений Dn,i функцию распределения вероятностей (скрипт №1 построения такой функции я привел выше) и с её помощью найдем такое значение Dn,i, при котором эмпирическая функция распределения вероятностей принимает значения 1- α. Это и будет Dкр.

Скрипт на языке R у меня получился таким (скрипт №3):

 #Получение набора Dn,i
d<-NULL
for(i in 1:10000)
{
x<-rnorm(1000)
x<-sort(x)
xu<-unique(x)
ef=cumsum(tabulate(match(x,xu)))/length(x)
tf<-pnorm(xu)
d<-c(d,max(abs(ef-tf)))
}
#Построение функции распределения вероятностей
d<-sort(d)
du<-unique(d)
ef=cumsum(tabulate(match(d,du)))/length(d)
for(i in 1:length(ef))
{
#рассчитанный Dкр методом статистических испытаний
if (ef[i]>=0.95) {print(d[i]);break;} 
}
#рассчитанный по формуле (2) для сравнения
dkr<-sqrt(-0.5*log(0.05/2)/length(x)) 
print(dkr)
plot(x=du,y=ef,type='l')

У меня получилось, что Dкр=0,0422, а по формуле 0,0429. То есть достаточно высокая точность вычислений на основе статистических испытаний.

График распределения вероятностей случайной величины (или как иногда говорят статистики Dn) при заданных параметрах алгоритма приведен на рисунке.

efdDnТаким образом, величина Dкр зависит от объёма тестируемой выборки n, математического ожидания и дисперсии выборки ВР, а также уровня значимости α. Эти величины у нас наперед заданы, известны.

При проверке данным тестом какой-либо другой случайной величины, чья эмпирическая функция распределения не соответствует теоретической функции распределения нормальной случайной величины мы будем получать значения Dn большие, чем Dкр (это не закон и существуют ошибки второго рода, когда мы можем принять гипотезу, когда она не верна). Правда в α процентном случае, мы можем отклонить и случайную величину, распределенную по нормальному закону (это ошибка первого рода).

Здесь я провел эксперимент по построению функции распределения величины Dn, при использовании равномерного закона распределения вероятностей случайной величины. В скрипте №3 вместо x<-rnorm(1000) (с математическим ожиданием 0 и дисперсией 1), задал x<-runif(1000,min=-1.7,max=1.7) (с оценкой математического ожидания 0 и оценкой дисперсии 1). И действительно, получил все Dn, больше Dкр! График:

fdrunifDn

Однако, все было бы ничего…но тест Колмогорова-Смирнова (как я уже писал) нельзя применять к ВР, для которых математическое ожидание и дисперсия точно неизвестны. Когда мы используем оценки этих величин по тестовой выборке это существенным образом влияет на значения Dкр, и это продемонстрировал Х.В. Лиллиефорс в 1967 и рассчитал также с помощью метода статистических испытаний новые значения! Но об этом подробно я изложу в следующий раз, ведь и так получилось очень много… Чтобы все это понять и осознать у меня ушло огромное количество времени. Я очень надеюсь, что это поможет вам, сэкономит ваше время и поможет на пути новых достижений. Если это действительно так, буду рад вашему лайку и вопросам.

Похожие статьи:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *