使用permute包来计算被阻止设计中的所有排列

时间:2014-01-23 15:16:56

标签: r permute experimental-design

我想计算适合Friedman测试的阻塞设计的所有排列。请考虑以下示例:

thedata <- data.frame(
  score = c(replicate(4,sample(1:3))),
  judge = rep(1:4,each=3),
  wine  = rep.int(1:3,4)  
  )

四位评委评出了3种葡萄酒,现在我想计算每位评判员在数据中的每一种可能的排列。我希望看到1,296种排列,也可以通过以下方式给出:

require(permute)
CTRL <- how(within=Within("free"),
            plots=Plots(strata=factor(thedata$judge)),
            complete=TRUE,maxperm=1e9)
numPerms(12,CTRL)

但是,allPerms(12,control=CTRL)会产生以下错误:

Error in (function (..., deparse.level = 1)  : 
  number of rows of matrices must match (see arg 2)

我尝试使用block参数,但它只返回一个矩阵,该矩阵重复4次矩阵,其中包含6个可能的3个值的排列:

CTRL <- how(within=Within("free"),
            blocks=factor(thedata$judge),
            complete=TRUE,maxperm=1e9)
allPerms(12,control=CTRL)

重要说明: 我有一个自定义函数来获取结果,使用来自expand.grid()包的permn()combinat的改编。我对我误解permute包的地方感兴趣,而不是我自己如何计算所有这些排列。

1 个答案:

答案 0 :(得分:2)

@Joris提供的示例确定了allPerms()中的两个错误,这些错误未被当前的示例或单元测试所取代(也将很快修复!)。

第一个问题是一个模糊的错误,我需要一些时间来考虑修复。我现在已经为这个bug实现了修复。 置换版本0.8-3现在很乐意处理@ Plots版本的@joris'问题:

R> p <- allPerms(12,control=CTRL)
R> dim(p)
[1] 1295   12
R> head(p)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    2    3    4    5    6    7    8    9    10    12    11
[2,]    1    2    3    4    5    6    7    8    9    11    10    12
[3,]    1    2    3    4    5    6    7    8    9    11    12    10
[4,]    1    2    3    4    5    6    7    8    9    12    10    11
[5,]    1    2    3    4    5    6    7    8    9    12    11    10
[6,]    1    2    3    4    5    6    7    9    8    10    11    12
R> packageVersion("permute")
[1] ‘0.8.3’

第二是疏忽。 allPerms()生成排列索引,但在内部它逐块工作。在@Joris报道的情况下,每个块有3个观察值,因此有6个索引1:3的排列。一旦创建了这些排列索引,代码就应该使用它们来索引每个块的原始数据的行索引。 allPerms()正在为每个可以想到的排列类型的组合执行此操作,除了块内的简单随机排列情况。 r2838 解决了这个问题。

allPerms()也没有复制每个块内置换矩阵以匹配其他块内置换矩阵中的每个行组合。这需要像expand.grid()这样的操作,但需要在块内置换矩阵中。 r2839 修复了这个特殊问题。

allPerms()以这种方式工作,因为它不希望块内样本在原始数据系列中连续定位。

第二个错误是通过R-Forge的SVN来源中的r2838r2839修复的。

R> require(permute)
Loading required package: permute
R> CTRL <- how(within=Within("free"),
+             blocks=factor(thedata$judge),
+             complete=TRUE,maxperm=1e9,
+             observed = TRUE)
R> numPerms(12,CTRL)
[1] 1296
R> tmp <- allPerms(12,control=CTRL)
R> dim(tmp)
[1] 1296   12
R> head(tmp)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    2    3    4    5    6    7    8    9    10    11    12
[2,]    1    2    3    4    5    6    7    8    9    10    12    11
[3,]    1    2    3    4    5    6    7    8    9    11    10    12
[4,]    1    2    3    4    5    6    7    8    9    11    12    10
[5,]    1    2    3    4    5    6    7    8    9    12    10    11
[6,]    1    2    3    4    5    6    7    8    9    12    11    10
R> tail(tmp)
        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1291,]    3    2    1    6    5    4    9    8    7    10    11    12
[1292,]    3    2    1    6    5    4    9    8    7    10    12    11
[1293,]    3    2    1    6    5    4    9    8    7    11    10    12
[1294,]    3    2    1    6    5    4    9    8    7    11    12    10
[1295,]    3    2    1    6    5    4    9    8    7    12    10    11
[1296,]    3    2    1    6    5    4    9    8    7    12    11    10