You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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值”关系图如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 15:24:49