Вот моя собственная реализация, которую я использую:
function [hNull pValue X2] = ChiSquareTest(o, alpha)
%# CHISQUARETEST Pearson's Chi-Square test of independence
%#
%# @param o The Contignecy Table of the joint frequencies
%# of the two events (attributes)
%# @param alpha Significance level for the test
%# @return hNull hNull = 1: null hypothesis accepted (independent)
%# hNull = 0: null hypothesis rejected (dependent)
%# @return pValue The p-value of the test (the prob of obtaining
%# the observed frequencies under hNull)
%# @return X2 The value for the chi square statistic
%#
%# o: observed frequency
%# e: expected frequency
%# dof: degree of freedom
[r c] = size(o);
dof = (r-1)*(c-1);
%# e = (count(A=ai)*count(B=bi)) / N
e = sum(o,2)*sum(o,1) / sum(o(:));
%# [ sum_r [ sum_c ((o_ij-e_ij)^2/e_ij) ] ]
X2 = sum(sum( (o-e).^2 ./ e ));
%# p-value needed to reject hNull at the significance level with dof
pValue = 1 - chi2cdf(X2, dof);
hNull = (pValue > alpha);
%# X2 value needed to reject hNull at the significance level with dof
%#X2table = chi2inv(1-alpha, dof);
%#hNull = (X2table > X2);
end
И пример для иллюстрации:
t = [3 999997 ; 10 999990]
[hNull pVal X2] = ChiSquareTest(t, 0.05)
hNull =
1
pVal =
0.052203
X2 =
3.7693
Обратите внимание, что результаты отличаются от ваших, поскольку chisq.test
выполняет коррекцию по умолчанию в соответствии с ?chisq.test
правильно: логическое указание,
применить коррекцию непрерывности
при вычислении статистики теста для таблиц 2x2: одна половина
вычитается из всех | O - E | различия.
В качестве альтернативы, если у вас есть фактические наблюдения двух рассматриваемых событий, вы можете использовать функцию CROSSTAB , которая вычисляет таблицу сопряженности и возвращает показатели Chi2 и p-значения:
X = randi([1 2],[1000 1]);
Y = randi([1 2],[1000 1]);
[t X2 pVal] = crosstab(X,Y)
t =
229 247
257 267
X2 =
0.087581
pVal =
0.76728
эквивалент в R будет:
chisq.test(X, Y, correct = FALSE)
Примечание. Для обоих подходов (MATLAB), указанных выше, требуется набор инструментов статистики