在R中编码双和

时间:2011-03-28 21:18:44

标签: 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]))

我是指标功能。

所以我想出了这个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

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

请帮帮我吧。

谢谢,

罗兰

1 个答案:

答案 0 :(得分:5)

我假设(a12)你想要做以下事情。您有两个向量x(长度为m)和y,对于x[i]的每个元素x,您计算的是不同的向量 j1的{​​{1}},j2的索引对,y超过x[i]y[j1],然后您将这个数量相加到所有y[j2] {1}}。 这是一个快速的方法i(另一个将留作练习)。首先请注意,您可以按顺序翻转:

a12

即。对于每个不同的索引对a12 = Sum_(j1 < j2) Sum_(i=1:m) I( X[i] > Y[j1] & X[i] > Y[j2] ), ,我们计算超过j1,j2x的{​​{1}}个元素的数量,然后我们将这个数量与所有这些不同的索引相加 - 对。现在计算对y[j1]的内部和就像一个矩阵乘法。实际上,假设我们定义了向量y[j2]j1,j2

x

然后我们可以使用y函数生成矩阵set.seed(1) x <- sample(1:5,5,T) y <- sample(1:5,10,T) outer条目为TRUE,当且仅当y_x

[i,j]

现在我们通过

获得内部总和
y[i] < x[j]

其中y_x <- outer(y,x,FUN = '<') z <- y_x %*% t(y_x) 超过z[i,j]x的元素数量。由于我们只想对y[i]y[j]求和,因此我们通过使用<{p}}的下三角形的总和得到最终结果

z[i,j]