有人能告诉我为什么R不使用整个data.frame进行这个chisq.test吗?

有人能告诉我为什么R不使用整个data.frame进行这个chisq.test吗?,r,function,chi-squared,R,Function,Chi Squared,当我试图创建自己的data.frame并对其进行定量分析(例如chisq.test)时,我无法想出解决问题的方法 背景如下:我总结了我收到的有关两家医院的数据。两人都测量了相同的分类变量n次。在这种情况下,是指在特定观察期内发现与医疗保健相关的细菌的频率 在一个表格中,汇总数据如下所示,其中%表示该时间段内进行的所有测量的百分比 n Hospital 1 (%) n Hospital 2 (%) Healthcar

当我试图创建自己的
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)
结果似乎表明,两者之间存在显著差异。如果您将数据交叉列表,您会看到R以一种非常奇怪的方式总结数据:

with(all, table(hosp1, hosp2))

       No Yes
  No  174   0
  Yes 251 578
因此,当然,如果以这种方式总结数据,将会有一个具有统计意义的发现——因为有一个类别被总结为根本没有测量。究竟为什么会发生这种情况?我能做些什么来纠正它?最后,不必为每个类别创建单独的
data.frame
,是否有明显的函数来循环它?我想不出一个

谢谢你的帮助

根据最新邮件的原始数据请求进行更新。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)   -

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

关于如何使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)
您可以通过以下编程方式获得这些答案:

#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)

因为您正在测试的是变量
hosp1
响应,根据上一个表,按变量2
hosp2
响应分组。你可以清楚地看到,这肯定会有很大的不同<另一方面,如果您向其传递一个2x2矩阵,表示每个类别中的计数,则代码>chisq.test将按照您的预期工作-例如:
chisq.test(cbind(c(829567),c(578425)),correct=FALSE)
-p-value=0.39,这更符合预期。与SPSS等不同,R更有利于处理摘要数据,因为它允许表格、矩阵、列表等作为输入数据的替代方法。哈!谢谢你的快速回复。这实际上是一个非常棒的细节,我不知道关于
chisq.test()
!非常好,非常方便!!!现在,如果有人有一个漂亮的函数的想法,这将使我不必为每个类别都这样做,那将是非常棒的。但是当然,最近的邮件被投票否决了,因为这是正确的答案!!如果你能提供细菌是/否计数的原始“数组数据”的精确R指示(最好使用
dput
),那么我相信SO的智者会想出一种简化分析的方法。呵呵,这其实不那么容易,因为我在这里如此简洁地发布的实际上是更混乱数据的总结。我以前问过一些与同一类数据有关的问题(但不同的分类变量),但我得出的结论是,我得到的回答并不是真正计算正确的东西,尽管我的评估可能是错误的。@thelatemail,我已经更新了原来的问题,现在提供了这个示例中使用的原始数据。抱歉耽搁了。谢谢山姆。编程方法是一个很好的想法。是的,正如你所建议的,总体差异是经过初步检查的。非常感谢您的意见!干杯,O。