Введение -->
Я пытаюсь воспроизвести в R и в Matlab одни и те же результаты теста хи-квадрат для таблиц непредвиденных обстоятельств для двух наблюдаемых наборов частотных данных, x
и y
(следовательно, x
и y
являются моими входными данными). В частности, я концентрируюсь на частном случае, когда x=y
.
В R я получаю следующее:
> x = c(1000,100,10,1)
> y = c(1000,100,10,1)
> chisq.test(x,y)
Pearson's Chi-squared test
data: x and y
X-squared = 12, df = 9, p-value = 0.2133
В Матлабе получаю следующее:
>> x = [1000 100 10 1];
>> y = [1000 100 10 1];
>> [~,chi2,p] = crosstab(x,y)
chi2 =
12
p =
0.21331
Пока что боже. Однако интуитивно, если я выполняю тест хи-квадрат для тех же наборов наблюдаемых частотных данных (т. е. для случая x=y
), я ожидаю получить статистику теста, равную 0, и значение p, равное 1. Этого можно достичь. в R следующим образом:
> x = c(1000,100,10,1)
> y = c(1000,100,10,1)
> chisq.test(cbind(x, y))
Pearson's Chi-squared test
data: cbind(x, y)
X-squared = 0, df = 3, p-value = 1
Вопрос -->
Как я могу получить то же самое в Matlab, то есть тестовую статистику, равную 0, и значение p, равное 1 для случая x=y
?
Дополнительное примечание -->
Если это может быть полезно, я попытался немного поиграться с кодом Matlab и смог воспроизвести [~,chi2,p] = crosstab(x,y)
(но явно не эквивалент кода R для chisq.test(cbind(x, y))
!):
% Inputs
x = [1000 100 10 1];
y = [1000 100 10 1];
% Chi-squared test on contingency tables
[unique_x,ix,jx] = unique(x);
[unique_y,iy,jy] = unique(y);
OT = zeros(numel(unique_x),numel(unique_y));
for i = 1:numel(x)
OT(jx(i),jy(i)) = OT(jx(i),jy(i)) + 1;
end
R = sum(OT,2);
C = sum(OT);
n = sum(sum(OT));
ET = (R*C)./n;
chi2 = (OT - ET).^ 2 ./ ET;
chi2 = sum(chi2(:)) % <-- test statistic
df = (numel(R)-1)*(numel(C)-1) % <-- degrees of freedom
p = gammainc(chi2/2,df/2,'upper') % <-- p-value
OT % <-- OT = Observed frequency contingency table
ET % <-- ET = Expected frequency contingency table
Что возвращает следующее:
chi2 =
12
df =
9
p =
0.21331
OT =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
ET =
0.25 0.25 0.25 0.25
0.25 0.25 0.25 0.25
0.25 0.25 0.25 0.25
0.25 0.25 0.25 0.25
Привет @I_O, я не понимаю, что ты имеешь в виду, поскольку я добавил тег matlab
уже в момент, когда задавал этот вопрос..
Чтобы воспроизвести результаты chisq.test(cbind(x, y))
, где test statistic is 0
и p-value is 1
для идентичных наборов данных. Вы можете создать собственную реализацию, которая позволит вам напрямую создавать таблицу сопряженности, как вы это делали в R.
Как только вы определите свои входные данные:
% Inputs
x = [1000 100 10 1];
y = [1000 100 10 1];
Вы можете сделать это в MATLAB с помощью скрипта:
% Combine x and y into a 2-column matrix
observed = [x(:) y(:)];
% Calculate the row and column totals
row_totals = sum(observed, 2);
col_totals = sum(observed, 1);
% Calculate the grand total
grand_total = sum(row_totals);
% Compute the expected frequency table
expected = (row_totals * col_totals) / grand_total;
% Calculate the chi-squared statistic
chi2 = sum((observed(:) - expected(:)).^2 ./ expected(:));
% Degrees of freedom
df = (size(observed, 1) - 1) * (size(observed, 2) - 1);
% Compute the p-value
p = 1 - chi2cdf(chi2, df);
% Display the results
disp(['Chi-squared statistic: ', num2str(chi2)])
disp(['Degrees of freedom: ', num2str(df)])
disp(['p-value: ', num2str(p)])
В этом случае наблюдаемая матрица представляет собой матрицу из двух столбцов, где каждая строка содержит две переменные x
и y
. Ожидаемая таблица частот рассчитывается на основе итоговых значений строк и столбцов.
Статистика хи-квадрат рассчитывается с использованием записанных и ожидаемых частот, значение p вычисляется с использованием кумулятивной функции распределения хи-квадрат.
Большое спасибо @Ivand! ...Похоже, вы не использовали таблицы сопряженности в своем коде Matlab.... Так делает ли функция chisq.test(cbind(x, y))
R то же самое? При использовании cbind()
не используются таблицы непредвиденных обстоятельств?
Похоже, код R работает так, как ожидалось, и вам нужен совет в Matlab. В этом случае рассмотрите возможность перенаправления вашего вопроса на [math.stackexchange.com/questions/tagged/matlab] .