我想使用 R v.4.0.3 和 blockrand 包设计一项随机临床试验。 以下是我的代码:
library(blockrand)
library(writexl)
library(openxlsx)
set.seed(101)
Mos1<-blockrand(n=295, id.prefix= 'Mos -', block.prefix='B', block.sizes =1:2, stratum='XX-Y1')
set.seed(10)
Mos2<-blockrand(n=295, id.prefix= 'Mos -', block.prefix='B', block.sizes =1:2, stratum='XX-Y2')
set.seed(5)
Mos3<-blockrand(n=295, id.prefix= 'Mos -', block.prefix='B', block.sizes =1:2, stratum='XX-Y3')
set.seed(70)
Mos4<-blockrand(n=295, id.prefix= 'Mos -', block.prefix='B', block.sizes =1:2, stratum='NONXX-Y1')
set.seed(43)
Mos5<-blockrand(n=295, id.prefix= 'Mos -', block.prefix='B', block.sizes =1:2, stratum='NONXX-Y2')
set.seed(87)
Mos6<-blockrand(n=295, id.prefix= 'Mos -', block.prefix='B', block.sizes =1:2, stratum='NONXX-Y3')
dataset_names <- list('XX-Y1' = Mos1, 'XX-Y2' = Mos2,
'XX-Y3' = Mos3, 'NONXX-Y1' = Mos4,
'NONXX-Y2' = Mos5,'NONXX-Y3' = Mos6)
正如你所看到的,函数中的 block.size 被定义为“1:2”,并且由于治疗组的数量是 2(没有写,这是默认的),所以这段代码产生的实际块大小为 2 和4(相乘)。 但我希望生成的块大小为 3 和 6,而组数仍为 2。这意味着,例如在 3 个块中,我们将有两个 A 组和一个 B 组(总计 = 3)。 但我不知道这是如何实现的,因为当我设置“block.size=3:1.5”时,生成的块大小是 6 和 4。而且它永远不会变成 6 和 3。 有人可以帮忙吗?
一种方法:
library(blockrand)
创建一个查找向量,将
stratum
名称与要生成的块项的名称相关联:
stratum_lookup <- setNames(
c(paste0('XX-Y', 1:3), paste0('NONXX-Y', 1:3)),
paste0('Mos', 1:6)
)
## > stratum_lookup
## Mos1 Mos2 Mos3 Mos4 Mos5 Mos6
## "XX-Y1" "XX-Y2" "XX-Y3" "NONXX-Y1" "NONXX-Y2" "NONXX-Y3"
Map
根据您的规格创建的块的未来项目名称:block_collection <-
names(stratum_lookup) |>
Map(f = \(object_name){blockrand(n = 295,
num.levels = 2,
block.sizes = c(3, 6), ## (1)
block.prefix = 'B',
id.prefix = 'Mos-',
stratum = stratum_lookup[object_name] ## (2)
)
})
3:6
将返回)block_collection
是随机块设计的列表。选择这样的一个:
block_collection[['Mos1']]
## > block_collection[['Mos1']]
## id stratum block.id block.size treatment
## 1 Mos-01 XX-Y1 B1 12 B
## 2 Mos-02 XX-Y1 B1 12 B
## 3 Mos-03 XX-Y1 B1 12 A
## 4 Mos-04 XX-Y1 B1 12 A
## 5 Mos-05 XX-Y1 B1 12 A
## ...
您可以将列表项作为单独的对象移动到工作区,如下所示:
list2env(block_collection)
但是,这只会让您的工作空间变得混乱,而没有明显的好处。例如,要将每个块导出为电子表格,请将必要的语句包装在
Map
中,如上所述。