答案是,这对于 46 位评估者来说是不可能的:您需要 48 位评估者进行 12 次评估,以涵盖您需要的 10 * 24 * 24 或 5760 个样本。但是,有了这个警告,就有可能在所需的约束范围内获得您想要的所有样本。代码本身很短:
mod24 <- function(x) (x + 0:11 - 1) %% 24 + 1
df <- data.frame(picture = rep(c(rep(1:12, 24), rep(13:24, 24)), 10),
label = rep(do.call("c", lapply(1:24, mod24)), 20),
rater = rep(c(rep(1:48, each = 12)), 10) + rep(0:9 * 48, each = 576))
然而,这需要相当多的解释。
你可以让你的问题更容易一点只组合一次,每个只使用 12 个评级。因此,您可以专注于一组 48 人将如何执行此任务,以准确涵盖所有 576 种可能性。
另外需要注意的是,由于每个人都必须选择 12 幅画,因此您可以进一步简化,将 48 人组分成两组,每组 24 人,获得前 12 幅或后 12 幅画。这样,您就可以保证每个评估者不会有任何重复的绘画。
现在您需要做的就是确保每幅画的每个标签都只指定一次。您可以通过给第一个参与者的绘画标签 1:12,然后是第二个参与者的绘画标签 2:13 等,直到您到达 13:24,之后标签变为 c(14:24, 1),然后是 c(15:24, 1:2) 等。这个确保在画作 1:12 的组中,每幅画的每个标签都分配一次且仅一次。现在对绘画 13:24 做同样的事情。您将有 48 个人,每个人有 12 个评分,一次涵盖所有可能的组合。
对每组 48 人做同样的事情,每个独特的图片/标签对将有 10 个评分,每个评分者将给出 12 个评分,并且没有评分者会对同一幅画或标签进行两次评分。
回到我们的代码,我们可以看到 df 包含 5760 个样本:
nrow(df)
#> [1] 5760
它有576个独特的图片和标签组合,每个重复10次:
table(df$picture, df$label)
#>
#> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#> 1 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 2 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 3 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 4 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 5 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 6 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 7 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 8 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 13 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 14 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 15 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 16 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 17 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 18 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 19 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 20 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 21 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 22 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 23 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
#> 24 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
480 位评分者中的每一位都有 12 对要评分
table(table(df$rater))
#> 12
#> 480
所有这些都是独一无二的:
table(sapply(split(df, df$rater), function(x) nrow(unique(x))))
#> 12
#> 480
编辑
OP 担心图片组不断同时出现可能会引入偏差。解决方法是将图片 1:12 组中的第一人和 13:24 组中的第一人配对,并允许他们随机交易他们的一些分配。他们的图片不会重复,因为他们拥有的图片没有重叠,他们的标签也不会重复,因为他们总是交换相同的标签:
swaps <- do.call(c, lapply(1:10, function(x) c(rbinom(24 * 12, 1, 0.5), rep(0, 24 * 12))))
swap_out <- df[swaps == 1, ]
df[swaps == 1, ] <- df[which(swaps == 1) + 24 * 12, ]
df[which(swaps == 1) + 24 * 12, ] <- swap_out
这个新的数据框仍然符合所有规范。