критерий хи-квадрат

Я написал код в MATLAB для теста хи-квадрат. Я хочу получить P-значения 0,897 или 0,287 и т. д., но мои результаты слишком малы. Ниже мой код:

pd = fitdist(sample, 'weibull');
[h,p,st] = chi2gof(sample,'CDF',pd)

Я также пробовал использовать тест AD с аналогичным результатом:

dist = makedist('Weibull', 'a',A, 'b',B);
[h,p,ad,cv] = adtest(sample, 'Distribution',dist)

Ниже представлена ​​гистограмма данных с подобранной функцией плотности Вейбулла (параметры Вейбулла — A=4.0420 и B=2.0853).

histfit


person fredd    schedule 05.07.2014    source источник
comment
привет @ Люк Петерсон .. никто не ответил на мой вопрос .. у вас есть предложения?   -  person fredd    schedule 05.07.2014
comment
вы не можете форсировать p-значение теста, оно либо принимает, либо отвергает вашу гипотезу.   -  person Amro    schedule 05.07.2014


Ответы (1)


Когда p-value меньше заданного уровень значимости (по умолчанию 5% или 0,05), это означает, что нулевые гипотезы отклонены (что в вашем случае означает, что образец не взят из Распространение Weibull).

Функция chi2gof первая выходная переменная h обозначает результат теста, где h=1 означает, что тест отклоняет нулевую гипотезу на указанном уровне значимости.

Пример:

sample = rand(1000,1);           % sample from Uniform distribution
pd = fitdist(sample, 'weibull');
[h,p,st] = chi2gof(sample, 'CDF',pd, 'Alpha',0.05)

Тест явно отвергает H0 и заключает, что данные не получены из распределения Вейбулла:

h =
     1             % 1: H1 (alternate hypo), 0: H0 (null hypo)

p =
   2.8597e-27      % note that p << 0.05

st = 
    chi2stat: 141.1922
          df: 7
       edges: [0.0041 0.1035 0.2029 0.3023 0.4017 0.5011 0.6005 0.6999 0.7993 0.8987 0.9981]
           O: [95 92 92 97 107 110 102 95 116 94]
           E: [53.4103 105.6778 130.7911 136.7777 129.1428 113.1017 93.1844 72.8444 54.3360 110.7338]

Затем давайте попробуем это снова с соответствующим образцом:

>> sample = wblrnd(0.5, 2, [1000,1]);   % sample from a Weibull distribution

>> pd = fitdist(sample, 'weibull')
pd = 
  WeibullDistribution

  Weibull distribution
    A = 0.496413   [0.481027, 0.512292]
    B =  2.07314   [1.97524, 2.17589]

>> [h,p] = chi2gof(sample, 'CDF',pd, 'Alpha',0.05)
h =
     0
p =
    0.7340

тест теперь явно проходит с высоким p-значением.


РЕДАКТИРОВАТЬ:

Глядя на гистограмму, которую вы показали, похоже, что данные соответствуют распределению Вейбулла, хотя могут быть случаи выбросов (посмотрите на правую часть гистограммы), что может объяснить, почему вы получают плохие p-значения. Рассмотрите возможность предварительной обработки ваших данных для обработки экстремальных выбросов.

Вот пример, где я имитирую значения выбросов:

% 5000 samples from a Weibull distribution
pd = makedist('Weibull', 'a',4.0420, 'b',2.0853);
sample = random(pd, [5000 1]);
%sample = wblrnd(4.0420, 2.0853, [5000 1]);

% add 20 outlier instances
sample(1:20) = [rand(10,1)+15; rand(10,1)+25];

% hypothesis tests using original distribution
[h,p,st] = chi2gof(sample, 'CDF',pd, 'Alpha',0.05)
[h,p,ad,cv] = adtest(sample, 'Distribution',pd)

% hypothesis tests using empirical distribution
[h,p,st] = chi2gof(sample, 'CDF',fitdist(sample,'Weibull'))
[h,p,ad,cv] = adtest(sample, 'Distribution', 'Weibull')

% show histogram
histfit(sample, 20, 'Weibull')

histfit

% chi-squared test
h =
     1
p =
    0.0382
st = 
    chi2stat: 8.4162
          df: 3
       edges: [0.1010 2.6835 5.2659 7.8483 25.9252]
           O: [1741 2376 764 119]
           E: [1.7332e+03 2.3857e+03 788.6020 92.5274]


% AD test
h =
     1
p =
   1.2000e-07
ad =
   Inf
cv =
    2.4924

Выбросы приводят к сбою тестов распределения (нулевая гипотеза отвергается). Тем не менее, я не смог воспроизвести получение p-значения NaN (вы можете проверить этот связанный вопрос на Stats.SE о получении p-значений NaN).

person Amro    schedule 05.07.2014
comment
привет @Amro, когда я показываю PDF-файл для weibull, он очень хорошо соответствует моим данным ... вот почему я нахожу подозрительным ... я тестировал AD и получил такие же результаты.! Sample = N; dist = makedist('Weibull','a',pd3.ParameterValues(1),'b',pd3.ParameterValues(2)) [h,p,ad,cv]= adtest(sample,'Distribution',dist) - person fredd; 05.07.2014
comment
что тогда означает h=0 и p=NaN? - person fredd; 05.07.2014
comment
Вы можете показать вывод, скажем, hist(sample,20)? Знаете ли вы заранее параметры формы/масштаба распределения Вейбулла, может быть, подходящая часть распределения не сходится к хорошим значениям? - person Amro; 05.07.2014
comment
все функции проверки гипотез в наборе инструментов статистики работают одинаково. соглашение, H=0 подразумевает, что нулевая гипотеза принимается, и H=1 означает, что нулевая гипотеза отвергнута (на указанном уровне значимости). Что касается того, почему вы получаете p-значение NaN, возможно, расчет вырождается, потому что где-то в процессе генерируются промежуточные слишком большие / маленькие экстремальные значения, просто предположение. - person Amro; 05.07.2014
comment
привет .. hist (выборка, 20) показывает гистограмму с размером ячейки 20 .... позвольте мне показать вам, что мои данные соответствуют weibull .. да, я имею в виду, я могу сгенерировать параметры weibull. - person fredd; 05.07.2014
comment
да, отредактируйте свой вопрос выше и добавьте график, показывающий распределение данных. Также, если вы знаете параметры распределения, пожалуйста, укажите их. Кстати, вы можете поиграть с инструментом dfittool, чтобы получить визуальное подтверждение. - person Amro; 05.07.2014
comment
я уже использовал dfittool, но это не помогает в тестах. AD или KS или CS. - person fredd; 05.07.2014
comment
@fredd: см. мою правку. Я думаю, что у вас есть выбросы в ваших данных, которые могут исказить результаты тестов. - person Amro; 06.07.2014
comment
да, вы правы, для всех 3 тестов, когда я предварительно обрабатываю свои данные, я больше не получаю NaN для p .. хотя мои значения p остаются небольшими .. - person fredd; 06.07.2014