代码之家  ›  专栏  ›  技术社区  ›  Choc_waffles

R中产生的分位数和百分位数之间的差异

  •  0
  • Choc_waffles  · 技术社区  · 6 年前

    请原谅我的数学,但为什么这两个代码的结果不同?预计2015年第63和82行累计百分比的支出与第二年产生的支出相同。第一个是X63的0.591,X82的0.858,第二个代码在cumsum_pct中分别显示0.792和0.966。谢谢

    set.seed(1)
    library('dplyr')
    Claims6 <- data.frame(year = factor(rep(c(2015, 2016), each = 10)),Expense = runif(20))
    
    Claims6 %>% 
      group_by(year) %>% 
      do(data.frame(t(quantile(.$Expense, probs = c(0.10, 0.30, 0.63, 0.82)))))
    
    # A tibble: 2 x 5
    # Groups:   year [2]
    # year    X10.  X30.  X63.  X82.
    # <fct>  <dbl> <dbl> <dbl> <dbl>
    # 1 2015  0.0488 0.439 0.591 0.858
    # 2 2016  0.101  0.262 0.592 0.805
    
    Claims6 %>% group_by(year) %>% 
      arrange(year,Expense) %>%
      mutate(pct = round(Expense / sum(Expense),2),
             cumsum_pct = round(cumsum(Expense) / sum(Expense),2))
    
    # A tibble: 20 x 4
    # Groups:   year [2]
    # year  Expense   pct cumsum_pct
    # <fct>   <dbl> <dbl>      <dbl>
    #   1 2015   0.0332  0.01       0.01
    # 2 2015   0.0505  0.01       0.02
    # 3 2015   0.384   0.07       0.09
    # 4 2015   0.463   0.09       0.18
    # 5 2015   0.467   0.09       0.26
    # 6 2015   0.538   0.1        0.37
    # 7 2015   0.617   0.12       0.48
    # 8 2015   0.792   0.15       0.63
    # 9 2015   0.966   0.18       0.82
    # 10 2015   0.972   0.18       1   
    # 11 2016   0.0622  0.01       0.01
    # 12 2016   0.106   0.02       0.03
    # 13 2016   0.178   0.04       0.07
    # 14 2016   0.298   0.06       0.13
    # 15 2016   0.445   0.09       0.23
    # 16 2016   0.591   0.12       0.35
    # 17 2016   0.592   0.12       0.47
    # 18 2016   0.765   0.16       0.63
    # 19 2016   0.872   0.18       0.81
    # 20 2016   0.904   0.19       1   
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Jon Spring    6 年前

    这是两个相关但独立的汇总统计。第一个与排序有关,第二个与累积和有关。它们将覆盖相同的值范围,但具有不同的元素权重。

    在下面的简单示例中,第一个计算使用 quantile 与采样有关,显示50%的样本为2,介于第2个值和第3个值之间。即使第一个和/或最后一个值更极端,也会得到相同的中值。-- 分位数 只关心订单。

    第二个是数值的累积分布,显示50%的累积和为3。

    nums = c(0, 1, 3, 4) 
    quantile(nums)
    #   0%  25%  50%  75% 100% 
    # 0.00 0.75 2.00 3.25 4.00 
    
    data.frame(nums = nums) %>%   
        mutate(pct = nums / sum(nums),
               cumsum_pct = cumsum(pct))
    #    nums  pct cumsum_pct
    # 1    0 0.000      0.000
    # 2    1 0.125      0.125
    # 3    3 0.375      0.500
    # 4    4 0.500      1.000
    

    同样,您的数字一般不会在您提供的两个计算之间匹配,因为它们执行不同的操作。这个 分位数 一种是通过有序元素列表告诉给定分数的值,另一种是当累积和达到总数的给定分数时告诉值。