Воспроизведите код R "chisq.test(cbind(x, y))" в Matlab

Введение --> Я пытаюсь воспроизвести в 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

Похоже, код R работает так, как ожидалось, и вам нужен совет в Matlab. В этом случае рассмотрите возможность перенаправления вашего вопроса на [math.stackexchange.com/questions/tagged/matlab] .

I_O 23.08.2024 23:29

Привет @I_O, я не понимаю, что ты имеешь в виду, поскольку я добавил тег matlab уже в момент, когда задавал этот вопрос..

BostonPlummer 25.08.2024 23:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы воспроизвести результаты 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() не используются таблицы непредвиденных обстоятельств?

BostonPlummer 25.08.2024 16:37

Другие вопросы по теме