【问题标题】:Use of permute package to calculate all permutations in a blocked design使用 permute 包计算阻塞设计中的所有排列
【发布时间】:2014-02-14 05:43:48
【问题描述】:

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

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)

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

【问题讨论】:

  • 代码中很可能存在我的示例和测试没有发现的错误。让我看看,我会回来报告的。我想我知道问题出在哪里......
  • 你就是那个男人!特别是因为你让我免于感到完全愚蠢:-)
  • 好的,现在已经修复了块错误。查看更新的答案。
  • 作为后续,我还修复了失败的 Plots 版本,并相应地更新了我的答案。 permute 0.8-3 版现在可以按预期工作。已经为这两个添加了测试用例(并且每个块/图的样本数量不均匀)已添加以避免将来的回归。

标签: r permute experimental-design


【解决方案1】:

@Joris 提供的示例确定了 allPerms() 中的两个错误,这些错误没有被当前的示例集或单元测试发现(很快也会修复!)。

第一个问题是一个不起眼的错误,我需要一些时间来考虑修复。我现在也为这个错误实施了修复。 permute 0.8-3 版现在可以愉快地处理@joris 问题的Plots 版本:

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

【讨论】:

  • 再次感谢您的快速回复。效果很好!
  • 我还要感谢@JorisMeys。第一个问题与我在 r2839 中解决的问题有关,涉及一些基本上(而且很糟糕 - 正如你发现的那样)做了cbindAllPerms() 现在所做的事情,但是以一种非常流行的方式。块问题的解决方案让我找到了这个新的解决方案,所以我现在也应该能够很容易地解决第一个错误了! Stack Overflow FTW!
猜你喜欢
  • 2019-08-04
  • 2011-01-11
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多