Матабский тест независимости

Для 1,000,000 наблюдений я наблюдал дискретное событие, X, 3 раза для контрольной группы и 10 раз для тестовой группы.

Мне нужно преподать критерий независимости Чи в независимости от Матлаба. Вот как вы это сделаете в r:

m <- rbind(c(3, 1000000-3), c(10, 1000000-10))
#      [,1]   [,2] 
# [1,]    3 999997
# [2,]   10 999990
chisq.test(m)

Функция r возвращает chi-squared = 2.7692, df = 1, p-value = 0.0961.

Какую функцию Matlab следует использовать или создавать для этого?

Ответ 1

Вот моя собственная реализация, которую я использую:

function [hNull pValue X2] = ChiSquareTest(o, alpha)
    %#  CHISQUARETEST  Pearson 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

correct: логическое указание, применить коррекцию непрерывности           при вычислении тестовой статистики для таблиц 2x2: одна половина           вычитается из всех | O - E | различия.


В качестве альтернативы, если у вас есть фактические наблюдения за этими двумя событиями, вы можете использовать функцию CROSSTAB, которая вычисляет таблицу непредвиденных обстоятельств и вернуть значения Chi2 и p-value:

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) выше требуется панель инструментов статистики

Ответ 2

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

function independenceTest(data)
df = (size(data,1)-1)*(size(data,2)-1); % Mean Degrees of Freedom
sd = sqrt(2*df);                        % Standard Deviation

u         = nan(size(data)); % Estimated expected frequencies 
p         = nan(size(data)); % Values used to calculate chi-square
lr        = nan(size(data)); % Values used to calculate likelihood-ratio
residuals = nan(size(data)); % Residuals

rowTotals    = sum(data,1);
colTotals    = sum(data,2);
overallTotal = sum(rowTotals);

%% Calculate estimated expected frequencies
for r=1:1:size(data,1)
    for c=1:1:size(data,2)
        u(r,c) = (rowTotals(c) * colTotals(r)) / overallTotal;
    end
end

%% Calculate chi-squared statistic
for r=1:1:size(data,1)
    for c=1:1:size(data,2)
        p(r,c) = (data(r,c) - u(r,c))^2 / u(r,c);
    end
end
chi = sum(sum(p)); % Chi-square statistic

%% Calculate likelihood-ratio statistic
for r=1:1:size(data,1)
    for c=1:1:size(data,2)
        lr(r,c) = data(r,c) * log(data(r,c) / u(r,c));
    end
end
G = 2 * sum(sum(lr)); % Likelihood-Ratio statisitc

%% Calculate residuals
for r=1:1:size(data,1)
    for c=1:1:size(data,2)
        numerator   = data(r,c) - u(r,c);
        denominator = sqrt(u(r,c) * (1 - colTotals(r)/overallTotal) * (1 - rowTotals(c)/overallTotal));
        residuals(r,c) = numerator / denominator;
    end
end