关于Matlab中crosstab函数计算p值的两类疑问
Matlab crosstab卡方检验p值异常问题
引言
在Matlab中,我使用crosstab函数对列联表进行卡方检验,涉及两组观测计数cx和cy。
我发现,调用crosstab(cx,cx)或crosstab(cx,cy)时,使用完整的cx、cy,还是仅取其中部分数据(即cx(1:nbc)和cy(1:nbc),nbc为选定的分箱数),得到的p值差异明显。以下代码及生成的图表可直观展示该现象:
% 输入参数:nb是数据分箱的数量,数组x和y会被分到这些分箱中 rng default; % 保证结果可复现 a = 0; b = 100; nb = 50; % 生成两个对数正态分布的随机数据集x和y(也可以用其他分布的随机数据) x = (b-a).*round(lognrnd(1,1,1000,1)) + a; y = (b-a).*round(lognrnd(0.88,1.1,1000,1)) + a; % 统计x和y在各分箱中的频次 cx = histcounts(x,'NumBins',nb); cy = histcounts(y,'NumBins',nb); % 我们可以不对比完整的分箱数据cx和cy,而是只对比前nbc个分箱的部分数据, % 观察分箱数nbc变化时,两种对比场景下p值的变化: % 场景1:crosstab(cx(1:nbc),cx(1:nbc));场景2:crosstab(cx(1:nbc),cy(1:nbc)) i = 1; for nbc = 4 : nb [~,~,pxx] = crosstab(cx(1:nbc),cx(1:nbc)); [~,~,pxy] = crosstab(cx(1:nbc),cy(1:nbc)); A(i,:) = [nbc,pxx]; B(i,:) = [nbc,pxy]; i = i + 1; end % 绘图展示 hold on pA = plot(A(:,1),A(:,2),'o-b'); pB = plot(B(:,1),B(:,2),'o-r'); ylabel('p-value') xlabel('分箱数(nb)') legend([pA pB],{'crosstab (cx,cx)','crosstab (cx,cy)'})
生成的“分箱数(nbc)”与“p值”关系图如下:
从图中可见:无论是对比两组不同的分箱数据(crosstab(cx,cy)),还是同一组数据与自身对比(crosstab(cx,cx)),随着对比的分箱数nbc从4增加到50,p值均逐渐趋近于0;仅当对比部分分箱数据时,p值才不为0。
技术疑问
- 是否只能使用
cx和cy的部分数据调用crosstab?否则针对较大数据集/分布时p值会趋近于0。 - 当用同一分箱数据与自身对比(
crosstab(cx,cx))时,p值是否应该等于1?因为原假设为两个样本来自同一分布,自身对比显然符合该假设,但使用完整cx调用时p值趋近于0,仅使用部分数据时p值才不为0。
内容的提问来源于stack exchange,提问作者BostonPlummer
相关产品推荐
相关产品推荐

