我有一个数据框架,大约有20,000个观测结果。由此,我创建了一个包含两个变量频率的应急表。
有了这个,我想执行一个独立的x平方检验,看看我的两个变量之间是否有关系。通常这很容易,但许多单元格的期望值为0,尽管原始数据帧的大小很大。我想删除任何包含频率小于5的行。
我已经对堆栈交换进行了广泛的搜索,但是我无法找到解决这个特定问题的方法,我要么理解(我对R比较陌生),要么找到一个使用应变表(而不是原始数据框架)的解决方案。
任何帮助都非常感谢。
编辑:
谢谢你的回应贾斯汀。
根据要求,我已经上传了数据表和应急表的摘录。我还上传了我迄今尝试过的少量代码,并给出了结果。
达菲
Department Super
AAP 1
ACS 4
ACE 1
AMA 1
APS 3
APS 2
APS 1
APS 1
ARC 5
ARC 7
ARC 1
BIB 6
BIB 6
BMS 2所以有两列,第一列是三个字母的部门代码,第二列是一个数字整数(1-7)。
应急表
table(department,super)
1 2 3 4 5 6 7 8
ACS 32 10 7 24 50 7 24 14
AMA 0 4 2 6 10 3 11 1
...所以有频率的标准应急表。
到目前为止,我知道我可以创建一个逻辑测试,用于测试单元格内容是否小于5:
depSupCrosstab <- depSupCrosstab[,2:8]>5我不知道的是如何使用这一行代码创建的矩阵来删除整行,如果它们有任何错误的条目。
希望这能有所帮助。恐怕我是新来的,但只有一种方法可以学习.
发布于 2013-11-22 16:18:12
我想我在一个相关的问题中找到了答案。在这种情况下,apply是您的朋友,因为它可以在cols或行上迭代。
要创建与您类似的数据框架,然后只选择所有cols都> 5的行,可以使用以下方法:
set.seed(1985)
tosub <- data.frame(matrix(round(runif(n = 80, min = 0, max = 100)), ncol = 8))
head(tosub,2)
x <- apply(tosub[,1:8] > 5, MARGIN = 1, all)
summary(x)
tosub[which(x),]
X1 X2 X3 X4 X5 X6 X7 X8
1 66 30 72 59 26 69 76 47
2 27 42 26 95 66 14 67 18
4 42 28 93 7 35 35 95 23
5 38 89 69 91 98 91 60 69
9 89 31 91 72 28 31 58 58
10 53 87 27 89 95 37 98 20发布于 2013-11-22 16:58:27
恐怕你的问题更复杂。卡方检验的假设是,每个单元的期望频率大于5。在您的示例中,您正在尝试选择列联表中每个单元格的计数,即观测频率。预期频率(在空假设下)是根据行和列总数计算的,如基本示例这里所示。
为了遵循您的示例,假设的偶然性表可能如下所示:
ACS <- c(32, 10, 7, 24, 50, 7, 24, 14)
AMA <- c(0, 4, 2, 6, 10, 3, 11, 1)
ARC <- c(6, 10, 12, 3, 12, 23, 10, 2)
tab <- rbind(ACS, AMA, ARC)如果您筛选所观察到的计数等于或小于5,您将删除AMA和ARC:
apply(tab,1, function(x) any(x<=5))
ACS AMA ARC
FALSE TRUE TRUE ,这在概念上是错误的,,因为如上所述,预期的频率取决于整个数据。以获得经验。计数:
chisq.test(tab, correct=F)$expected
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
ACS 22.558304 14.247350 12.466431 19.590106 42.742049 19.590106 26.713781
AMA 4.968198 3.137809 2.745583 4.314488 9.413428 4.314488 5.883392
ARC 10.473498 6.614841 5.787986 9.095406 19.844523 9.095406 12.402827
[,8]
ACS 10.091873
AMA 2.222615
ARC 4.685512
Warning message:
In chisq.test(tab, correct = F): Chi-squared approximation may be incorrect卡方测试发出警告信息,因为确实有一些带有exp的单元格。但是,如果只删除AMA,表的动态(行和列总计)和所有exp都会发生变化。计数在5以上:
chisq.test(tab[-2,], correct=F)$expected
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
ACS 25.95122 13.658537 12.97561 18.439024 42.34146 20.487805 23.21951
ARC 12.04878 6.341463 6.02439 8.560976 19.65854 9.512195 10.78049
[,8]
ACS 10.926829
ARC 5.073171因此,如果您同时删除AMA和ARC,您将失去一个重要的信息。
您可以尝试运行Fisher的确切测试(请参阅下面的解释):
fisher.test(tab,simulate.p.value=TRUE,B=10000)最后:
https://stackoverflow.com/questions/20147589
复制相似问题