目标:我想为每个组(hrzn
)生成分组的百分位数
我有以下数据
# A tibble: 3,500 x 3
hrzn parameter density
<dbl> <dbl> <dbl>
1 1 0.0183 0.00914
2 1 0.0185 0.00905
3 1 0.0187 0.00897
4 1 0.0189 0.00888
5 1 0.0191 0.00880
6 1 0.0193 0.00872
7 1 0.0194 0.00864
8 1 0.0196 0.00855
9 1 0.0198 0.00847
10 1 0.0200 0.00839
hrzn
是组,parameter
是参数空间的网格,density
是parameter
列中值的密度。
我想通过hrzn
生成统计数据百分位数10到90 x 10的摘要。我试图保持这种计算效率。我知道我可以使用密度作为权重对参数进行采样,但是我很好奇,有一种无需进行采样就可以从密度生成百分位数的更快方法。
可以通过以下方式获得数据
df <- readr::read_csv("https://raw.githubusercontent.com/alexhallam/density_data/master/data.csv")
当我从您的csv加载数据时,这10个组中的每个参数和密度值都相同:
df
#># A tibble: 3,500 x 3
#> hrzn parameter density
#> <int> <dbl> <dbl>
#> 1 1 0.0183 0.00914
#> 2 1 0.0185 0.00905
#> 3 1 0.0187 0.00897
#> 4 1 0.0189 0.00888
#> 5 1 0.0191 0.00880
#> 6 1 0.0193 0.00872
#> 7 1 0.0194 0.00864
#> 8 1 0.0196 0.00855
#> 9 1 0.0198 0.00847
#>10 1 0.0200 0.00839
#># ... with 3,490 more rows
sapply(1:10, function(x) all(df$parameter[df$hrzn == x] == df$parameter[df$hrzn == 1]))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
sapply(1:10, function(x) all(df$density[df$hrzn == x] == df$density[df$hrzn == 1]))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
我不确定这是否是一个错误,但是很明显,如果您担心计算的话,只需在单个组中进行操作,就可以将所有组中的所有操作快十倍。] >
无论如何,要获得每个hrzn的第10和90个百分位数,您只需要查看累积分布函数上哪个参数与0.1和0.9相邻即可。让我们概括一下,对所有组进行计算,以防数据出现问题或您想用其他数据重复它:
df %>%
mutate(hrzn = factor(hrzn)) %>%
group_by(hrzn) %>%
summarise(centile_10 = parameter[which(cumsum(density) > .1)[1]],
centile_90 = parameter[which(cumsum(density) > .9)[1]] )
#># A tibble: 5 x 3
#> hrzn centile_10 centile_90
#> <fct> <dbl> <dbl>
#>1 1 0.0204 0.200
#>2 2 0.0204 0.200
#>3 3 0.0204 0.200
#>4 4 0.0204 0.200
#>5 5 0.0204 0.200