2

在 SAS 9.3 中,我们可以使用函数轻松计算 lat、lon 之间的欧几里得距离矩阵distance

proc iml;
n=5; 
seed=123456789;
    lat= J(n,1,0); lon= J(n,1,0);
    i = 1;  do while (i <= n); 
    lat[i] = uniform(seed);                                                                                                  
    lon[i] = uniform(seed);                                                                                                  
     i = i + 1;  end;
mat=lat||lon;
dist=distance(mat); 
run;
quit; 

我在 SAS 9.2 中找不到此功能我如何在 9.2 中执行此操作?

谢谢你。

4

2 回答 2

4

Rick Wicklin 在一篇博文中回答了这个问题,他在其中介绍了该distance功能,但还告诉您如何通过其他两种方式来实现。

  • PROC DISTANCE(不是 IML 过程,但会生成一个类似矩阵的数据集,您可以轻松地将其加载到 IML 中)
  • 编写自己的模块。您需要创建一个pairwisedist()模块来定义如何计算矩阵的欧几里得距离。本质上,您确定矩阵中行的所有组合之间的差异。然后对差的平方求和并取平方根。

一个例子PROC DISTANCE

proc iml;
n=5; 
seed=123456789;
    lat= J(n,1,0); lon= J(n,1,0);
    i = 1;  do while (i <= n); 
    lat[i] = uniform(seed);                                                                                                  
    lon[i] = uniform(seed);                                                                                                  
     i = i + 1;  end;


  mat=lat||lon;
  create matdata from mat [colname={'x1' 'x2' 'x3' 'x4' 'x5'}];
    append from mat;
  close matdata;
  quit;

proc distance data=matdata out=dist method=Euclid nostd;
  var interval(x1 x2);
run;
于 2015-03-06T15:00:34.987 回答
1

感谢@Joe,我可以使用 Rick Wicklin 的答案proc iml作为:

proc iml;
n=5; 
seed=123456789;
    lat= J(n,1,0); lon= J(n,1,0);
    i = 1;  do while (i <= n); 
    lat[i] = uniform(seed);                                                                                                  
    lon[i] = uniform(seed);                                                                                                  
     i = i + 1;  end;
mat=lat||lon;

start PairwiseDist(x, y);
if ncol(x)^=ncol(y) then return (.); /* Error */
p = nrow(x); q = nrow(y);
idx = T(repeat(1:p, q)); /* index matrix for x */
jdx = shape(repeat(1:q, p), p); /* index matrix for y */
diff = abs(X[idx,] - Y[jdx,]);
return( shape( sqrt(diff[,##]), p ) );
finish;
start EuclideanDistance(x); /* in place of 12.1 DISTANCE function */
y=x;
return( PairwiseDist(x,y) );
finish;
distance=EuclideanDistance(mat);
print distance;

run;
quit;

谢谢乔,感谢里克·威克林。

于 2015-03-06T15:11:27.587 回答