R:聚类数据采样并删除位于 1.5*Interquartile 范围之外的数据点

R: Cluster data sample and remove datapoints lying outside the 1.5*Interquartile range

我有大量 apx 15 mio 的交易数据。以下形式的行:

mydata_tsample
    Size    TradingCost
    10000   80
    2733000 79.343
    750000  78.125
    750000  77.875
    150000  83.875
    105000  86.875
    105000  87.20
    105000  87.54
    70000   87.78
    70000   87.9
    175000  87.1
    175000  87.6
    200000  2
    200000  56
    200000  87.5
    200000  80
    200000  50.2
    370000  7.25
    900000  15.42

我想 运行 两个循环:

1) Cluster/sort 所有交易在 "Size" 之间,比方说 1-100'000。

2) 然后根据 "TradinCost"

从 1) 中删除该集群中位于 1.5* 四分位数范围之外的那些交易

3) 将大小间隔从 1) 增加 100'00,现在 运行 对于大小为 100'000-200'000 的交易也是如此。这个循环上升到 5'000'000。

下面的代码可以做到这一点,但我遇到的问题是 speed/efficiency。我如何编写代码来计算最多 20 mio 的样本。线?使用以下代码,需要几个小时。

  for (i in 0:50){
  mydata_tsample_tempI=subset(mydata_tsample,
                                      Size >=(i)*100000 &
                                      Size  <(i+1)*100000)
  quantiles = quantile(mydata_tsample_tempI$TradingCost, probs = c(.25, .75))
  range = 1.5 * IQR(mydata_tsample_tempI$TradingCost)
  mydata_tsample_tempII = subset(mydata_tsample_tempI,
                                        mydata_tsample_tempI$TradingCost > (quantiles[1] - range) &
                                        mydata_tsample_tempI$TradingCost < (quantiles[2] + range))
    mydata_tsample_new = data.frame(rbind(mydata_tsample_new, mydata_tsample_tempII))
  }

您可以矢量化此过程并大大加快速度。我想为了更快的速度,你应该看看 data.table-package,但也许这可能已经足够了:

library(dplyr)
mydata_tsample %>% 
  group_by(size_groups = cut(Size, seq(0, 5000000, 100000), right = F)) %>% 
  mutate(lower_quant_range = quantile(TradingCost, probs = .25) - 1.5 * IQR(TradingCost), 
         upper_quant_range = quantile(TradingCost, probs = .75) + 1.5 * IQR(TradingCost)) %>% 
  filter(TradingCost > lower_quant_range, TradingCost < upper_quant_range) %>% 
  arrange(Size)

# A tibble: 14 x 5
# Groups:   size_groups [4]
#      Size TradingCost size_groups   lower_quant_range upper_quant_range
#     <int>       <dbl> <fct>                     <dbl>             <dbl>
#  1  10000        80.0 [0,1e+05)                 78.0               93.8
#  2  70000        87.8 [0,1e+05)                 78.0               93.8
#  3  70000        87.9 [0,1e+05)                 78.0               93.8
#  4 105000        86.9 [1e+05,2e+05)             86.1               88.2
#  5 105000        87.2 [1e+05,2e+05)             86.1               88.2
#  6 105000        87.5 [1e+05,2e+05)             86.1               88.2
#  7 175000        87.1 [1e+05,2e+05)             86.1               88.2
#  8 175000        87.6 [1e+05,2e+05)             86.1               88.2
#  9 200000        56.0 [2e+05,3e+05)              5.50             125. 
# 10 200000        87.5 [2e+05,3e+05)              5.50             125. 
# 11 200000        80.0 [2e+05,3e+05)              5.50             125. 
# 12 200000        50.2 [2e+05,3e+05)              5.50             125. 
# 13 750000        78.1 [7e+05,8e+05)             77.8               78.2
# 14 750000        77.9 [7e+05,8e+05)             77.8               78.2