R中的pLepage函数

时间:2016-04-07 02:10:08

标签: r debugging

这是一个用于计算Lepage D统计量的自定义函数,它返回的结果与NSM3::pLepage()生成的D统计量不同:

LepageD <- function(x, y){
  m=length(x); n=length(y); N=m+n
  z=sort(c(x,y),index=TRUE)
  rz=seq(1,(N-1)/2); rz=c(rz,(N+1)/2,rev(rz))
  r=rz[sort(z$ix,index=TRUE)$ix]
  C=sum(r[12:21])
  rk=rank(c(x,y))
  W=sum(rk[12:21])
  Wstar=(W-n*(N+1)/2)/sqrt(m*n*(N+1)/12)
  Cstar=(C-n*((N+1)^2)/(4*N))/sqrt(m*n*(N+1)*(3+N^2)/(48*(N^2)))
  D=Wstar^2+Cstar^2
  D
}

> LepageD(1:10, 2:12)
[1] 1.09216
> pLepage(1:10, 2:12)$obs.stat
[1] 1.112263

我的功能无法处理情况xy具有相同的样本量。

> LepageD(1:10, 2:11)
[1] NA

我对自己错误的地方感到困惑。

1 个答案:

答案 0 :(得分:0)

据我所知,问题出在这条线上:

r=rz[sort(z$ix,index=TRUE)$ix]

此处出现错误的原因是z(在测试用例中给出输出为NA)有20个元素。

因此,sort(z $ ix,index = TRUE)$ ix将输出生成为:

1  2  4  6  8 10 12 14 16 18  3  5  7  9 11 13 15 17 19 20

此外,向量rz的长度为19(而不是20)。

rz载体的内容:

 [1]  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0 10.5  9.0  8.0  7.0  6.0  5.0
[16]  4.0  3.0  2.0  1.0

因此,当我们尝试访问向量rz的第20个元素时,它会产生NA。

由于在进行求和时没有使用na.rm = T参数,因此C和W的值变为NA。

这导致Wstar,Cstar和最终D成为NA。