有人能告诉我为什么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
响应,根据上一个表,按变量2hosp2
响应分组。你可以清楚地看到,这肯定会有很大的不同<另一方面,如果您向其传递一个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。