【问题标题】:R: how to divide each cell value (dataframe) by a quantity that includes the correspoding row AND column totalR:如何将每个单元格值(数据框)除以包含相应行和列总计的数量
【发布时间】:2022-01-13 08:07:01
【问题描述】:

我有一个交叉表(数据框格式),我从中计算了 chi-sq 标准化残差。下面我提供了两个可重现的数据集。

交叉表:

df <- structure(c(310, 36, 0, 0, 212, 158, 9, 0, 21, 35, 17, 4, 25, 
102, 49, 18, 7, 35, 51, 28), .Dim = 4:5, .Dimnames = list(c("none", 
"grade1", "grade2", "grade3"), c("0-9", "10-19", "20-29", "30-39", 
"40+")))

标准化残差

st.residuals <- structure(c(9.882, -7.267, -6.247, -3.935, 1.21, 3.035, -5.162, 
-4.119, -2.96, 1.945, 2.821, 0.298, -7.492, 4.82, 5.796, 3.161, 
-7.005, -0.738, 10.11, 9.704), .Dim = 4:5, .Dimnames = list(c("none", 
"grade1", "grade2", "grade3"), c("0-9", "10-19", "20-29", "30-39", 
"40+")))

目标

我要计算调整后的标准化残差,这需要将每个标准化残差除以下图中指示的数量,其中 GT 是表格总计,CT 是列总计,RC 是行总计:

我被困在哪里

我很难弄清楚(我的错)如何在 R 中实现分母的计算。特别是,我不知道如何编码,以便为每个单元格 R 考虑相应的行和列总计。

【问题讨论】:

    标签: r dataframe contingency


    【解决方案1】:

    1) R 已经在 chisq.test 中有这个:

    chisq.test(df)$stdres
    

    2) 或以下内容。残差与问题中的 st.residuals 相同,最后一行产生与上述行相同的结果。

    expected <- outer(rowSums(df), colSums(df)) / sum(df)
    residuals <- (df - expected) / sqrt(expected)
    residuals / sqrt(outer((1 - rowSums(df) / sum(df)), (1 - colSums(df) / sum(df))))
    

    3) 或者,我们可以使用扫描来计算上面的 (1)。残差来自(2),并且如前所述,等于问题中的 st.residuals。

    residuals |>
      sweep(1, sqrt(1 - rowSums(df) / sum(df)), `/`) |>
      sweep(2, sqrt(1 - colSums(df) / sum(df)), `/`)
    

    【讨论】:

    • 谢谢。但出于教育目的,我正在尝试逐步解决这些问题。
    • 好的。补充说。
    • 谢谢。与此同时,我想出了一种使用“for”循环的效率较低的方法。我想到了“外部”,但不知道如何实际设置它。当然,您的建议更有效率。
    猜你喜欢
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多