【问题标题】:Chi-square test in R with unequal sample sizesR中样本量不等的卡方检验
【发布时间】:2023-01-12 07:56:09
【问题描述】:

这个问题的一个版本已经被问过几次,但从来没有以最简单的方式问过。基本上,当两组之间的样本量不均匀时,stats::chisq.test 函数不起作用,尽管根据我的理解,卡方检验应该适用于不相等的样本量。

下面是一些测试数据:

df1 <- data.frame("x" = c("Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No"))
df2 <- data.frame("x" = c("Yes","Yes","Yes","Yes","Yes","Yes","Yes","Yes","No","Yes","No","Yes","Yes","Yes","No"))

我的目标是查看样本量不相等的两组之间的结果x(即结果是“是”还是“否”)是否存在差异。但是当我运行以下代码时:

chisq.test(table(df1$x,df2$x))

我收到以下错误:

Error in table(df1$x, df2$x) : all arguments must have the same length

除了通过将 NA 添加到较短的 df 来创建具有相同样本大小的新数据框之外,是否有一个简单的解决方法?如果卡方检验可以在被比较的组中样本量不相等的情况下运行,为什么这个错误甚至会存在?

【问题讨论】:

  • 该错误来自table(df1$x,df2$x),不一定来自chsq.test。当你有这样不均匀的数据时,你希望表格看起来像什么?
  • 也许你期待一张更像table( stack(list(a=df1$x, b=df2$x))) 的桌子?关键是在将它传递给chisq.test 之前,您需要为您的假设正确构建表格。
  • 对,就是这样。我发现我错误地调用了卡方函数。这段代码也适用于我实现我心中的目标。

标签: r statistics chi-squared sample-size


【解决方案1】:
df1 <- data.frame("x" = c("Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No","Yes","No"))
df2 <- data.frame("x" = c("Yes","Yes","Yes","Yes","Yes","Yes","Yes","Yes","No","Yes","No","Yes","Yes","Yes","No"))

m <-cbind(table(df1),table(df2))
m
#>     [,1] [,2]
#> No     8    3
#> Yes    8   12
chisq.test(m)
#> 
#>  Pearson's Chi-squared test with Yates' continuity correction
#> 
#> data:  m
#> X-squared = 1.8742, df = 1, p-value = 0.171

【讨论】:

  • 这有效,但我担心它没有正确计算统计数据。如果我手动创建一个带有额外 NA 的新 df2 以匹配 df1 中的行数,则 X 平方和 p 值与您计算的不同。 df2_new &lt;- rbind(df2,NA) chisq.test(df1$x, df2_new$x) x 平方 = 1.356,p 值 = 0.2442
  • 啊没关系。我发现我调用卡方函数的方式不正确。我的代码不是比较 df1 和 df2 之间“yeses”和“nos”的比例,而是比较 df1 中“yeses”的比例与 df2 中同一行中相应的“yes”或“no”。哎呀!
  • 在这种情况下,两个向量被视为配对样本,当发现 NA 时,将删除整行。也就是说,两个向量的最后一个元素。所以你评论的结果和你做的一样chisq.test(df1$x[1:(nrow(df1)-1)], df2$x)。见?chisq.test详细部分
【解决方案2】:

好吧,这是一个非常基本的统计问题,但我花了很多努力才弄清楚这一点,我认为其他人可能会对其中的一些问题产生类似的困惑。这也是一个非常棘手的问题,因为它会影响您解释数据的方式(如果设置不正确,p 值是错误的!)。所以把你的头包起来很重要。

假设您有这样一个数据集:

df <- data.frame(group1 = c(rep("hot",9),"cold"),
                 group2 = c(rep("hot",5),rep("cold",5)))
> df
   group1 group2
1     hot    hot
2     hot    hot
3     hot    hot
4     hot    hot
5     hot    hot
6     hot   cold
7     hot   cold
8     hot   cold
9     hot   cold
10   cold   cold

您对处于 group1 和 group2 中是否与热或冷相关联感兴趣。如果你像我一样,你可能会假设你可以做一个卡方检验来比较两组:

m <- chisq.test(df$group1, df$group2)
m

导致:

    Pearson's Chi-squared test with Yates' continuity correction

data:  df$group1 and df$group2
X-squared = 0, df = 1, p-value = 1

这些统计数据显然是不正确的。原因是您的数据结构。 R 不是将 group1 中的比例与 group2 中的比例进行比较,而是对 group1 中热的人和 group2 中的热人与 group1 中的热人和 group2 中的冷人等的比例进行按行比较,分析认为鉴于你的问题没有意义。您可以通过调用观察到的频率表来查看这一点,卡方检验基于以下分析:

m$observed
         df$group2
df$group1 cold hot
     cold    1   0
     hot     4   5

要回答您真正感兴趣的问题(“组和温度之间是否存在关联”),您需要更改您在卡方函数中调用的数据的结构:

df2 <- df %>% 
  pivot_longer(cols = c("group1","group2"),
              names_to = "group",
              values_to = "temperature") %>% 
  arrange(group)
df2
# A tibble: 20 × 2
   group  temperature
   <chr>  <chr>      
 1 group1 hot        
 2 group1 hot        
 3 group1 hot        
 4 group1 hot        
 5 group1 hot        
 6 group1 hot        
 7 group1 hot        
 8 group1 hot        
 9 group1 hot        
10 group1 cold       
11 group2 hot        
12 group2 hot        
13 group2 hot        
14 group2 hot        
15 group2 hot        
16 group2 cold       
17 group2 cold       
18 group2 cold       
19 group2 cold       
20 group2 cold      

现在我们可以正确调用卡方函数,我们看到观察到的频率是我们预期的:

> p <- chisq.test(df2$temperature, df2$group)
> p

    Pearson's Chi-squared test with Yates' continuity correction

data:  df2$temperature and df2$group
X-squared = 2.1429, df = 1, p-value = 0.1432

> p$observed
               df2$group
df2$temperature group1 group2
           cold      1      5
           hot       9      5

当然,您实际上不必像这样重新格式化数据来进行卡方检验。相反,您可以使用上面其他答案中的有用代码来创建一个包含您感兴趣的值的频率表。但至少对我来说,写出所有这些内容以查看您实际测试的内容是有帮助的。我认为一般来说,如果您在运行卡方检验时遇到问题并且 R 抛出关于不均匀行的错误,则您可能没有正确设置卡方函数。

【讨论】: