在Hmisc::partition.matrix的输出上进行矢量化
我一直在尝试模拟一个二项式的过程,它发生在几个星期内,针对不同的池大小。我有7种不同的人才库规模,以及每周取得积极成果的可能性。我模拟了一个伯努利过程,每周给我一个固定数量的积极结果。我想使用在Hmisc::partition.matrix的输出上进行矢量化,r,hmisc,R,Hmisc,我一直在尝试模拟一个二项式的过程,它发生在几个星期内,针对不同的池大小。我有7种不同的人才库规模,以及每周取得积极成果的可能性。我模拟了一个伯努利过程,每周给我一个固定数量的积极结果。我想使用Hmisc中的partition.matrix函数将这些积极结果分配到一个池中,如下所示: library(Hmisc) set.seed(1) # vector of pool sizes pool_sizes <- c(10,15,25,35,40,45,50) # Vector of wee
Hmisc
中的partition.matrix
函数将这些积极结果分配到一个池中,如下所示:
library(Hmisc)
set.seed(1)
# vector of pool sizes
pool_sizes <- c(10,15,25,35,40,45,50)
# Vector of weekly probabilities
weekly_probabilities <- c(0.12,0.37,0.68,0.43,0.2)
# weekly bernoulli trials
pos_neg <- sapply(weekly_probabilities,function(x)rbinom(sum(pool_sizes),size = 1, p = x))
# Assigning outcomes to pools
pos_neg_pools <- partition.matrix(pos_neg,rowsep = pool_sizes,colsep = 5)
但我犯了这个错误:
Error in apply(x, 2, sum) : dim(X) must have a positive length
问题似乎是dim(pos_neg_pools[1])
和dim(pos_neg_pools[[1]])
是NULL
,并且pos_neg_pools
的每个元素只能作为pos neg_pools$`1``1
访问。我不知道如何对这个输出进行矢量化,我不想使用for
循环,如果我有几千个池,每个池都有52周的数据,这可能会很麻烦
我该怎么办?感谢您的帮助 您有一个列表列表,拆分矩阵始终位于第一个子元素下:
str(pos_neg_pools)
List of 7
$ 1:List of 1
..$ 1: int [1:10, 1:5] 0 0 0 1 0 1 1 0 0 0 ...
$ 2:List of 1
..$ 1: int [1:15, 1:5] 0 0 0 0 0 0 0 1 0 0 ...
$ 3:List of 1
..$ 1: int [1:25, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
$ 4:List of 1
..$ 1: int [1:35, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
$ 5:List of 1
..$ 1: int [1:40, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
$ 6:List of 1
..$ 1: int [1:45, 1:5] 0 0 0 0 0 0 0 0 0 1 ...
$ 7:List of 1
..$ 1: int [1:50, 1:5] 0 0 0 0 0 1 0 0 0 1 ...
这是每个矩阵的维数:
sapply(pos_neg_pools,function(x)dim(x[[1]]))
1 2 3 4 5 6 7
[1,] 10 15 25 35 40 45 50
[2,] 5 5 5 5 5 5 5
在发布的代码中,您正在列表上应用函数。您需要通过以下方式达到一个级别:
sapply(pos_neg_pools,function(x)colSums(x[[1]]))
1 2 3 4 5 6 7
[1,] 3 2 0 3 4 4 9
[2,] 2 4 7 6 17 16 23
[3,] 9 13 14 24 25 29 34
[4,] 5 5 12 13 18 17 21
[5,] 4 1 5 8 8 10 10
或:
要避免出现这种奇怪的列表,因为您不需要拆分列,请执行以下操作:
X = partition.matrix(pos_neg,rowsep = pool_sizes)
sapply(X,colSums)
1 2 3 4 5 6 7
[1,] 3 2 0 3 4 4 9
[2,] 2 4 7 6 17 16 23
[3,] 9 13 14 24 25 29 34
[4,] 5 5 12 13 18 17 21
[5,] 4 1 5 8 8 10 10
您有一个列表列表,拆分矩阵始终位于第一个子元素下:
str(pos_neg_pools)
List of 7
$ 1:List of 1
..$ 1: int [1:10, 1:5] 0 0 0 1 0 1 1 0 0 0 ...
$ 2:List of 1
..$ 1: int [1:15, 1:5] 0 0 0 0 0 0 0 1 0 0 ...
$ 3:List of 1
..$ 1: int [1:25, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
$ 4:List of 1
..$ 1: int [1:35, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
$ 5:List of 1
..$ 1: int [1:40, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
$ 6:List of 1
..$ 1: int [1:45, 1:5] 0 0 0 0 0 0 0 0 0 1 ...
$ 7:List of 1
..$ 1: int [1:50, 1:5] 0 0 0 0 0 1 0 0 0 1 ...
这是每个矩阵的维数:
sapply(pos_neg_pools,function(x)dim(x[[1]]))
1 2 3 4 5 6 7
[1,] 10 15 25 35 40 45 50
[2,] 5 5 5 5 5 5 5
在发布的代码中,您正在列表上应用函数。您需要通过以下方式达到一个级别:
sapply(pos_neg_pools,function(x)colSums(x[[1]]))
1 2 3 4 5 6 7
[1,] 3 2 0 3 4 4 9
[2,] 2 4 7 6 17 16 23
[3,] 9 13 14 24 25 29 34
[4,] 5 5 12 13 18 17 21
[5,] 4 1 5 8 8 10 10
或:
要避免出现这种奇怪的列表,因为您不需要拆分列,请执行以下操作:
X = partition.matrix(pos_neg,rowsep = pool_sizes)
sapply(X,colSums)
1 2 3 4 5 6 7
[1,] 3 2 0 3 4 4 9
[2,] 2 4 7 6 17 16 23
[3,] 9 13 14 24 25 29 34
[4,] 5 5 12 13 18 17 21
[5,] 4 1 5 8 8 10 10