block.random()
库的 psych
是创建block-randomized实验设计的好工具,但是,编写的函数要求您在开始之前进行一些计算,并生成一个矩阵,仅包含实验因子水平的数字指数。
一个植物生长实验示例,包含您在开始进行实验设计时通常知道的信息:
您可以通过以下方式使用block.random:
> plan=block.random(n=90,c(fertilizer=3,sunlight=2))
> headtail(plan)
blocks fertilizer sunlight
S1 1 3 2
S2 1 2 1
S3 1 3 1
S4 1 1 1
... ... ... ...
S87 15 3 2
S88 15 2 1
S89 15 1 1
S90 15 1 2
好的,但有两个问题:
我宁愿拥有包含我的关卡名称的内容,我可以直接打印以供参考,也可以快速格式化为包含在报表中的表格。
我该如何做到这一点?
答案 0 :(得分:1)
使用block.random()
的简单包装函数,可以实现以上所有功能。
create.randomization.plan <- function(n.per.group, factors, seed=NULL){
factor.lengths <- sapply(factors,length)
if(!is.null(seed)){
set.seed(seed)
}
plan <- as.data.frame(block.random(n.per.group*prod(factor.lengths),
factor.lengths))
for(i in 1:length(factors)){
plan[,colnames(plan)==names(factors)[i]] <-
factor(plan[,colnames(plan)==names(factors)[i]])
levels(plan[,colnames(plan)==names(factors)[i]]) <- factors[[i]]
}
return(plan)
}
用法如下:
> factors <- list(fertilizer=c("5mL/day", "10mL/day", "20mL/day"),
+ sunlight=c("direct sun", "shade"))
>
> plan <- create.randomization.plan(15, factors)
> headtail(plan)
blocks fertilizer sunlight
S1 1 10mL/day shade
S2 1 20mL/day direct sun
S3 1 20mL/day shade
S4 1 5mL/day direct sun
... ... <NA> <NA>
S87 15 10mL/day shade
S88 15 5mL/day direct sun
S89 15 10mL/day direct sun
S90 15 20mL/day direct sun
您还可以设置种子以获得可重复性:create.randomization.plan(15, factors, seed=123)