从R中的向量创建'可用'bins

问题描述 投票:1回答:1

我有一个带有整数的数字矢量,其中:

  1. 我想转换为“垃圾箱”。
  2. 我希望将这些垃圾箱用作样本帧,然后可以从其再次统一采样。

到目前为止,我都可以使用findInterval来做,但是我正在寻找一种使用cut的方法。

让我们考虑一个带有整数的随机向量,该向量将以相等大小的长度2的间隔进行分割:

df = sample(1:100,10)
df
[1] 81 11 38 95 45 14 10 61 96 88

使用findInterval,我得到了垃圾箱和大概的采样方式:

breaks = seq(1,max(df+1),by=10)
b <- findInterval(df, breaks)
b
[1]  9  2  4 10  5  2  1  7 10  9
# If b is equal to 1 or 100, then use ifelse() to prevent leaking outside [1,100]
sam <- round(runif(10,ifelse(b==1,10*b-9,10*b-10),ifelse(b==10,10*b,10*b+10))) 
sam
[1] 85 14 39 94 50 16  7 63 93 85

使用cut,我得到了间隔:

breaks = seq(1,max(df+1),by=10)
cut(df,breaks,right=TRUE)
[1] (71,81] (1,11]  (31,41] <NA>    (41,51] (11,21] (1,11]  (51,61] <NA>    (81,91] Levels: (1,11] (11,21] (21,31] (31,41] (41,51] (51,61] (61,71] (71,81] (81,91]

但是我不知道如何使用这些值作为采样间隔。

如果有其他方法,我想知道!

r random
1个回答
2
投票

好问题!我会给你一种完全不同的方法。

因此,基本上,您要执行Latin Hypercube采样,即对[0,100]的每个bin在间隔10中进行分层均匀采样。

为此,下载lhs软件包并使用randomLHS功能执行分层采样会更容易。

[第一步:根据需要,每10个四分位数(层)生成均匀绘制。在此示例中,让我们做5次:

library(lhs)
randomLHS(10, 5)

> X
            [,1]       [,2]       [,3]       [,4]       [,5]
 [1,] 0.92154144 0.22185959 0.49953326 0.66248165 0.79035832
 [2,] 0.47571700 0.05894016 0.55883326 0.34875162 0.98831829
 [3,] 0.57738486 0.64525528 0.04955733 0.50939147 0.46297294
 [4,] 0.17578838 0.83843074 0.27138703 0.87421301 0.16401042
 [5,] 0.03850768 0.40746004 0.69518073 0.23487653 0.55537945
 [6,] 0.83942905 0.52957416 0.84952231 0.14031915 0.84956654
 [7,] 0.22802502 0.79911728 0.76789194 0.09788194 0.08667802
 [8,] 0.61821268 0.93088726 0.30789950 0.95831993 0.36903120
 [9,] 0.70391230 0.11445154 0.97976851 0.42027836 0.61097786
[10,] 0.31385709 0.33557430 0.18389684 0.70124986 0.27601550

[第二步骤] >>:尽管X的输出已分层,但这些列仍未排序。因此,当我们显示最终的分层抽奖时,将对其进行排序。

Y <- apply(X,2, function(x) sort(round(x*100)))
> Y
      [,1] [,2] [,3] [,4] [,5]
 [1,]    4    6    5   10    9
 [2,]   18   11   18   14   16
 [3,]   23   22   27   23   28
 [4,]   31   34   31   35   37
 [5,]   48   41   50   42   46
 [6,]   58   53   56   51   56
 [7,]   62   65   70   66   61
 [8,]   70   80   77   70   79
 [9,]   84   84   85   87   85
[10,]   92   93   98   96   99

NB

:为了方便起见,我进行了四舍五入,但如果希望将非整数绘制作为输出,则无需调用round函数。]
© www.soinside.com 2019 - 2024. All rights reserved.