![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
Группа: Пользователи Сообщений: 262 Регистрация: 1.06.2022 Из: Донецк Пользователь №: 39632 ![]() |
Как посредством R случайным образом разделить ряд чисел на две группы заданных объемов с перебором всех возможных вариантов? Просто перемешивать исходный ряд и разделять в произвольной точке оказалось плохой идеей, так как порождаются в том числе и лишние варианты, когда состав обеих групп одинаков, но последовательность внутри них разная, например в итерации i в группе А оказываются 1, 2, 3, в группе Б - 4, 5, 6, а в итерации i+1 - соответственно 2, 1, 3 и 4, 5, 6. Если мы считаем статистику, инвариантную к порядку чисел, то эти паразитические псевдовыборки никак не сказываются на выводе, но сильно жрут вычислительные ресурсы. В общем, надо чтобы в каждой итерации группа А менялась с группой Б парой чисел.
Беглый поиск готовых решений ничего не дал. Например, в широко известном пакете permute, кажется, реализованы все мыслимые планы перестановок, кроме нужного мне. Или же я просто не допер, как его на это запрограммировать. |
|
![]() |
![]() |
![]() |
![]()
Сообщение
#2
|
|
Группа: Пользователи Сообщений: 262 Регистрация: 1.06.2022 Из: Донецк Пользователь №: 39632 ![]() |
Итак, другая история: это работает в тестировании гипотез! Вот код из предыдущего поста, слегка допиленный для задачи проверки значимости разности средних:
Код recombmeandifftest<-function(x, y) { k<-max(c(length(x), length(y))) xy<-c(x, y) n<-length(xy) id<-1:n combmat<-combn(id, k) recmeandiff<-function(X, xy) { x<-xy[X] y<-xy[-X] meandiff<-abs(mean(x)-mean(y)) return(meandiff) } diffobs<-abs(mean(x)-mean(y)) diffsim<-apply(combmat[,2:ncol(combmat)], 2, recmeandiff, xy=xy) res<-as.numeric(round(diffsim, digits=6)>=round(diffobs, digits=6)) p<-(1+sum(res))/(ncol(combmat)) return(list(diffobs, p)) } Проверим, на синтетических данных, немного большего размера, чем в прошлый раз, дабы не упереться в техническое препятствие (С)$100: Код x<-rnorm(10) y<-rnorm(10, 3) recombmeandifftest(x, y) В выдаче первый элемент списка - наблюдаемый модуль разности средних (т. е. без перестановок), в торой - p-значение. Сравним с тем что выдает критерий рандомизации компонент Фишера-Питмана, реaлизованный в пакете coin. Для этого придется преобразовать входные данные в табличную форму (другой их величество не принимают): Код xy<-data.frame(value=c(x, y), group=factor(c(rep("x", 10), rep("y", 10)))) oneway_test(value~group, data=xy, distribution="exact") Я не смог наяндексить, что за статистику использует этот тест, и буду рад пояснению, что такое Z. С разностью средних не совпадает. Однако обратите внимание на практически идеальное совпадение p-значений! Напрашивается вывод: перестановки при полной рандомизации, которые я изначально посчитал лишними, таковыми и оказались. То есть, если объемы сравниваемых выборок равны между собой и равны n, то требуемое число перестановок, включая тождественную, - не вселяющий ужас (n*2)!, а всего лишь (n*2)!/(n!)^2, что гораздо веселее. С неравными выборками пока еще не разобрался. |
|
![]() |
![]() |
![]() ![]() |