首页 > 解决方案 > 如何在 R 中创建 2 路列联表

问题描述

(免责声明:抱歉,我之前确实问过类似的问题。它没有得到任何答案,它已关闭。)

我想创建不同大小的 2 路列联表,例如,从 3x3 到 10x15,其中一些应该显示显着的关联(使用chisq.test()或类似),而另一些则没有。我已经跑到可能相关的帖子中,但我看不到连接所有点的方法。例如,这篇文章讨论了如何使用r2dtable(). 接下来,有关于生成随机整数的帖子,这些整数总和为特定值,herehere,这对于定义行和列边缘可能很有用r2dtable()

然而,它使我无法生成此类表的列表。此外,似乎r2dtable()总是返回显示没有关联的表。鉴于表格是随机的,我想这是可以预料的。

有人可以帮忙吗?

标签: r

解决方案


您的问题中缺少的信息是如何在表格中定义关联或缺乏关联。这将是任何通用解决方案的特定案例部分。

我假设您最终要分析的“表格”由汇总数据组成,按两个因素分类。

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

在这里,nColandnRow具有明显的含义,并且f是一个必须定义的函数,它使用名为 and 的列填充长Value标题中名为的列。如果需要,省略号允许您传递任意附加参数。RowCol...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()抱歉,在生成示例之前我忘记了。


推荐阅读