如何生成具有命名因子水平的block.random实验设计

时间:2013-01-30 21:19:52

标签: r

来自block.random()库的

psych是创建block-randomized实验设计的好工具,但是,编写的函数要求您在开始之前进行一些计算,并生成一个矩阵,仅包含实验因子水平的数字指数。

一个植物生长实验示例,包含您在开始进行实验设计时通常知道的信息:

  • 两个实验因素,比如肥料和阳光
  • 三级肥料(5mL /天,10mL /天,20mL /天)
  • 两层阳光(直射阳光,阴影)
  • 您的功效分析告诉您每组需要15个样本

您可以通过以下方式使用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

好的,但有两个问题:

  • 你必须意识到你需要90个样本才能使用这个功能(每组15个,肥料3个级别,2个阳光级别)这是一个很难解决的问题
  • 您不一定能直接使用输出,因为您必须将因子的数值水平(肥料1:3,阳光1:2)与实际水平(5mL /天,10mL / 10)相关联。一天,肥料20毫升/天)和(阳光直射,阳光照射)

我宁愿拥有包含我的关卡名称的内容,我可以直接打印以供参考,也可以快速格式化为包含在报表中的表格。

我该如何做到这一点?

1 个答案:

答案 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)