[英]How to create 2-way contingency tables in R
(免责声明:抱歉,我之前确实问过类似的问题。它没有得到任何答案,它已关闭。)
我想创建不同大小的 2 路列联表,例如,从 3x3 到 10x15,其中一些应该显示显着关联(使用chisq.test()
或类似的),而另一些则没有。 我已经跑到可能相关的帖子中,但我看不到连接所有点的方法。 例如, 这篇文章讨论了如何使用r2dtable()
创建随机 2 路表。 接下来,有关于生成随机整数的帖子,这些整数总和为特定值, here和here ,这对于定义r2dtable()
的行和列边缘可能很有用。
然而,它使我无法生成此类表的列表。 此外,似乎r2dtable()
总是返回显示没有关联的表。 鉴于表格是随机的,我想这是可以预料的。
有人可以帮忙吗?
您的问题中缺少的信息是如何在表中定义关联或缺乏关联。 这将是任何通用解决方案的特定案例部分。
我假设您最终要分析的“表格”由汇总数据组成,按两个因素分类。
generateData <- function(nRow, nCol, f, ...) {
df <- tibble() %>%
expand(
Row=1:nRow,
Col=1:nCol
)
df <- df %>%
f(...) %>%
pivot_wider(
names_from=Col,
values_from=Value,
names_prefix="Col"
)
return(df)
}
在这里, nCol
和nRow
具有明显的含义, f
是一个 function ,它必须被定义并在一个长的小标题中填充一个名为Value
的列,其中包含名为Row
和Col
的列。 如果需要,省略号...
允许您将任意附加 arguments 传递给f
。
要生成在行和列之间没有关联的表,只需用随机数据填充Value
。 例如:
randomCells <- function(df, ...){
df %>% mutate(Value=5 + floor(runif(df %>% nrow(), max=10)))
}
以便
x <- generateRawData(3, 5, randomCells)
x
# A tibble: 3 x 6
Row Col1 Col2 Col3 Col4 Col5
<int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 9 11 11 14 8
2 2 13 11 12 5 14
3 3 8 11 14 13 10
和
chisq.test(as.matrix(x))
Pearson's Chi-squared test
data: as.matrix(x)
X-squared = 8.8907, df = 10, p-value = 0.5425
现在假设您想要跨列的线性趋势,但行之间没有关联:
linearColumns <- function(df, ...){
df %>% mutate(Value=4*Col + floor(runif(df %>% nrow(), max=25)))
}
x <- generateRawData(3, 6, linearColumns)
x
# A tibble: 3 x 6
Row Col1 Col2 Col3 Col4 Col5
<int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 20 12 31 24 46
2 2 9 25 39 46 38
3 3 6 20 35 36 49
给予
chisq.test(as.matrix(x))
Pearson's Chi-squared test
data: as.matrix(x)
X-squared = 22.63, df = 10, p-value = 0.0122
你只需要定义f
来给出你想要的模式。 在更复杂的情况下,在实验单元级别定义响应可能更容易,然后聚合观察到的数据以形成您的模拟数据。
抱歉,在生成示例之前我忘记了set.seed()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.