我无法解决一个问题,这个问题出现在我试图创建自己的"data.frame"并对其进行定量分析(比如"chisq.test")时。背景如下:我总结了我收到的关于两家医院的数据。两家医院均测量了同一类别变量n次。在这种情况下,观察期间发现的与健康护理相关的细菌频率。在一个表格中,总结的数据如下所示,其中“%”表示在时间段内进行的所有测量中的百分比。
当然,如果数据以这种方式汇总,就会有显著的统计结果 - 因为一个类别被汇总为完全没有测量。到底是为什么发生这种情况,我该如何纠正它?最后,是否有任何明显的函数可以循环而不必为每个类别制作单独的 data.frame 呢?我想不出来。感谢您的帮助!
根据 THELATEMAIL 的请求更新了 RAW DATA.FRAME
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) -
“所有位置”这个标题将随后被替换为创口、血液、尿液、导管等。
hosp2
响应分组的变量hosp1
的响应进行测试,因此需要测试的是变量hosp1
的响应。正如您可以清楚地看到的那样,这将明显有所不同。另一方面,如果您向chisq.test
传递表示每个类别计数的2x2矩阵,例如chisq.test(cbind(c(829,567),c(578,425)),correct=FALSE)
,则会按您期望的方式工作,得到的 p 值为0.39,这更加符合预期。与 SPSS 等软件不同,R 更适合使用汇总数据,因为它允许表格、矩阵、列表等作为输入数据的替代方法。 - thelatemailchisq.test()
的一个真正棒极了的细节!确实非常好用和方便!!!现在,如果有人有一个巧妙的函数的想法,可以帮我避免为每个类别都做这个,那就太棒了。但当然,thelatemail得到了赞同,因为这是正确的答案!! - OFishdput
)来展示您原始的细菌阳性/阴性计数的 '数组数据',那么我相信 Stack Overflow 的专家们一定能够找到简化您分析的方法。 - thelatemail