繁体   English   中英

在R中编码双和

[英]coding double sum in 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

不幸的是,这不仅很慢,而且我没有得到应该得到的。

请问你能帮帮我吗!

谢谢,

罗兰

我假设(对于a12 )您想要执行以下操作。 你有两个向量x (长度m )和y ,以及对于每个元素x[i]x ,你正在计算不同索引对的数目j1j2y使得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] ),

也就是说,对于每个不同的索引对j1,j2 ,我们计算同时超过y[j1]y[j2]x元素的数量,然后对所有这些不同的索引对求和。 现在,计算对j1,j2的内部总和就像矩阵乘法。 确实,假设我们定义了向量xy

set.seed(1)
x <- sample(1:5,5,T)
y <- sample(1:5,10,T)

那么我们可以使用outer函数生成一个矩阵y_x ,当且仅当y[i] < x[j] [i,j][i,j]项为TRUE:

y_x <- outer(y,x,FUN = '<')

现在我们通过做得到内部和

z <- y_x %*% t(y_x)

其中z[i,j]是同时超过y[i]y[j]x元素数。 由于我们只想将z[i,j]求和就i < j ,所以我们通过使用z的下三角的和来获得最终结果

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

> a12
[1] 72

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM