替代卡方检验以检查两组中的分类分布是否相同

机器算法验证 分布 分类数据 卡方检验 二项分布 等价
2022-03-27 19:36:02

我预计每个类别的频率如下所示:

在此处输入图像描述 在此处输入图像描述

所以我的初始数据:类别 - 和观察它的数量。

有太多的观察,这就是为什么:

随着样本量的增加,原假设将被拒绝,并且对于与原假设的任何小但非零偏差,p 值将变为零。当计数(即观察总数)超过 50,000 时,正确的假设检验很可能会拒绝即使是在统计上显着但在应用中不相关的微小差异。

无论如何,我已经对这个 K-2 意外事件应用了卡方检验,结果得到了p_value = 6.3723954051318158e-126. 考虑到将此测试应用于完全不相关的数据集,这并不是那么糟糕 - p 值将为零。

据我所知,使用 F 检验会得到相同的结果。

想到的另一种方法是应用二项式检验。我是这样做的:

 stats.binom_test(1500, store.answered.sum(), 0.0233, alternative = 'two-sided')  
# 1500 observed amount, store.answered.sum() - sum over all observations, 0.0233 - expected frequency of that label 

P_value = 0.00023472778370252812。结果更好,因为我们不想拒绝零假设。然而,还有一点,我们必须牢记:

基本假设之一是所有观察结果均独立于同一分布。如果商店内存在相关性或概率/分布存在异质性,这将不成立。在这些情况下,多项式/二项式/泊松模型的方差假设将不成立,我们得到分散不足或分散过度

一般来说,我可以做出这样的假设,但我不确定。

所以我的问题是,我们如何检查这些数据集中的数据分布是否相同?我的最终目标是检查第二个较小的数据集是否没有转移(英文术语可能不同)到较大的原始数据集。

2个回答

等效性检验检验数量差异相关阈值的原假设——研究人员或监管机构在例如 FDA 的情况下认为有意义的最小值——并且拒绝该原假设是得出结论量在相关阈值范围内是等价的。1

等价检验的一种形式是两个单边检验(TOST) 方法,其中(通常)围绕上下方向的相关阈值构建两个单边tz检验……拒绝两个单边检验意味着应该推断出真实值在等价范围内。然而,为什么 TOST 计算相对简单并被广泛使用,它忽略了在测试统计中发挥作用的非中心性参数,从而忽略了对拒绝能力的准确计算。相比之下,等价的统一最强大 (UMP) 测试可以解释这一点,并提供最佳统计能力来拒绝等价零假设。

Welleck's Testing Statistical Hypotheses Of Equivalence And Noninferiority的第 9 章第 9.2 节,第二版测试(或作为列联表等价性测试文献的“可折叠性”测试)提供了统一最强大的等价测试有)。构建 UMP 列联表测试统计量的数学有点复杂(我的意思是我还没有学过 :),但是 Welleck 包含一个用于测试的 R 宏和一个示例应用程序。χ2

最后,我将指出,仅测试差异测试等价意味着——没有明确的先验功效分析和最小相关效应大小的证明——通过优先考虑证据/证明负担的方向来承诺确认偏差。在常客分析上下文中反驳这种承诺的一种精明方法是进行相关测试和等价性测试,并据此得出结论([tost]有关这一点的更多详细信息,请参见标签信息页面)。

1相关阈值可以是不对称的:在一个方向上比在另一个方向上更接近“无差异”。

我认为确定一个适当的阈值,表明两个样本之间的差异是有意义的,而不仅仅是统计上的显着差异,这将是一个有价值的步骤,部分由@Alexis 的回答所描述。

不过,我想提出一种基于模拟的替代方法。这里的逻辑是,您可以根据较大的数据集创建一系列合理的样本计数,然后确定您观察到的较小数据集的计数通常落在这些合理范围之内还是之外。

然后,使用较大样本中的计数来表示更接近人口计数的内容,您可以从与较小样本相同大小的所述(伪)人口中生成足够多的随机样本。我将使用 R 和一组更小的分类数据来说明:

> #Observed frequencies in the larger sample:
> lambdas<-c(2500,30000,25000,17000,18750,19200, 2000, 2500, 950, 750)
> N<-sum(lambdas)
> #Total "psuedo"-population size
> N
[1] 118650
> 
> #Probabilities for each category (based on "pseudo"-population)
> p<-lambdas/N
> p
 [1] 0.021070375 0.252844501 0.210703751 0.143278550 0.158027813 0.161820480
 [7] 0.016856300 0.021070375 0.008006743 0.006321113
> 
> #Sample size for smaller data set
> N2<-2500
> 
> #Category names 
> cat.names<-paste('cat', sep='_', letters[1:length(p)])
> 
> #Simulate category counts
> n.sims<-10000
> sim.counts<-data.frame()
> for(i in 1:n.sims){
+ temp<-as.vector(table(sample(cat.names, size=N2, prob=p, replace=T)))
+ sim.counts<-rbind(sim.counts, temp)
+ }
> 
> colnames(sim.counts)<-cat.names
> head(sim.counts)
  cat_a cat_b cat_c cat_d cat_e cat_f cat_g cat_h cat_i cat_j
1    46   576   535   348   453   400    50    49    28    15
2    46   603   537   338   421   426    38    50    25    16
3    50   633   495   350   391   450    46    46    22    17
4    60   606   521   344   440   397    50    50    18    14
5    42   630   539   381   386   398    34    58    19    13
6    48   663   514   356   398   380    40    62    22    17
> 
> #create empty vectors to hold upper and lower percentile values
> LB.95<-vector()
> UB.95<-vector()
> #calculate 95% interval
> for(i in 1:length(p)){
+ LB.95[i]<-quantile(sim.counts[,i], .025)
+ UB.95[i]<-quantile(sim.counts[,i], .975)
+ }
> 
> cbind(cat.names, LB.95, UB.95)
      cat.names LB.95 UB.95
 [1,] "cat_a"   "39"  "67" 
 [2,] "cat_b"   "590" "675"
 [3,] "cat_c"   "487" "566"
 [4,] "cat_d"   "324" "392"
 [5,] "cat_e"   "360" "431"
 [6,] "cat_f"   "369" "442"
 [7,] "cat_g"   "30"  "55" 
 [8,] "cat_h"   "39"  "67" 
 [9,] "cat_i"   "12"  "30" 
[10,] "cat_j"   "9"   "24" 

现在最大的警告是我正在处理来自更大样本的估计值(N= 118,650),就好像它们是来自总体的参数一样。在某些方面,这种模拟有点像穷人的贝叶斯方法来解决问题,我忽略了我对基于大初始样本的真实参数的不确定性。人们当然可以对这个问题采取更全面的贝叶斯方法,我相信应用统计学界的许多倡导者会认为这个问题非常适合贝叶斯技术。

需要注意的是,您如何使用此分析?好吧,您可以获取获得的大小样本N2(在我的情况下N2= 2500),计算每个类别的计数,并根据模拟确定这些计数是否落在预先确定的区间内(我选择了 95% 的置信区间 - 显示在最终表格中)。

请注意,这种方法没有假设检验框架中经常依赖的漂亮、清晰的决策规则,并且取决于您的最终受众,这可能是一个重要的问题。但是,您可以回答(甚至可能更有意义)从较小样本中获得的计数是否落在可能的值范围内,如果从中抽取样本的总体参数等同于更大(可能是先前获得的)比较样本.