При проведении экспериментов внутри субъектов, когда вы хотите подвергнуть каждого участника всем условиям, возможные проблемы могут возникнуть из-за эффектов порядка или переноса: порядок условий может влиять на ответы участников, например, из-за усталости или практики. Чтобы противостоять этому до некоторой степени, мы можем изменить порядок условий для каждого участника, записать его, а затем проанализировать его эффекты.

Полная противовесная балансировка потребует n! различных последовательностей упорядочивания, что очень быстро может стать непрактичным. Если у нас есть 4 условия или стимула, мы можем расположить их 24 различными способами. В таком случае количество участников должно быть кратно этому, так что 24, 48,… Это число растет в геометрической прогрессии.

Латинский квадрат - еще один способ расставить условия. Это матрица, которая упорядочивает n элементов в n последовательностях, поэтому с ней намного проще работать. Тем не менее, мы можем добиться большего с помощью чего-то, что называется Сбалансированный латинский квадрат. Эта версия оптимизирует баланс, так что каждый элемент появляется одинаковое количество раз после каждого элемента.

Так работает алгоритм. В таблице n x n вы заполняете первую строку с помощью 1, 2, n, 3, n-1, 4 и так на. Следующая строка просто добавляет 1 к каждой ячейке. Конечно, числа будут повторяться до n, поэтому n + 1 снова будет 1. Я понял, что это легко сделать с помощью операции по модулю: i% n + 1, поэтому для n = 6 7 преобразуется в 1. Для нечетных чисел мы должны включить некоторые дополнительные меры.

Я написал краткий код Python для вычисления этих последовательностей для произвольных чисел n. Вот код, и я объясню его. Он использует множество списков, которые являются красивым, хотя и немного трудным для чтения способом в Python для выражения этих вычислений.

Для n элементов мы хотим получить n последовательностей. Это самый внешний цикл, for i in range (n). Каждая из этих последовательностей будет содержать n элементов. Это внутренний цикл для j в диапазоне (n). Чтобы определить каждый элемент, мы чередуем (j% 2) между обратным отсчетом (j / 2) и обратным отсчетом (n-j / 2). Мы добавляем i, чтобы каждая строка была смещена на единицу по сравнению с предыдущей строкой. Наконец, мы используем оператор по модулю, чтобы «обернуть» n, как описано ранее. Мы также добавили 1, чтобы порядок начинался с 1, а не с 0, но в этом нет необходимости.

Для нечетного количества элементов этого недостаточно. Приходится повторять таблицу еще раз, чтобы добиться желаемого баланса. Вторая версия - это просто версия, перевернутая из первой таблицы. Этого также можно добиться с помощью малоизвестного понимания списков, как вы можете видеть в коде.

Чтобы проверить правильность кода, я прогнал его для разных n и сравнил с таблицами, опубликованными здесь.

Вот и все! Теперь мы можем продолжить проектирование нашего эксперимента.