로그인   |  회원가입  |  사이트맵  |  Contact Us
  아이디 저장하기
 
홈 > SAS Tech & Tip > SAS Programming 활용하기
[SAS 프로그래밍] SAS/IML(interactive matrix language) DO statement & LOC function 2018.03.13
김효범 166 0
http://www.mysas.co.kr/sas_tiptech/a_question.asp?b_no=7629&cmd=content&bd_no=5

 

 

 안녕하세요. 이번시간에는 IML문에서 프로그래밍을 하는데 많이 쓰이는 Do명령문과 Loc함수에 대해 알아보겠습니다.

 

 

 

DO statement

 SAS dataset을 다룰 때와 마찬가지로 행렬에서 DO END문을 사용하면 반복되는 명령문들을 한번에 다룰 수가 있습니다. 예를 들어 다음과 같은 행렬a, b가 있을 때

 

행렬b의 원소들을 행렬a1행의 원소들로 바꾼다면 아래의 방법처럼 하나씩 명령문을 작성 할 수도 있지만

그것 보다는 Do 명령문을 사용하는 것이 편리합니다.

 

 

 

하지만, 모든 경우에 Do 명령문이 가장 효율적인 프로그래밍 방법이라고 단정지을 수는 없습니다. 불필요하게 Do명령문을 사용한다면 오히려 과정이 더 복잡해지는 결과를 초래할 수도 있습니다. 앞서 만든 행렬a의 각 열의 평균을 구하는 세가지 방법을 예로 들어 보겠습니다.

 

 

Do명령문을 두번이나 사용하였지만 간단해 보이지 않고 복잡하고 비효율적으로 보입니다.

 

 

Do명령문을 하나로 줄여 앞선 방법보다는 효율적이지만 이해가 쉽지는 않습니다.

 

 

위의 두 방법과 같은 결과가 나왔지만 앞서 복잡한 과정과 달리 mean함수를 사용하여 코드는 훨씬 간단해 졌습니다.

 이렇듯 Do문이 프로그래밍에서 많이 쓰이긴 하지만 대체할 다른 쉬운 방법이 없을 경우에만 사용을 해야 합니다.

 

 

 

 

LOC function

Loc함수는 행렬에 속한 원소들의 위치를 표시해주는 기능을 합니다. , 0은 결측값으로 취급하여 위치지정에서 제외됩니다.. 예를 들어 0값을 두개 포함한 1x6크기의 행벡터가 있을 때 loc함수를 사용하면 0을 제외한 나머지 원소들이 몇 번째 열에 위치했는지 출력됩니다.

 

 

Loc함수의 이런 기능은 결측값을 다룰 때 유용하게 사용됩니다. 예를 들어 다음과 같은 결측치가 포함된 행벡터 miss가 있을 때 Loc함수를 사용하여 결측치를 제거한 새로운 행벡터를 만들 수 있습니다.

 

 

Loc함수로 결측치가 아닌 원소들의 위치를 출력한 다음, 이 위치들을 다시 miss행벡터에 적용하여 결측치가 제거된 새로운 nomiss행벡터를 생성하였습니다.

 

 

 

Loc 함수는 또한 행렬내에서 조건을 만족하는 개체를 찾을 때에도 사용됩니다. 예를 들어 Sashelp라이브러리의 Class데이터셋을 행렬로 불러 들어와서 Height 60미만 Weight 90미만인 조건을 만족하는 개체의 번호를 알아보겠습니다.

 

 

Height 60미만 Weight 90미만인 조건을 만족하는 개체의 번호가 출력된 것을 확인하였습니다.

 

 

 

마치며

오늘은 IML문에서 프로그래밍을 할 때 많이 쓰이는 Do명령문과 Loc함수에 대해 알아보았습니다. Do명령문의 경우, 필요한 곳에 쓰이면 반복되는 명령문을 한번만 사용하여 효율적이지만 보다 쉬운 방법이 있다면 오히려 과정을 복잡하게 만들 수도 있기 때문에 이를 판단하기 위한 연습이 필요합니다.

 

 

 

 

Reference

https://support.sas.com/resources/papers/proceedings13/144-2013.pdf

http://support.sas.com/documentation/cdl/en/imlug/67502/HTML/default/viewer.htm#imlug_langref_sect233.htm

 

 

 
 
 
 
 [Mixed Model 3.1.4] Additional Examples for Hypotheses Testing
 [SAS 프로그래밍] SAS/IML로 행렬 히트맵 그리기(CALL HEATMAPCONT)