1

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

Attention Please, Obs 3,9,5,6, なぜランクが違うのですか? ありがとうございました!

4

1 に答える 1

1

以下のコードを実行すると、実際には異なることがわかります。これは、数値ストレージの不正確さが原因です。1/3 が 10 進表記 (0.333333333333333 など) で表現できず、たとえば 10 桁を使用する場合、1-(1/3)-(1/3)-(1/3) はゼロに等しくないのと同様です。各結果を保存する場合 (0.000000001 に等しい)、どのコンピューター システムでも、10 進数 (基数 10) では適切に保存されているように見えますが、2 進数では適切に保存されていないように見える特定の数値に問題があります。

ここでの解決策は、基本的にそのまま丸めるか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 に答える