gpt4 book ai didi

r - 使用 permute 包计算分块设计中的所有排列

转载 作者:行者123 更新时间:2023-12-02 03:33:55 27 4
gpt4 key购买 nike

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

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

四位评委对 3 款 Wine 进行了排名,现在我想计算每位评委数据内的每一种可能的排列。我预计会看到 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)

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

最佳答案

@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() 生成排列索引,但在内部它是逐 block 工作的。在 @Joris 报告的案例中,每个 block 都有 3 个观察值,因此有 6 个索引 1:3 排列。创建这些排列索引后,代码应该使用它们来索引每个 block 的原始数据的行索引。 allPerms()每种 可能的排列类型组合执行此操作,除了 block 内的简单随机排列情况。 r2838 修复了此问题。

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

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

第二个错误已通过 r2838 修复和 r2839在 R-Forge 上的 SVN 源代码中。

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

关于r - 使用 permute 包计算分块设计中的所有排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21312200/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com