有人能告诉我为什么在进行卡方检验时R不使用整个数据框吗?

5
我无法解决一个问题,这个问题出现在我试图创建自己的"data.frame"并对其进行定量分析(比如"chisq.test")时。背景如下:我总结了我收到的关于两家医院的数据。两家医院均测量了同一类别变量n次。在这种情况下,观察期间发现的与健康护理相关的细菌频率。在一个表格中,总结的数据如下所示,其中“%”表示在时间段内进行的所有测量中的百分比。
                                    n Hospital 1 (%)      n Hospital 2 (%)
Healthcare associated bacteria          829 (59.4)            578 (57.6)
Community associated bacteria           473 (33.9)            372 (37.1)
Contaminants                             94 (6.7)              53 (5.3)
Total                                  1396 (100.0)          1003 (100.0)

现在看百分比,显然比例非常相似,你可能会想知道为什么我要统计比较这两家医院。但我有其他数据,其中比例不同,所以这个问题的目的是:

如何就所测分类指标将医院1与医院2进行比较。

由于数据以总结形式和数组格式提供,因此我决定为每个单独的变量/类别制作一个data.frame

hosp1 <- rep(c("Yes", "No"), times=c(829,567))
hosp2 <- rep(c("Yes", "No"), times=c(578,425))
all <- cbind(hosp1, c(hosp2,rep(NA, length(hosp1)-length(hosp2))))
all <- data.frame(all)
names(all)[2]<-"hosp2"
summary(all)

到目前为止,一切顺利,因为总结看起来正确,现在可以运行chisq.test()了。但是现在,事情变得奇怪了。

with(all, chisq.test(hosp1, hosp2, correct=F))

    Pearson's Chi-squared test

data:  hosp1 and hosp2
X-squared = 286.3087, df = 1, p-value < 2.2e-16

这些结果似乎表明存在显著差异。如果你对数据进行列联表分析,你会发现R以一种非常奇怪的方式对其进行总结:

with(all, table(hosp1, hosp2))

       No Yes
  No  174   0
  Yes 251 578

当然,如果数据以这种方式汇总,就会有显著的统计结果 - 因为一个类别被汇总为完全没有测量。到底是为什么发生这种情况,我该如何纠正它?最后,是否有任何明显的函数可以循环而不必为每个类别制作单独的 data.frame 呢?我想不出来。感谢您的帮助!
根据 THELATEMAIL 的请求更新了 RAW DATA.FRAME
dput(SO_Example_v1)
structure(list(Type = structure(c(3L, 1L, 2L), .Label = c("Community", 
"Contaminant", "Healthcare"), class = "factor"), hosp1_WoundAssocType = c(464L, 
285L, 24L), hosp1_BloodAssocType = c(73L, 40L, 26L), hosp1_UrineAssocType = c(75L, 
37L, 18L), hosp1_RespAssocType = c(137L, 77L, 2L), hosp1_CathAssocType = c(80L, 
34L, 24L), hosp2_WoundAssocType = c(171L, 115L, 17L), hosp2_BloodAssocType = c(127L, 
62L, 12L), hosp2_UrineAssocType = c(50L, 29L, 6L), hosp2_RespAssocType = c(135L, 
142L, 6L), hosp2_CathAssocType = c(95L, 24L, 12L)), .Names = c("Type", 
"hosp1_WoundAssocType", "hosp1_BloodAssocType", "hosp1_UrineAssocType", 
"hosp1_RespAssocType", "hosp1_CathAssocType", "hosp2_WoundAssocType", 
"hosp2_BloodAssocType", "hosp2_UrineAssocType", "hosp2_RespAssocType", 
"hosp2_CathAssocType"), class = "data.frame", row.names = c(NA, 
-3L))

解释:这个data.frame实际上比上面表格中总结的更加复杂,因为它还包含特定类型的细菌在哪里培养的信息(例如在伤口、血液培养、导管等)。所以我正在制作的表格实际上如下:

                                                 All locations
                                n Hospital 1 (%)      n Hospital 2 (%)  p-val
Healthcare associated bacteria     829 (59.4)            578 (57.6)     0.39
Community associated bacteria      473 (33.9)            372 (37.1)     ...
Contaminants                       94 (6.7)              53 (5.3)       ...
Total                              1396 (100.0)          1003 (100.0)   -

“所有位置”这个标题将随后被替换为创口、血液、尿液、导管等。


4
由于您最后一张表格是按变量2 hosp2 响应分组的变量 hosp1 的响应进行测试,因此需要测试的是变量 hosp1 的响应。正如您可以清楚地看到的那样,这将明显有所不同。另一方面,如果您向 chisq.test 传递表示每个类别计数的2x2矩阵,例如 chisq.test(cbind(c(829,567),c(578,425)),correct=FALSE),则会按您期望的方式工作,得到的 p 值为0.39,这更加符合预期。与 SPSS 等软件不同,R 更适合使用汇总数据,因为它允许表格、矩阵、列表等作为输入数据的替代方法。 - thelatemail
哈!感谢您的快速回复。这是我不知道chisq.test()的一个真正棒极了的细节!确实非常好用和方便!!!现在,如果有人有一个巧妙的函数的想法,可以帮我避免为每个类别都做这个,那就太棒了。但当然,thelatemail得到了赞同,因为这是正确的答案!! - OFish
2
如果您能提供一个准确的 R 指示(最好使用 dput)来展示您原始的细菌阳性/阴性计数的 '数组数据',那么我相信 Stack Overflow 的专家们一定能够找到简化您分析的方法。 - thelatemail
呵呵,这其实并不容易,因为我在这里整洁地发布的内容实际上是更混乱的数据的总结。我之前曾经问过关于同一类型的数据(但是不同的分类变量)的问题在这里,但是我得出的结论是,我得到的回复并没有真正计算正确的东西,尽管我的评估可能是错误的。 - OFish
@thelatemail,我已经更新了原始问题,现在提供了用于此示例的原始数据。抱歉耽误了。 - OFish
1个回答

1
这个关于如何让p值起作用的问题的答案有点简单。你可以使用与@thelatemail相同的语法来获取另外两个你正在寻找的p值,具体操作如下:
#community (p = 0.1049)
chisq.test(cbind(c(473,923),c(372,631)),correct=FALSE)

#contaminants (p = 0.1443)
chisq.test(cbind(c(94,1302),c(53,950)),correct=FALSE)

您可以通过以下方式更加程序化地获取这些答案:
out <- cbind(rowSums(SO_Example_v1[,2:6]),rowSums(SO_Example_v1[,7:11]))
chisq.test(rbind(out[1,],colSums(out[2:3,])),correct=FALSE)
chisq.test(rbind(out[2,],colSums(out[c(1,3),])),correct=FALSE)
chisq.test(rbind(out[3,],colSums(out[1:2,])),correct=FALSE)

当然,我们已超出了SO的范围,但鉴于数据的性质,也许更相关的问题是医院总体是否有差异,您可以使用基于所有三种类型的卡方检验(从频率学角度)来回答这个问题。
chisq.test(out,correct=FALSE)

谢谢Sam。编程的方法论是一个非常好的想法。是的,像你建议的那样,整体上的差异最初得到了检查。非常感谢您的输入!干杯,O。 - OFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接