数据框或分位数矩阵

data frame or matrix of quantiles

我使用以下代码获取 x 的分位数(25%、50%、75% 和 99%)并复制 100 次。

x<-c(1,2,3,5,4,5,6,7,8,5,4,3,2)
sample.boot=numeric()

for (i in 1:100){
       sample.boot[i]<-quantile(sample(x,replace = T),c(0.25,0.50,0.75,0.99))
}
sample.boot

这没有给出所需的输出。我希望将所有四个分位数复制 100 次并存储为数据框或矩阵,如下所示。

4 5 5 7
2 4 6 7
.......
.......
3 5 5 6
t(replicate(100, quantile(sample(x,replace = T),c(0.25,0.50,0.75,0.99))))
#        25% 50% 75%  99%
#   [1,]   3   4   5 7.64
#   [2,]   5   5   5 7.00
#   [3,]   2   5   5 7.88
#   [4,]   2   4   5 7.88
#   [5,]   4   5   7 7.88
#   [6,]   4   4   7 7.88
#   [7,]   3   4   5 7.00
#   [8,]   2   4   5 7.00
#   [9,]   4   5   5 7.76
#  [10,]   3   4   5 7.64

内部 replicate 使用 sapply 并以一种使此类重复操作有效的方式进行。第一个参数接受一个整数值,表示第二个参数应重复的次数。

整个函数用t(..)包裹起来。这会将分位数的输出排列为列而不是行。

另一种选择是 rowQuantileslibrary(matrixStats) 我们 sample 一次长度等于 length(x)*100 并将 vector 转换为 matrix 尺寸 100*length(x)

library(matrixStats)
m1 <- matrix(sample(x, 100*length(x), replace=TRUE), nrow=100, byrow=TRUE)
rowQuantiles(m1, probs=c(0.25,0.50,0.75,0.99))

检查我们是否得到与replicate

相同的输出
set.seed(24)
r1 <- t(replicate(100, quantile(sample(x,replace = T),c(0.25,0.50,0.75,0.99))))
set.seed(24)
m1 <- matrix(sample(x, 100*length(x), replace=TRUE), nrow=100, byrow=TRUE) 
r2 <- rowQuantiles(m1, probs=c(0.25,0.50,0.75,0.99))
identical(r1, r2)
#[1] TRUE

或者我们获取 'x' 的 sample 与前面的情况一样指定长度,使用 rep 创建一个分组变量,然后按组使用标准聚合来获取quantile。这里我们可以使用data.table的方式。

library(data.table)
d1 <-data.table(V1=sample(x, 100*length(x), replace=TRUE), 
                V2=rep(1:100,each=length(x)))[, 
      as.list(quantile(V1, probs=c(0.25, 0.5, 0.75,0.99))), by = V2]