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 回答