R–从一个矩阵中随机抽样,使用分布表示每列中的零数–分层抽样。

我正试图从一个矩阵中随机抽样(b 但我希望所得的样本矩阵的每一列中的零的比例与另一个矩阵的零的比例相等 (a 下)。) 我正在尝试使用 sample() 函数来解决这个问题,但我并不满意。下面是一些可重复的代码,希望能解释我的问题。


EDIT: 我不想增加或编辑任何行,而是想用随机抽样的方式从 b 要做到使所得矩阵。b_sample 将会有一个近似于零的分布,以达到以下目的 a


set.seed(1234)
# matrix a is the matrix that holds the distribution of zeros I want to match
a <- matrix(as.integer(rexp(200, rate=.1)), ncol=20)
# matrix b is the matrix to be sampled from 
b <- matrix(as.integer(rexp(2000, rate=.1)), ncol=20)

a看起来像:

     [,1] [,2] [,3] [,4] [,5]
[1,]    6    0    6    1   22
[2,]   19    6    0   23   19
[3,]    8   22    8    5    0
[4,]   24   17   28    3    0

b看起来像:

      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    1   10    5    9
 [2,]   26    1    3    2    2
 [3,]    4    8    3    0    0
 [4,]    2   10   35    3   11
 [5,]    1    3   16    0    6
 [6,]    2    4    2   16    2
 [7,]    3   18   13    6   17
 [8,]    0    2    9    0   13
 [9,]    2   15    6   27   30
[10,]    1    2    7    9   15
[11,]   13    0    5    1    2
[12,]   18   12    9   27   33
[13,]    0   20    3   18    1
[14,]    5    7    7   16    4
[15,]    5    6    4    5    2
[16,]    0    7    5   10    7
[17,]    3   20    5   14   34
[18,]   28    0   10    5    8
[19,]   33    0    2    6   13
[20,]    7   28    0   11    8

我提取了每一列中的零的分布情况 a 采样时使用

dist<-apply(a,2, function(x) sum(x!=0)/length(x)) 
dist
[1] 1.00 0.75 0.75 1.00 0.50

然后,我继续尝试从 b 的行数。

b_sample<-b[sample(x=nrow(b),
                   size=4,
                   replace=F
                   )
            ,]

这个可以,但我要的是 b_sample 在每一列中,零的比例要与 a. 我曾试过这样做

b_sample<-b[sample(x=nrow(b),
                   size=4,
                   replace=F,
                   prob=dist
                   )
            ,]

但我得到一个错误。

Error in sample.int(x, size, replace, prob) : 
  incorrect number of probabilities

我不知道是我的格式不对还是 sample() 功能根本不是修正功能来使用。如果有任何帮助,将非常感谢!


编辑2:下面更新


我已经找到了一种方法,可以从 b 并保持结果中零的比例。b_sample 原样 b. 这不是我想得到的,我想让比例等于在。a 但它可能会让人更了解我想做什么。请看下面对上述例子的发展

首先我做了 b 到一个数据框架中,并对行进行索引,以利用 dplyrgroupby()

b_df<-as.data.frame(b)
b_df <- b_df %>%
  mutate(n = row_number()) %>% #create row number
  select(n, everything()) # put row number at the front of the dataset
b_df
    n V1 V2 V3 V4 V5
1   1 19  1 29  2  9
2   2  7 20  1  3  9
3   3  3 25  8  9 22
4   4  9  0 20  9  0
5   5  2 12 14  4  2
6   6 10 22  9  1  9
7   7  0  9 16  1  4
8   8  3  3 14 23  2
9   9  7  0  7  1  0
10 10  9  0 26  2  6
11 11  4 19  0  2  6
12 12  0  2  1  7  4
13 13 16 16 25  2  3
14 14  0  1  1  7  9
15 15  8 14  0  9  5
16 16  0 14  9  5  0
17 17 43 27 14  1  4
18 18  9  0 13  4  9
19 19  0  8  3  9 13
20 20 34 36  1  7 20

然后,我创建了一个二进制数据框,以指示每个单元格是否有一个0或一个值。

b_df_0[,-1]<-as.data.frame(lapply(b_df[,-1],function(x) x==0))
b_df_0
    n    V1    V2    V3    V4    V5
1   1 FALSE FALSE FALSE FALSE FALSE
2   2 FALSE FALSE FALSE FALSE FALSE
3   3 FALSE FALSE FALSE FALSE FALSE
4   4 FALSE  TRUE FALSE FALSE  TRUE
5   5 FALSE FALSE FALSE FALSE FALSE
6   6 FALSE FALSE FALSE FALSE FALSE
7   7  TRUE FALSE FALSE FALSE FALSE
8   8 FALSE FALSE FALSE FALSE FALSE
9   9 FALSE  TRUE FALSE FALSE  TRUE
10 10 FALSE  TRUE FALSE FALSE FALSE
11 11 FALSE FALSE  TRUE FALSE FALSE
12 12  TRUE FALSE FALSE FALSE FALSE
13 13 FALSE FALSE FALSE FALSE FALSE
14 14  TRUE FALSE FALSE FALSE FALSE
15 15 FALSE FALSE  TRUE FALSE FALSE
16 16  TRUE FALSE FALSE FALSE  TRUE
17 17 FALSE FALSE FALSE FALSE FALSE
18 18 FALSE  TRUE FALSE FALSE FALSE
19 19  TRUE FALSE FALSE FALSE FALSE
20 20 FALSE FALSE FALSE FALSE FALSE

然后我用 group_bysample_fracdplyr 取材 b 的样本数,以等于 a.

proportion <- nrow(a)/nrow(b)
sample <- b_df_0 %>%
  group_by(V1,V2,V3,V4,V5) %>% #any number of variables you wish to partition by proportionally
  sample_frac(proportion) # proportion of the original df you wish to sample

b_df[b_df$n %in% sample$n,]
#The above approach would work if you can get a proportions = b proportions
    n V1 V2 V3 V4 V5
2   2  7 20  1  3  9
19 19  0  8  3  9 13
20 20 34 36  1  7 20

然而,这种方法不是我想要的,因为比例是基于 b 当我想让他们基于 a. 任何关于如何做到这一点的帮助将是惊人的! 谢谢!我想从一个矩阵(如下图b)中随机抽样,但我希望所得的样本矩阵的每一列中零的比例等于另一个矩阵的零。

解决方案:

如果p是A的一列中0的比例,b_rows是B的行数。

例如B的第j列。

B[sample(1:b_rows,b_rows*p),j]=0。

给TA打赏
共{{data.count}}人
人已打赏
未分类

C++: 用自定义的哈希和等价函数扩展已经创建的C结构,使其可以在unordered_map中使用。

2022-9-13 1:17:35

未分类

无法用exoplayer解析方法getUserAgent()。

2022-9-13 1:17:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索