【问题标题】:How to create 2-way contingency tables in R如何在 R 中创建 2 路列联表
【发布时间】:2021-06-18 06:22:48
【问题描述】:

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

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

尽管如此,如何生成此类表的列表让我无法理解。此外,r2dtable() 似乎总是返回显示没有关联的表。鉴于表格是随机的,我想这是可以预料的。

有人可以帮忙吗?

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

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

    这里,nColnRow 具有明显的含义,f 是一个必须定义的函数,它在一个长标题中填充一个名为 Value 的列,其中包含名为 Row 和 @987654327 的列@。省略号... 允许您在需要时将任意附加参数传递给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()

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 2020-10-06
      • 2011-10-20
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      相关资源
      最近更新 更多