2012-09-27 2 views
0

최대 삼각형 공분산 행렬에서 최대 값이 발생하는 행과 열을 찾아야합니다. 그런 다음 전체 행과 열을 누락 된 행으로 대체 할 수 있습니다.최대 값이 sas에서 발생하는 열과 행 값을 저장하는 방법

+2

스택 오버플로에 오신 것을 환영합니다! 작은 예제 데이터 세트를 추가하여 정확히 원하는 것을 보여주십시오. 전후 이미지가 도움이 될 것입니다. – BellevueBob

+0

SAS-IML을 사용하고 있습니까, 아니면 기본 SAS입니까? – Joe

+0

행과 열을 말할 때, 가장 높은 값이 발생하는 곳과 둘 중 하나의 유일한 교차점을 찾거나, 어떤 행이 가장 높은 값을 갖고 어떤 열이 가장 높은 값을 가졌는지를 개별적으로 알아내는 것을 의미합니까? 모든 열, 각각)? – TARehman

답변

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; 

을 그리고 데이터 구조를 보여주는 인쇄 :

_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  . 

:

PROC PRINT DATA=test; 
RUN; 

이 당신에게 다음과 같은 출력을 제공을 유일한 나머지 부분은 논리입니다 (그래서, 7 열의 모든 열 중에서 가장 큰 값을 포함하고 모든 행 중에서 가장 큰 값을 포함하는 7 행 중). 그런 다음 당신은 이것을 할 수 있습니다. ZEROFILL되는 열을 알아내는 시작 :

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에서.

+0

이것은 훌륭하지만 실제로 통계를 계산하기 위해 열과 행이 필요하며 다음과 같이 열과 행 값을 행렬 명령에 입력 할 수 있습니다. 'sigma_split [row, column] = 0' 여기서 sigma_split은 최대 값이 나타나는 곳을 찾으려는 행렬입니다. 또한, 나는 이것이 R에서 훨씬 더 쉽다는 것에 동의한다. 내가 원한 것과 평행 한 R의 코드는 이것이다. 'xm <-which (sigma.split == max (sigma-split), arr.ind = TRUE)' – TylerHunt

+0

다차원 배열을 사용하여이를 수행 할 수 있습니다. 나는 SAS 스킬에 조금 녹슬었고 지금은 직장에서 꽝 닫혀 버렸지 만, 기회가 있다면 나는 그걸로 엉망진창을 볼 수있을 것이다. – TARehman

관련 문제