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
我有大量 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