私は2つのディストリビューションの等価性を決定したい研究プロジェクトに取り組んでいます。私は現在、Mann-Whitney Test for Equivalenceを使用しています。実行しているコードは、Stefan Wellek(2010)の「等価性と非劣性の統計的仮説検定」の本で提供されています。私のデータを実行する前に、私は同じ平均と標準偏差を持つランダムな正規分布でこのコードをテストしています。私の問題は、3つのネストされたforループがあり、より大きなディストリビューションサイズ(以下の例のように)を実行するとコードが永遠に実行されることです。一度だけ実行しなければならないのであれば、それほど問題はありませんが、私はシミュレーションテストを行い、パワーカーブを作成していますので、このコードを繰り返し実行する必要があります(約10,000)。現時点では、配布サイズをどのように変更するかによって、10,000回の繰り返しを実行するには数日かかります。Rでネストされたforループをより効率的に作る
これのパフォーマンスを向上させるための助けがあれば、大歓迎です。
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