2014-04-09 4 views
1

PROC FACTOR에서 요소를 고유 값으로 가중하려고하지만 약간의 어려움이 있습니다. 나는 해결책을 가지고 있지만, 나에게이 일을하는 더 직접적인 방법이 있어야한다고 생각한다.SAS의 PROC FACTOR의 고유 값에 의한 가중치는?

** Get factors and eigenvalues; 
ods output Eigenvalues=MyEigenVals 
proc factor data=MyData method=principal out=MyData; 
    var X1 X2 X3 X4 X5 X6; 
run; 
ods output close; 

** Transpose the eigenvalues; 
proc transpose data=MyEigenVals out=MyEigenVals(drop=_NAME_) prefix=eigenval; 
    id Number; 
    var Eigenvalue; 
run; 

** Merge the data and fill down the eigenvalues; 
data MyData; 
    merge MyData MyEigenVals; 
    retain E1 E2 E3 E4 E5 E6; 
    if _n_=1 then do; 
     E1 = eigenval1; 
     E2 = eigenval2; 
     E3 = eigenval3; 
     E4 = eigenval4; 
     E5 = eigenval5; 
     E6 = eigenval6; 
    end; 
    ** weight each factor by its eigenvalue; 
    factor1 = factor1 * E1; 
    factor2 = factor2 * E2; 
    factor3 = factor3 * E3; 
    factor4 = factor4 * E4; 
    factor5 = factor5 * E5; 
    factor6 = factor6 * E6; 
run; 

이 부분에서 알 수 있듯이 이것은 내 작업을 수행하는 매우 직접적인 방법은 아닙니다. 아무도 내가이 문제를 잘 해결하도록 도울 수 있습니까? 심지어 가능할까요?

+0

하나의 제안 : 이와 같은 이름을 다시 사용하지 마십시오. 어떤 오류가 발생하고 데이터 세트를 대체하지 않는 데이터에 어떤 일이 일어날 위험이 있습니다. 나는 결코 '데이터 ; 이런 이유 때문에 동일한 데이터 셋 이름으로 나가는'또는'proc transpose '를 으로 설정하십시오. 항상 새로운 이름을 만들 때 오류를 추적하는 것이 더 쉽습니다. 심지어 'MyData1' 또는'EigenVal_t '조차도 전환되고, 때로는 문제를 쉽게 해결할 수 있습니다. – Joe

+0

감사합니다. @Joe, 분명히 이것은 실제 코드가 아닙니다.이 질문에 대해 가능한 한 간단하게 만들고 싶었습니다. – user12202013

답변

1

확실히 더 효율적으로 결합 할 수 있습니다. 최소한 마지막 데이터 저장을 단순화 할 수 있습니다.

data mydata; 
if _n_=1 then set MyEigenVals; 
set mydata; 
array factor[6]; 
array Eigenval[6]; 
do _i = 1 to dim(factor); 
    factor[_i] = factor[_i]*eigenval[_i]; 
end; 
run; 

SET은 자동으로 변수를 보유합니다.

둘째, 결과를 사용하는 방법에 따라 곱셈을 건너 뛸 수 있습니다. weight 문을 사용하여 고유 값을 가중치로 사용할 수 있습니다 (나중에 데이터 분석에 사용하는 절차에 따라 다름). 그게 너를 많이 사는지는 모르겠지만, 원래 값을 수정하지 않아도된다.