1

一:

data have;
input x1 x2;
diff=x1-x2;
a_diff= round(abs(diff), .01);
* a_diff=abs(diff);
cards;
50.7 60
3.3  3.3
28.8 30
46.2 43.2
1.2  2.2
25.5 27.5
2.9 4.9
5.4 5
3.8 3.2
1 4
;
run;

proc rank data =have out =have_r;
      where diff;
      var   a_diff      ;
      ranks a_diff_r;
run;

proc print data =have_r;run;

结果:

Obs     x1      x2     diff    a_diff    a_diff_r
 1     50.7    60.0    -9.3      9.3        9.0
 2     28.8    30.0    -1.2      1.2        4.0
 3     46.2    43.2     3.0      3.0        7.5
 4      1.2     2.2    -1.0      1.0        3.0
 5     25.5    27.5    -2.0      2.0        5.5
 6      2.9     4.9    -2.0      2.0        5.5
 7      5.4     5.0     0.4      0.4        1.0
 8      3.8     3.2     0.6      0.6        2.0
 9      1.0     4.0    -3.0      3.0        7.5

二:

data have;
input x1 x2;
diff=x1-x2;
a_diff=abs(diff);
cards;
50.7 60
3.3  3.3
28.8 30
46.2 43.2
1.2  2.2
25.5 27.5
2.9 4.9
5.4 5
3.8 3.2
1 4
;
run;

proc rank data =have out =have_r;
      where diff;
      var   a_diff      ;
      ranks a_diff_r;
run;

proc print data =have_r;run;

结果:

Obs     x1      x2     diff    a_diff    a_diff_r
 1     50.7    60.0    -9.3      9.3        9.0
 2     28.8    30.0    -1.2      1.2        4.0
 3     46.2    43.2     3.0      3.0        7.5
 4      1.2     2.2    -1.0      1.0        3.0
 5     25.5    27.5    -2.0      2.0        5.0
 6      2.9     4.9    -2.0      2.0        6.0
 7      5.4     5.0     0.4      0.4        1.0
 8      3.8     3.2     0.6      0.6        2.0
 9      1.0     4.0    -3.0      3.0        7.5

请注意,Obs 3,9,5,6,为什么等级不同?谢谢!

4

1 回答 1

1

运行下面的代码,你会发现它们实际上是不同的。这是因为数字存储不准确。类似于 1/3 无法用十进制表示法表示(0.333333333333333 等),如果您使用十位数,则 1-(1/3)-(1/3)-(1/3) 不等于零要随时存储每个结果(那么它等于 0.000000001),任何计算机系统都会遇到某些数字的问题,这些数字虽然以十进制(以 10 为基数)似乎可以很好地存储,但二进制则不会。

这里的解决方案基本上是像你一样四舍五入,或者fuzz等于相同的结果(它忽略小于 1x10^-12 的差异)。

data have;
input x1 x2;
diff=x1-x2;
a_diff=abs(diff);
put a_diff= hex16.;
cards;
50.7 60
3.3  3.3
28.8 30
46.2 43.2
1.2  2.2
25.5 27.5
2.9 4.9
5.4 5
3.8 3.2
1 4
;
run;
于 2013-10-05T12:22:09.353 回答