我需要找到最大值出现在下三角协方差矩阵中的行和列。然后我可以用缺失的方式替换整个行和列。
问问题
1272 次
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 回答