在R中编码双和

mub*_*kla 0 r

我想计算这些数量

a12=sum_(i from 1 to m)sum_(j1<j2)(I(X[i]>Y[j1] and X[i]>Y[j2]))

a13=sum_(j from 1 to n)sum_(i1<i2)(I(X[i1]>Y[j] and X[i2]>Y[j]))
Run Code Online (Sandbox Code Playgroud)

我在哪里是指标功能.

所以我想出了这个R代码

a12=0; a13=0

for (l in 1:(length(Z1)-1)){

 for (m in  1:(length(Z2)-1)){

 a12<-a12+(Z1[l]<Z2[m])*(Z1[l+1]<Z2[m])*1

 a13<-a13+(Z1[l]<Z2[m])*(Z1[l]<Z2[m+1])*1

        } # closing m

          } # closing l

    a12=a12+sum((Z1[-length(Z1)]<Z2[length(Z2)])*(Z1[-1]<Z2[length(Z2)])*1)

    a13=a13+sum((Z1[length(Z1)]<Z2[-length(Z2)])*(Z1[length(Z1)]<Z2[-1])*1)


a12;
a13
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不仅非常缓慢,而且我没有得到我应该得到的东西.

请问你能帮帮我吗!

谢谢,

罗兰

Pra*_*ani 5

我假设(a12你)要做以下事情.有两个矢量x(长度的m)和y,以及对于每个元素x[i]x,你正在计算不同索引对的数目j1,j2y这样x[i]超过两个y[j1]y[j2],然后被求和这个量在所有i.这是一个快速的方法a12(另一个将留作练习).首先请注意,您可以翻转求和的顺序:

a12 = Sum_(j1 < j2) Sum_(i=1:m) I( X[i] > Y[j1] & X[i] > Y[j2] ),
Run Code Online (Sandbox Code Playgroud)

即,对于每个不同的指数对j1,j2,计算的数量x超过两个元件y[j1]y[j2],然后我们在所有这些不同的折射率对总结此量.现在计算对的内部和j1,j2就像一个矩阵乘法.实际上,假设我们定义向量x并且y:

set.seed(1)
x <- sample(1:5,5,T)
y <- sample(1:5,10,T)
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用该outer函数生成一个矩阵y_x,当前后[i,j]条目为TRUE y[i] < x[j]:

y_x <- outer(y,x,FUN = '<')
Run Code Online (Sandbox Code Playgroud)

现在我们通过这样做得到内在的总和

z <- y_x %*% t(y_x)
Run Code Online (Sandbox Code Playgroud)

哪个z[i,j]元素的数量x超过了y[i]y[j].因为我们只想要总结z[i,j]的不同i < j,我们采取的下三角的总和得到最终结果z使用

a12 <- sum( z[lower.tri( z )])

> a12
[1] 72
Run Code Online (Sandbox Code Playgroud)