计算R中的双和

计算R中的双和,r,statistics,sum,R,Statistics,Sum,我必须用双倍和计算一个检验统计量 我是这样解决的: T<-numeric(1) for(j in 1:n){ for(k in 1:n){ T = T + ((1/n)*(exp(-(1/2)*((Y[j]-Y[k])^2))))} T = T - ((sqrt(2))*(exp(-(1/4)*((Y[j])^2))))} T = T + (n*(3^(-(1/2)))) T提前创建索引,然后在数组上求和比在两个嵌套循环上计算新索引更有用 indexes = expand.g

我必须用双倍和计算一个检验统计量

我是这样解决的:

T<-numeric(1)
for(j in 1:n){
   for(k in 1:n){
 T = T + ((1/n)*(exp(-(1/2)*((Y[j]-Y[k])^2))))}
 T = T - ((sqrt(2))*(exp(-(1/4)*((Y[j])^2))))}
 T = T + (n*(3^(-(1/2))))

T提前创建索引,然后在数组上求和比在两个嵌套循环上计算新索引更有用

indexes = expand.grid(1:n,1:n)
T = 1/n*sum(exp(-1/2*(Y[indexes[,1]]-Y[indexes[,2]])))
T = T-(sqrt(2))*sum(exp(-1/4*(Y[1:n])))
T = T+n/sqrt(3)
编辑:对于较大的n,这是不切实际的,因为1000000的
n
将使用
expand.grid
生成3.7 TB的数据帧。你可以总是使用for循环,即使它们很慢,但是如果你需要有大的N,我建议使用C++,因为这是1兆个循环,这将花费很长的时间来计算。p> 使用

n=100;
Y=runif(100);
T=0;

Ydiff=outer(Y,Y,"-")^2;
Y_1=exp(-0.5*Ydiff);
Y_2=sqrt(2)*exp(-0.25*Y^2);

T=sum(rowMeans(Y_1)-Y_2) + (n*(3^(-(1/2))))
对目前给出的方法进行比较,得出:

T=0;
n=100;
set.seed(100)
Y=runif(100);
for(j in 1:n){
  for(k in 1:n){
    T = T + ((1/n)*(exp(-(1/2)*((Y[j]-Y[k])^2))));
  }
  T = T - ((sqrt(2))*(exp(-(1/4)*((Y[j])^2))));
}
T = T + (n*(3^(-(1/2))));
print(T)
#21.18983

T=0;
Ydiff=outer(Y,Y,"-")^2;
Y_1=exp(-0.5*Ydiff);
Y_2=sqrt(2)*exp(-0.25*Y^2);
T=sum(rowMeans(Y_1)-Y_2) + (n*(3^(-(1/2))));
print(T)
# 21.18983

T=0;
indexes = expand.grid(1:n,1:n);
T = 1/n*sum(exp(-1/2)*((Y[indexes[,1]]-Y[indexes[,2]])));
T = T-(sqrt(2))*sum(exp(-1/4*(Y[1:n])));
T = T+n/sqrt(3);
print(T)
# -66.71403

Y
不能是
给定的随机值
索引时,它必须是向量对不起,Y是给定的随机向量,n是采样范围,例如n=100。你说的“更简单”是什么意思?更优雅?更有效率?是否存在此任务的包/函数?您可以查看对两个向量的所有组合(这里是“Y[1:n]”和“Y[1:n]”)进行操作的
?outer
,但是
outer
可能会遇到内存问题,因为它必须返回一个“length(x)*length(Y)”矩阵来处理。如果任何解决方案都能满足您的需要,请考虑接受答案。通过这种方式,问题会被标记为有答案(对其他人有用),并鼓励进一步的贡献。这不会给出与OP、typo和嵌套循环逻辑错误相同的答案吗?(Y-Y)^2和Y中的指数缺失。