0

下三角共分散行列で最大値が発生する行と列を見つける必要があります。次に、その行と列全体を欠落に置き換えることができます。

4

1 に答える 1

1

これを行うためのオプションがあります-Rを使用すると簡単になる可能性があることをお勧めしますが、SASではこれが機能します(IMLではありません-IMLについては個人的に知りません)。

まず、仮想三角行列を作成します。

DATA test;
    INPUT v1 v2 v3 v4 v5 v6 v7;
    DATALINES;
    0.13 . . . . . .
    0.21 0.30 . . . . .
    0.31 0.52 0.79 . . . .
    0.05 0.11 0.25 0.18 . . .
    0.77 0.93 0.81 0.51 0.02 . .
    0.96 0.09 0.45 0.36 0.14 0.29 .
    0.55 0.67 0.71 0.92 0.44 0.38 0.01
RUN;

各行の最大値を取得します。

DATA test;
    SET test;
    rowmax = max(v1,v2,v3,v4,v5,v6,v7);
RUN;

次に、データセットを転置します。

PROC TRANSPOSE DATA=test OUT=test PREFIX=v;
RUN;

次に、列の最大値を取得します。

DATA test;
    SET test;
    colmax = max(v1,v2,v3,v4,v5,v6,v7);
RUN;

元の向きに修正します。

PROC TRANSPOSE DATA=test OUT=test;
    ID _NAME_;
RUN;

最後に、不要な値を削除します。

DATA test;
    SET test;
    IF _N_=8 THEN rowmax=.;
RUN;

データ構造を表示するために印刷します。

PROC PRINT DATA=test;
RUN;

これにより、次の出力が得られます。

_NAME_     v1      v2      v3      v4      v5      v6      v7     rowmax
 v1        0.13     .       .       .       .       .       .       0.13
 v2        0.21    0.30     .       .       .       .       .       0.30
 v3        0.31    0.52    0.79     .       .       .       .       0.79
 v4        0.05    0.11    0.25    0.18     .       .       .       0.25
 v5        0.77    0.93    0.81    0.51    0.02     .       .       0.93
 v6        0.96    0.09    0.45    0.36    0.14    0.29     .       0.96
 v7        0.55    0.67    0.71    0.92    0.44    0.38    0.01     0.92
 colmax    0.96    0.93    0.81    0.92    0.44    0.38    0.01      .

唯一の残りの部分はロジックです (したがって、7 つの列のどれがすべての列の中で最大の値を含み、7 つの行のどれがすべての行の中で最大の値を含みます)。次に、これを行うことができます。ゼロフィルする列を特定することから始めます。

DATA test;
    SET test;
    index=_N_;
    ARRAY v v1-v7;
    IF _N_=8 THEN DO i=1 TO 7;
        IF v[i]=max(v1,v2,v3,v4,v5,v6,v7) THEN DO;
            CALL SYMPUT('rightcol',i);
        END;
    END;
    IF _N_~=8 THEN v["&rightcol"]=0;
    DROP i;
RUN;

行を取得するには、データセットを並べ替えるだけです (そのため、上にインデックスを設定しました)。

PROC SORT DATA=test;
    BY DESCENDING rowmax;
RUN;

これで、 N = 1の操作を実行するだけで、その行をゼロで埋めることができます。

DATA test;
    SET test;
    ARRAY v v1-v7;
    IF _N_=1 THEN DO i=1 TO 7;
        v[i]=0;
    END;
    DROP i;
RUN;

セットを再ソートします。

PROC SORT DATA=test;
    BY index;
RUN;

そして、次の出力が得られます。

_NAME_     v1      v2      v3      v4      v5      v6      v7     rowmax    index
v1        0.00     .       .       .       .       .       .       0.13       1
v2        0.00    0.30     .       .       .       .       .       0.30       2
v3        0.00    0.52    0.79     .       .       .       .       0.79       3
v4        0.00    0.11    0.25    0.18     .       .       .       0.25       4
v5        0.00    0.93    0.81    0.51    0.02     .       .       0.93       5
v6        0.00    0.00    0.00    0.00    0.00    0.00    0.00     0.96       6
v7        0.00    0.67    0.71    0.92    0.44    0.38    0.01     0.92       7
colmax    0.96    0.93    0.81    0.92    0.44    0.38    0.01      .         8

反復する必要がある場合は、コードを微調整して、colmax と rowmax の値をワイプします。

于 2012-10-02T21:08:21.043 に答える