【问题标题】:Finding quantiles in Julia在 Julia 中查找分位数
【发布时间】:2021-05-31 16:27:15
【问题描述】:

我需要一个像 Stata 中的 xtile 这样的函数,给定一个向量,它返回每个 obs 所属的分位数。所以如果函数定义为

function xtile(vector; q= 4) #q = 4 by default returns quartiles
    *** returns a vector with the same size as "vector", indicating which quantile each obs belongs to.
end

我想用在:

@pipe df |> transform(:height => xtile => :quantiles)

我知道Stella.jl 提供了这样的功能。但我无法安装该软件包,现在我想知道是否还有另一个软件包。或者我可以自己实现。

【问题讨论】:

    标签: julia quantile


    【解决方案1】:

    虽然使用 CategoricalArrays 包是一个很好的解决方案,并且具有实际显示分位数含义的额外好处,但仅使用 Julia 标准库就很容易实现 xtile

    using Statistics
    function xtile(x; n=4)
        q = quantile(x, LinRange(0, 1, n + 1))
        map(v -> min(searchsortedlast(q, v), n), x)
    end
    

    【讨论】:

      【解决方案2】:

      可以通过CategoricalArrays.jl package提供的cut method找到现成的解决方案,只要你对StringsAbstractVector没问题:

      using CategoricalArrays
      
      x = rand(10);
      cut(x, 4)
      # 10-element CategoricalArray{String,1,UInt32}:
      #  "Q4: [0.565838, 0.85564]"
      #  "Q2: [0.333373, 0.393529)"
      #  "Q4: [0.565838, 0.85564]"
      #  "Q3: [0.393529, 0.565838)"
      #  "Q1: [0.0381196, 0.333373)"
      #  "Q3: [0.393529, 0.565838)"
      #  "Q4: [0.565838, 0.85564]"
      #  "Q1: [0.0381196, 0.333373)"
      #  "Q1: [0.0381196, 0.333373)"
      #  "Q2: [0.333373, 0.393529)"
      

      如果你想要分位数为数字,你可以通过广播levelcode获取等级代码:

      a = cut(x, 4);
      levelcode.(a)
      # 10-element Array{Int64,1}:
      #  4
      #  2
      #  4
      #  3
      #  1
      #  3
      #  4
      #  1
      #  1
      #  2
      

      这可以很容易地转换为在管道中工作的函数:

      xtile(x; n=4) = levelcode.(cut(x, n));
      xtile(x)
      # 10-element Array{Int64,1}:
      #  4
      #  2
      #  4
      #  3
      #  1
      #  3
      #  4
      #  1
      #  1
      #  2
      
      xtile(x, n=5)
      # 10-element Array{Int64,1}:
      #  4
      #  2
      #  5
      #  4
      #  1
      #  3
      #  5
      #  2
      #  1
      #  3
      

      【讨论】:

        猜你喜欢
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 2017-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多