3

我想计算适合弗里德曼检验的阻塞设计的所有排列。考虑以下示例:

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 次,其中 3 个值的 6 种可能排列:

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

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

4

1 回答 1

2

@Joris 提供的示例确定allPerms()了当前示例集或单元测试未发现的两个错误(也将很快修复!)。

第一个问题是一个晦涩的错误,我需要一些时间来考虑修复. 我现在也为这个错误实施了修复。permute 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
于 2014-01-23T16:15:05.077 回答