【发布时间】:2016-05-11 04:10:03
【问题描述】:
我正在从事一个研究项目,我想确定两个分布的等价性。我目前正在使用 Mann-Whitney Test for Equivalence,我正在运行的代码(如下)由 Stefan Wellek(2010 年)的《Testing Statistical Hypotheses of Equivalence and Noninferiority》一书提供。在运行我的数据之前,我正在使用具有相同均值和标准差的随机正态分布测试此代码。我的问题是有三个嵌套的 for 循环,当运行较大的分布大小时(如下例所示),代码需要永远运行。如果我只需要运行一次就不会出现这样的问题,但是我正在进行模拟测试并创建功率曲线,所以我需要运行此代码的多次迭代(大约 10,000 次)。目前,根据我如何更改分布大小,运行 10,000 次迭代需要几天时间。
任何有助于提高性能的方法将不胜感激。
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)
【问题讨论】:
-
只是为了帮助我们确定范围,有没有什么特别是你可以指出你知道需要很长时间的行?
-
此外,
apply的某些功能可能会有所帮助。也许将您的 pihxyy 表达式包装在lapply或sapply中可能会加快速度。 -
你可以使用内置的 wilcox.test 函数吗?
-
后两个嵌套 for 循环是问题......第一个嵌套循环几乎立即运行。我已经查看了内置的 wilcox.test 函数,但是,它是一个经典的假设检验,这个实现是用于转换原假设和替代假设的等价检验。我已经探索过用 lapply 重写,但我没有成功,因为我没有太多地使用 apply 系列函数。
标签: r nested-loops equivalence