Я работаю над исследовательским проектом, где я хочу определить эквивалентность двух распределений. В настоящее время я использую тест Mann-Whitney для эквивалентности, а код, который я запускаю (ниже), был предоставлен в книге «Тестирование статистических гипотез эквивалентности и неинфекции» Стефана Веллека (Stefan Wellek, 2010). Перед запуском моих данных я тестирую этот код со случайными нормальными распределениями, которые имеют одинаковое среднее и стандартное отклонение. Моя проблема заключается в том, что существует три вложенных цикла и при работе с большими размерами распределений (как в примере ниже) код выполняется навсегда для запуска. Если бы мне только пришлось запускать его один раз, это не было бы такой проблемой, но я выполняю симуляционный тест и создаю кривые мощности, поэтому мне нужно запустить много итераций этого кода (около 10 000). На данный момент, в зависимости от того, как я изменяю размеры распределения, для запуска 10 000 итераций требуется несколько дней.Создание вложенных циклов в R более эффективно
Любая помощь, чтобы повысить производительность этого, была бы весьма признательна.
x <- rnorm(n=125, m=3, sd=1)
y <- rnorm(n=500, m=3, sd=1)
alpha <- 0.05
m <- length(x)
n <- length(y)
eps1_ <- 0.2 #0.1382 default
eps2_ <- 0.2 #0.2602 default
eqctr <- 0.5 + (eps2_-eps1_)/2
eqleng <- eps1_ + eps2_
wxy <- 0
pihxxy <- 0
pihxyy <- 0
for (i in 1:m)
for (j in 1:n)
wxy <- wxy + trunc(0.5*(sign(x[i] - y[j]) + 1))
for (i in 1:m)
for (j1 in 1:(n-1))
for (j2 in (j1+1):n)
pihxyy <- pihxyy + trunc(0.5*(sign(x[i] - max(y[j1],y[j2])) + 1))
for (i1 in 1:(m-1))
for (i2 in (i1+1):m)
for (j in 1:n)
pihxxy <- pihxxy + trunc(0.5*(sign(min(x[i1],x[i2]) - y[j]) + 1))
wxy <- wxy/(m*n)
pihxxy <- pihxxy*2/(m*(m-1)*n)
pihxyy <- pihxyy*2/(n*(n-1)*m)
sigmah <- sqrt((wxy-(m+n-1)*wxy**2+(m-1)*pihxxy+(n-1)*pihxyy)/(m*n))
crit <- sqrt(qchisq(alpha,1,(eqleng/2/sigmah)**2))
if (abs((wxy-eqctr)/sigmah) >= crit) rej <- 1
if (abs((wxy-eqctr)/sigmah) < crit) rej <- 0
if (is.na(sigmah) || is.na(crit)) rej <- 1
MW_Decision <- rej
cat(" ALPHA =",alpha," M =",m," N =",n," EPS1_ =",eps1_," EPS2_ =",eps2_,
"\n","WXY =",wxy," SIGMAH =",sigmah," CRIT =",crit," REJ=",MW_Decision)
Только, чтобы помочь нам в области, есть ли какие-либо строки, в частности, вы можете указать, что знаете, что долгое время? – giraffehere
Кроме того, возможно, некоторые из функций 'apply' могут помочь. Возможно, упаковка вашего выражения pihxyy в 'lapply' или' sapply' может ускорить его. – giraffehere
Не могли бы вы использовать встроенную функцию wilcox.test? – Dave2e