首页 > 解决方案 > Octave 的 chisquare_test_homogeneity(x, y, bins) 是如何工作的?

问题描述

如何使用 chisquare_test_homogeneity (x, y, c)?能给我举个例子吗。

chisquare_test_homogeneity (x, y, c) 给定两个样本 x 和 y,根据 c 的(严格递增的)条目引起的分区,对 x 和 y 来自同一分布的原假设的同质性执行卡方检验。

我尝试如下调用它,但似乎我的输入是错误的。

x = poissrnd(2, [1,100]); #generate 100 poisson 
y = poissrnd(3, [1, 100]); #another 100 poisson
bins = [0:10];
chisquare_test_homogeneity(x, y, bins); #NaN?

标签: octave

解决方案


看看中的代码chisquare-test-homogeneity.m。这不是一个大文件。我在下面复制它(粗体强调我的):

c = [(重塑 (c, 1, df)), Inf];
l_x = 长度 (x);
x = 重塑 (x, l_x, 1);
n_x = sum (x * 个 (1, df+1) < 个 (l_x, 1) * c);
l_y = 长度(y);
y = 重塑 (y, l_y, 1);
n_y = sum (y * 个 (1, df+1) < 个 (l_y, 1) * c);
chisq = l_x * l_y * sum ((n_x/l_x - n_y/l_y).^2 ./ (n_x + n_y));
pval = 1 - chi2cdf (chisq, df);

我对该代码的阅读是,X并且Y应该由数字组成,例如整数,其中每个唯一的整数代表一个特定的类。

然后,C 似乎期望一个“分区点”向量,即“介于”这些整数之间的数字,清楚地分开类。请注意,在上面的粗体部分中,使用了严格的不等式,而不是<=,因此您的分区不应与 X 和 Y 中使用的数字(例如整数)共存。

该代码还暗示您不应拥有低于 X 或 y 中最小整数的“分区”数,因为这会导致除以零。(漏洞?)

这也意味着如果你有 1:10 的值,那么 C 应该是 0.5:9.5 而不是 0.5:10.5,因为代码Inf向 C 添加了一个额外的参数来覆盖所有值,因此 10.5 分区将还尝试计算 10.5 和 Inf 之间的任何数字,引入一个不存在的类(即假设在 X 和 Y 中都没有出现)。

这也意味着如果您愿意,可以使用 C 变量将组“组合在一起”,例如,如果 X 和 Y 取值在 1:10 范围内,您可以指定分区 C = [0.5, 1.5, 9.5],其中会将 1 视为一类,将 2:9 视为另一类,将 10 视为第三类。

显然这些都没有记录,这只是直接研究m文件的结论。

所以,关于你的例子,我会这样运行它:

x = poissrnd(2, [1,100]); #generate 100 poisson 
y = poissrnd(3, [1, 100]); #another 100 poisson
c = 0.5 : ( max([x,y]) - 0.5 );
chisquare_test_homogeneity(x, y, c);

话虽如此,这似乎是我不熟悉的卡方检验的某种“累积”定义,我上面的解释可能是错误的。所以我会简单地将问题改写为“独立”卡方检验,这更容易直观地理解:

C = 1:max([x,y]);                    % define available classes (integers)
X = sum( x.' == C, 1 );              % get number of counts per class
Y = sum( y.' == C, 1 );              % get number of counts per class
chisquare_test_independence ([X;Y])  % perform test on contingency table

推荐阅读