用R计算一个二重和



我必须用双和计算一个测试统计数据。

我是这样解决的:

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))))

有没有一种更简单的方法来计算测试统计数据?

使用

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

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

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万亿个循环,需要很长的时间来计算。

最新更新