如何在两个总体中测试相同的分类变量?

机器算法验证 r 假设检验 分类数据 卡方检验
2022-03-01 18:56:51

我的数据看起来有点像这样:

ID         Status
01         A
02         G
03         E
...        ...
100        G

你明白了,我想。我有来自两个不同人群(群组)的数据,我想将一个人群中状态变量的分布与另一个人群中的分布进行比较。我要回答的问题是这样的:如果您不知道更好,这些可能来自同一人群吗?我认为这意味着我应该执行人的卡方,尽管我不确定。我也不确定以允许您运行测试的方式转换变量的方法。(我特别想知道如何在 R 中做到这一点。)

3个回答

让我(a)首先解释基本思想而不是机制——回想起来它们变得更加明显。然后(b)我将讨论卡方(以及它是否合适——它可能不合适!),然后(c)我将讨论如何在 R 中做到这一点。

(a) 在 null 下,总体是相同的。想象一下,您将两个群组放入一个大型数据集中,但添加一个包含群组标签的列。然后在 null 下,队列标签实际上只是一个随机标签,它不会告诉您更多关于观察来自的分布的信息。

当然,在另一种情况下,群组标签很重要——知道群组标签比不知道更能说明问题,因为两个标签下的分布不同。

(这立即暗示了某种排列测试/随机化测试,其中对样本计算的统计量(对替代方案敏感)与相同​​统计量的分布进行比较,其中队列标签随机重新分配给行。如果你做了所有可能的重新分配它是一个排列测试,如果你只对它们进行抽样它是一个随机化测试。)

(b) 那么现在,如何做卡方?

您计算空值下的预期值。由于队列标签在 null 下无关紧要,因此您可以根据整体分布计算每个单元格中的预期数量:

                       Status
                 A   B   ...  E   ...  G ...      Total
  Cohort 1:     10  15       18                    84
  Cohort 2:      9   7       25                    78

  Total:        19  22   ... 43 ...               162

因此,如果分布相同,则队列和状态之间没有关联,并且(以行总计和列总计为条件)单元格中的预期数字为 row-total-i列总计-j / 总体总计(i,j)×

所以你只需要一个普通的独立性卡方检验

然而!

如果状态标签形成一个有序的类别,则此卡方检验会丢弃大量信息——它对有趣的替代品(例如向更高或更低类别的轻微转变)的效力较低。在这种情况下,您应该做一些更合适的事情 - 也就是说,考虑到该排序。有很多选择。

--

(c) 现在关于如何在 R 中执行此操作 - 这取决于您的数据当前在 R 中的设置方式 -拥有一个可重现的示例(例如数据的子集)真的很有帮助!

我假设您将它放在一个包含两列的数据框中,一列带有状态(一个因素),另一列带有队列(第二个因素)。

像这样:

  status  cohort
1      B Cohort1
2      B Cohort1
3      D Cohort1
4      B Cohort1
5      C Cohort1
6      D Cohort1
. 
.
. 
25      G Cohort2
26      E Cohort2
27      E Cohort2
28      D Cohort2
29      C Cohort2
30      G Cohort2

然后,如果那是一个名为的数据框,statusresults您将获得一个类似于我之前所做的表格:

> with(statusresults,table(cohort,status))
         status
cohort    A B C D E F G
  Cohort1 2 6 7 3 0 0 0
  Cohort2 0 0 2 2 4 1 3

对于卡方检验,您只需:

> with(statusresults, chisq.test(status, cohort))

    Pearson's Chi-squared test

data:  status and cohort 
X-squared = 18.5185, df = 6, p-value = 0.005059

Warning message:
In chisq.test(status, cohort) : Chi-squared approximation may be incorrect

(警告是因为某些单元格中的预期计数很低,因为我使用了非常小的样本)

如果您为状态排序了类别,您应该这样说,以便我们可以讨论除普通卡方之外的其他分析可能性。

您对进行卡方检验的想法是正确的。所以这里是:

#Create two data sets (id, outcome and group label)
Dat1 <- as.data.frame(cbind(1:999,sample(c("A","G","E"),999,replace=T,prob=c(.2,.4,.4)),"group1"))
Dat2 <- as.data.frame(cbind(1:500,sample(c("A","G","E"),500,replace=T,prob=c(.4,.2,.4)),"group2"))

#Combine data sets
Dat  <- rbind(Dat1,Dat2)

#Receive descriptive statistics and compute Chi-Square
attach(Dat)
table(V3,V2)
chisq.test(table(V3,V2))
detach(Dat)

如果它是正确的,那么您的卡方将是显着的,因此两组的分布之间存在显着差异。有关开始的参考,请参阅: http ://en.wikipedia.org/wiki/Pearson%27s_chi-squared_test http://www.statmethods.net/stats/frequencies.html

您可能对本文感兴趣 [1]。摘要摘录:
双样本检验(又称同质性检验)的目标是,给定两组样本,判断样本背后的概率分布是否相同。在本文中,我们提出了一种基于最小二乘密度比估计器的新型非参数双样本检验方法。通过各种实验,我们表明所提出的方法总体上产生的 II 类错误(即,当两个分布实际上不同时判断它们相同的概率)比最先进的方法更小,较大的 I 型错误(即,当两个分布实际上相同时判断它们不同的概率)。

作者还提供了相同的 matlab 代码 [2]。

[1] http://www.ms.ku-tokyo.ac.jp/2011/LSTT.pdf
[2] http://www.ms.ku-tokyo.ac.jp/software.html#uLSIF