【问题标题】:Obtaining absolute deviation from mean for two sets of scores获得两组分数的绝对偏差
【发布时间】:2017-06-24 16:51:03
【问题描述】:

要获得两组分数的绝对偏差,我通常需要用 R 编写长代码,如下所示。

问题

我想知道是否有可能在 BASE R 中以某种方式 Vectorize mad() 函数,以便我在下面显示的示例中的每组分数的平均分数的绝对偏差可以使用获得Vectorized 版本的mad()?任何其他可行的想法都受到高度赞赏?

set.seed(0)
     y = as.vector(unlist(mapply(FUN = rnorm, n = c(10, 10)))) # Produces two sets of scores
groups = factor( rep(1:2, times = c(10, 10) ) )                # Grouping ID variable

G1 = y[groups == 1]              # subset y scores for group 1
G2 = y[groups == 2]              # subset y scores for group 2
G1.abs.dev = abs(G1 - mean(G1))  # absolute deviation from mean scores for group 1
G2.abs.dev = abs(G2 - mean(G2))  # absolute deviation from mean scores for group 2

【问题讨论】:

    标签: r function statistics


    【解决方案1】:

    怎么样

    score <- lapply(split(y, groups), FUN = function (u) abs(u - mean(u)))
    

    score <- ave(y, groups, FUN = function (u) abs(u - mean(u)))
    

    结果以不同的方式组织。选择最适合您的。


    你的措辞有问题。 mad 返回数据的单个统计/值。例如,

    sapply(split(y, groups), mad)
    

    您不是对mad 进行矢量化,而是像示例代码所示的那样简单地计算每个基准的偏差。

    【讨论】:

    【解决方案2】:

    如果您将所有内容都粘贴在 data.frame 中,它会更干净。在基础 R 中,

    set.seed(0)
    
    df <- data.frame(y = rnorm(20),
                     group = rep(1:2, each = 10))
    
    df$abs_dev <- with(df, ave(y, group, FUN = function(x){abs(mean(x) - x)}))
    
    df
    #>               y  group    abs_dev
    #> 1   1.262954285      1 0.90403032
    #> 2  -0.326233361      1 0.68515732
    #> 3   1.329799263      1 0.97087530
    #> 4   1.272429321      1 0.91350536
    #> 5   0.414641434      1 0.05571747
    #> 6  -1.539950042      1 1.89887401
    #> 7  -0.928567035      1 1.28749100
    #> 8  -0.294720447      1 0.65364441
    #> 9  -0.005767173      1 0.36469114
    #> 10  2.404653389      1 2.04572943
    #> 11  0.763593461      2 1.12607477
    #> 12 -0.799009249      2 0.43652794
    #> 13 -1.147657009      2 0.78517570
    #> 14 -0.289461574      2 0.07301974
    #> 15 -0.299215118      2 0.06326619
    #> 16 -0.411510833      2 0.04902952
    #> 17  0.252223448      2 0.61470476
    #> 18 -0.891921127      2 0.52943981
    #> 19  0.435683299      2 0.79816461
    #> 20 -1.237538422      2 0.87505711
    

    或 dplyr,

    library(dplyr)
    set.seed(0)
    
    df <- data_frame(y = rnorm(20),
                     group = rep(1:2, each = 10))
    
    df <- df %>% group_by(group) %>% mutate(abs_dev = abs(mean(y) - y))
    
    df
    #> # A tibble: 20 x 3
    #> # Groups:   group [2]
    #>               y  group    abs_dev
    #>           <dbl>  <int>      <dbl>
    #>  1  1.262954285      1 0.90403032
    #>  2 -0.326233361      1 0.68515732
    #>  3  1.329799263      1 0.97087530
    #>  4  1.272429321      1 0.91350536
    #>  5  0.414641434      1 0.05571747
    #>  6 -1.539950042      1 1.89887401
    #>  7 -0.928567035      1 1.28749100
    #>  8 -0.294720447      1 0.65364441
    #>  9 -0.005767173      1 0.36469114
    #> 10  2.404653389      1 2.04572943
    #> 11  0.763593461      2 1.12607477
    #> 12 -0.799009249      2 0.43652794
    #> 13 -1.147657009      2 0.78517570
    #> 14 -0.289461574      2 0.07301974
    #> 15 -0.299215118      2 0.06326619
    #> 16 -0.411510833      2 0.04902952
    #> 17  0.252223448      2 0.61470476
    #> 18 -0.891921127      2 0.52943981
    #> 19  0.435683299      2 0.79816461
    #> 20 -1.237538422      2 0.87505711
    

    或data.table:

    library(data.table)
    set.seed(0)
    
    dt <- data.table(y = rnorm(20),
                     group = rep(1:2, each = 10))
    
    dt[, abs_dev := abs(mean(y) - y), by = group][]
    #>                y group    abs_dev
    #>  1:  1.262954285     1 0.90403032
    #>  2: -0.326233361     1 0.68515732
    #>  3:  1.329799263     1 0.97087530
    #>  4:  1.272429321     1 0.91350536
    #>  5:  0.414641434     1 0.05571747
    #>  6: -1.539950042     1 1.89887401
    #>  7: -0.928567035     1 1.28749100
    #>  8: -0.294720447     1 0.65364441
    #>  9: -0.005767173     1 0.36469114
    #> 10:  2.404653389     1 2.04572943
    #> 11:  0.763593461     2 1.12607477
    #> 12: -0.799009249     2 0.43652794
    #> 13: -1.147657009     2 0.78517570
    #> 14: -0.289461574     2 0.07301974
    #> 15: -0.299215118     2 0.06326619
    #> 16: -0.411510833     2 0.04902952
    #> 17:  0.252223448     2 0.61470476
    #> 18: -0.891921127     2 0.52943981
    #> 19:  0.435683299     2 0.79816461
    #> 20: -1.237538422     2 0.87505711
    

    【讨论】:

      猜你喜欢
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 2022-07-23
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      相关资源
      最近更新 更多