【问题标题】:How to Calculate the percent difference in a three dimensional array using R apply()如何使用 R apply() 计算三维数组中的百分比差异
【发布时间】:2021-07-22 00:36:44
【问题描述】:

我想通过在 R 中使用 apply() 计算三维数组中单元格之间的百分比差异来研究一个幼稚的假设。但是,没有得到正确的解决方案。

下面是我想应用于“数据集”包中以下 HairEyeColor 数据集中每个单元格的百分比差异。

百分比差异的一般表达式是这样的。

100%*(1-Female/Male)

图书馆

library(vcd)
library(DescTools)

data("HairEyeColor",package="datasets") # load data

str(HairEyeColor) #show structure


a <- HairEyeColor[,,1] # male table
b <- HairEyeColor[,,2] # female table

将数组绑定在一起,1 表示男性,2 表示女性。

HEC1=Abind(Male=a, Female=b, along=3)

输出

, , Male

        Brown Blue Hazel Green
Black    32   11    10     3
Brown    53   50    25    15
Red      10   10     7     7
Blond     3   30     5     8

, , Female

        Brown Blue Hazel Green
Black    36    9     5     2
Brown    66   34    29    14
Red      16    7     7     7
Blond     4   64     5     8

贡献者的注释:prop.table() 命令产生百分比,使用总案例作为 100% 计算。对于条件相对频率,请使用边距参数。 然后使用 apply() 允许我们沿数组(或矩阵)中的任何维度或维度组合执行任何计算。

apply(prop.table(HEC1), c(1,2), diff)

这里是输出,但这不是最近的区别。

         Brown         Blue        Hazel        Green
Black 0.006756757 -0.003378378 -0.008445946 -0.001689189
Brown 0.021959459 -0.027027027  0.006756757 -0.001689189
Red   0.010135135 -0.005067568  0.000000000  0.000000000
Blond 0.001689189  0.057432432  0.000000000  0.000000000

我也试过了,没有成功。

apply(prop.table(HEC1), c(1,1,2), diff)

这是人们对男性与女性黑色和棕色之间百分比差异的预期。会是

(HEC1[1,1,1] - HEC1[1,1,2])*100/HEC1[1,1,1]

输出

-12.5

想要的表

       Brown    Blue       Hazel    Green
Black   -12.5    18.1        50      33.3
Brown   -24.5    32        -16     6.6
Red   -60     3           0       0
Blond   -33.3   -113.3      0         0

任何建议都是有帮助的。谢谢

我研究了这个问题,但是它指的是长格式的时间序列How to calculate percent differences in a table in R

【问题讨论】:

  • 一个问题是prop.table 计算的是比例而不是百分比,因此您需要将每个表乘以 100。
  • @dcarlson -12.5 不等于 0.675 %,因为黑人和棕色人的分母是男性。?
  • @dcarlson 感谢您的贡献。以下提供了所需的表格,但是,是否有更快的解决方案? >ab 100*(1-b/a)
  • 这是女性与男性的比例增加/减少,而不是男性与女性的比例/百分比差异。由于样本中女性超过男性,因此比例增加/减少的预期值为100 *(1 - 313/279) = -12.18638。我的解决方案提供了男性和女性之间头发颜色/眼睛颜色组合百分比的差异。
  • @dcarlson 谢谢您的回复。你的过程和使用 Delt(,type='arithmetic')*100 一样吗?

标签: r count


【解决方案1】:

您应该始终提供可重现的数据。打印输出可能会遗漏有关结构的重要细节。使用dput(HEC1) 并将结果复制到您的问题中,如下所示:

HEC1 <- structure(c(32L, 53L, 10L, 3L, 11L, 50L, 10L, 30L, 10L, 25L, 
7L, 5L, 3L, 15L, 7L, 8L, 36L, 66L, 16L, 4L, 9L, 34L, 7L, 64L, 
5L, 29L, 7L, 5L, 2L, 14L, 7L, 8L), .Dim = c(4L, 4L, 2L), .Dimnames = list(
    c("Black", "Brown", "Red", "Blond"), c("Brown", "Blue", "Hazel", 
    "Green"), c("Male", "Female")))

现在我们需要弄清楚你在计算什么。您希望的百分比是基于棕眼黑发个体的总数,但这是误导性的,因为男性和女性的样本量不同:

margin.table(HEC1, 3)
  Male Female 
   279    313 

如果我们分别计算表格并减去它们:

Male.pct <- prop.table(HEC1[, , 1]) * 100
round(Male.pct, 2)
#       Brown  Blue Hazel Green
# Black 11.47  3.94  3.58  1.08
# Brown 19.00 17.92  8.96  5.38
# Red    3.58  3.58  2.51  2.51
# Blond  1.08 10.75  1.79  2.87

Female.pct <- prop.table(HEC1[, , 2]) * 100
round(Female.pct, 2)
#       Brown  Blue Hazel Green
# Black 11.50  2.88  1.60  0.64
# Brown 21.09 10.86  9.27  4.47
# Red    5.11  2.24  2.24  2.24
# Blond  1.28 20.45  1.60  2.56

round(Male.pct - Female.pct, 2)
#       Brown  Blue Hazel Green
# Black -0.03  1.07  1.99  0.44
# Brown -2.09  7.06 -0.30  0.90
# Red   -1.53  1.35  0.27  0.27
# Blond -0.20 -9.69  0.19  0.31

您原来的apply 函数以第三种方式计算比例,即在结合两个表的整个数组上。你应该使用过:

apply(prop.table(HEC1, 3), 1:2, diff) * 100
#            Brown      Blue      Hazel      Green
# Black 0.03206339 -1.067253 -1.9867853 -0.4362912
# Brown 2.08984621 -7.058527  0.3046022 -0.9035006
# Red   1.52759170 -1.347808 -0.2725388 -0.2725388
# Blond 0.20268645  9.694596 -0.1946706 -0.3114730 

diff 函数从第一个值(女性 - 男性)中减去第二个值,因此与上面的男性 - 女性相比,负号是相反的。

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2021-06-17
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多