BookmarkSubscribeRSS Feed

[SAS 활용 노하우] Monte Carlo Simulation

Started ‎05-31-2022 by
Modified ‎05-31-2022 by
Views 640

Monte Carlo Simulation 방법을 알아보려 합니다.

Monte Carlo Simulation 방법은 대략적인 솔루션 또는 통계적 방법을 평가합니다.

자신의 기능이나 서브루틴을 만든 다음 일부 유형의 루프에서 시뮬레이션 내에서 사용할 수 있습니다.

각 반복에 대한 데이터를 저장한 다음 저장한 모든 데이터를 분석합니다.

Conditional Processing Syntax

■ IF, ELSE IF, and ELSE Statements

IML 시뮬레이션의 좋은 점은 syntax requirements 가 있습니다.

다음 구문을 사용하여 IML에서 직접 IF, ELSE IF 및 ELSE 문을 사용할 수 있습니다.

 

 

IF expression THEN statement;
<ELSE IF expression THEN statement;>
<ELSE statement;>

 

IML에서 사용된 명령문과 동일한 조건부 처리 명령문을 사용합니다.

DATA 단계에서와 같이 ELSE IF 및 ELSE 문은 조건부에서 선택 사항입니다.

여러 ELSE IF 문을 지정할 수 있습니다.

 

 

# Ex

 

 

X = {1 2, 3 4};
miss = loc(x=.);
flag = isempty(miss);
if flag=0 then print x;
else print "empty matrix!";

 

 

 

 

matrx flag가 0이면 x를 출력합니다. 그렇지 않으면 catch all ELSE 문은 빈 행렬을 출력합니다.

■ Do Loops

 

 

DO;
statements;
END;

 

 

 # Ex

 

 

 

do i=1 to 10 by 1;
print i;
end;

 

 

 

 

DO 문장은 DO 문 다음에 오는 문이 다음과 같은 상태가 될 때까지 그룹으로 실행되도록 지정합니다.

일치하는 END 문이 나타납니다. DO 문은 종종 반복 실행을 호출하는 절과 함께 나타납니다.

IF-THEN/ELSE 문을 사용하여 IF 조건이 충족될 때만 문 그룹이 실행되도록 합니다.

IML의 DO 루프는 R의 FOR 루프와 동일합니다. DO I는 1에서 10까지와 같습니다.

1씩 증가하고 i를 반복 인쇄하고 END 문을 사용하여 DO 그룹을 종료합니다.

■ SUBMIT Blocks with Loops and Conditions

SUBMIT 블록은 IF 문과 결합하여 조건부로 SAS 프로시저 및 DATA 단계를 실행할 수 있습니다.

SUBMIT 블록은 루프와 결합하여 SAS 프로시저 및 DATA 단계를 반복적으로 실행할 수 있습니다.

 

 

 

 

proc iml;
do i = 1 to 1000;
if i <= 500 then do;
submit block;
end;
else do;
submit block;
end;
end;
quit;

 

 

 

do i는 1에서 1,000 사이입니다. i가 500보다 작거나 같으면 다음을 수행합니다. 실행

여러 진술. 그렇지 않고 반복 값이 501 이상이면 다른 작업을 수행합니다.

시뮬레이션은 이러한 모든 아이디어를 결합합니다.

■ DO WHILE Loops

 

 

DO WHILE(expression);
statements;
END;

 

 

 # EX

 

 

 

x=1;
do while(x<5);
print x;
x = x+1;
end;

 

DO WHILE 문은 식을 통해 전달됩니다.

x는 5보다 작고 x를 인쇄하고 싶습니다.

■ Example: Monty Hall Problem

잘 알고 있는 예를 들어 시뮬레이션을 해 보려고 합니다.

몬티 홀 문제는 아래와 같습니다.

게임 쇼의 손님이 있고 사회자는 3 개의 문을 선택할 수 있습니다. 1개의 문은 차(car)를 숨기고 있고, 다른 2개의 문에는 염소를 숨기고 있습니다.

문을 고르려고 할 때 손님은 은 1번 문을 선택합니다.

호스트는 각각의 문 뒤에 뭐가 있는지 알고 있고 손님이 선택하지 않은 두 개의 문 중 하나를 열고 항상 염소가 나타납니다.

그러면 호스트는 처음에 선택한 상태로 머물거나 닫힌 상태로 전환할 수 있는 옵션을 제공합니다.

만약 우리가 이 문제를 분석적으로 해결한다면, 2/3의 확률로 승리한다는 것을 알 수 있습니다. 첫 번째 선택에서는 차를 얻을 수 있는 확률이 1/3입니다.

분석적 방법을 사용하거나 훨씬 더 어려운 문제를 해결하기 위해 시뮬레이션을 수행하여 이 문제에 대한 경험적 결과를 도출해내고자 합니다.

1) 시뮬레이션 횟수를 10,000으로 하고 난수 시드를 802로 설정합니다.

 

 

proc iml;
numberIterations=10000;
call randseed(802);

 

 

2) 숫자와 동일한 횟수를 실행하는 시뮬레이션 루프를 시작합니다.

첫번째 몬티 홀 문제를 시뮬레이션하는 단계는 세 개의 문 중 어느 문이 차를 숨기는지를 선택하는 것 입니다. SAMPLE 함수를 사용하여 임의의 도어 {1 2 3}을 그립니다.

 

 

 

do iteration=1 to numberIterations;
doors = {1 2 3};
carDoor=sample(doors,1);

 

 

 

 

3) 단순함을 위해 항상 1번 문을 선택면,. 몬티 홀은 절대 선택된 문을 열지 않고

절대 문을 열어주지 않아 차를 숨기지 않아 선택된 도어(도어 1)가 차량을 숨기는 경우 몬티는 무작위로

2번 문과 3번 문 중 하나를 선택합니다(Bernouli 분포에서 추출한 그림으로 표시됨).

입니다. 만약 차가 2번 문 뒤에 숨겨져 있다면, 몬티 홀은 3번 문을 열어야 합니다.

차나 선택한 문을 숨깁니다). 만약 차가 3번 문 뒤에 숨겨져 있다면, 몬티홀은 2번 문을 열어야 한다.

 

 

 

 

*Pick door for Monty Hall to open;
if carDoor=1 then openDoor=randfun(1,"Bernoulli",.5) + 2;
else if carDoor=2 then openDoor=3;
else if carDoor=3 then openDoor=2;

 

 

 

 

 

4) 전환 전략을 사용하려면 이전에 선택하지 않은 열리지 않은 문으로 전환해야 합니다.

몬티홀이 2번 문을 열었다면 3번 문으로 바꿉니다.

몬티홀이 3번 문을 열었다면 2번 문으로 바꿉니다.

 

 

 

*Determine door for switching strategy;
if openDoor=2 then switchDoor=3;
else if openDoor=3 then switchDoor=2;

 

 

5) 차량이 1번 문 뒤에 있으면 1번 문이 처음에 선택되었기 때문에 체류 전략이 승리합니다. 만일 차가 전환 전략에 따라 선택될 문 뒤에 있다면, 전환 전략이 승리합니다.

 

 

*Determine which strategy wins;
if carDoor=1 then stayWin=1;
else stayWin=0;
if carDoor=switchDoor then switchWin=1;
else switchWin=0;
/*switchWin=carDoor=switchDoor;*/

 

 

 

 

 6) 현재 반복에 대한 결과를 결과라는 행렬에 추가하고 시뮬레이션을 종료합니다.

 

 

 

loop.
*Collect results to a single matrix;
results=results // (iteration || carDoor || openDoor || stayWin
|| switchWin);
end;

 

 

 

 

 

7) 결과 행렬의 처음 10 행을 인쇄하여 모든 반복에 대한 결과를 표시합니다. 계산한다.

그리고 각 전략이 이긴 반복의 백분율을 인쇄합니다.

 

reset noname;
resultsSubset = results[1:10,];
print resultsSubset [colname={iteration carDoor openDoor
stayWin switchWin}];
percentageWins=results[:,{4 5}];
print percentageWins [colname={stay switch}

 

 

 image (9).png

 

 

Version history
Last update:
‎05-31-2022 11:09 AM
Updated by:
Contributors

sas-innovate-white.png

Special offer for SAS Communities members

Save $250 on SAS Innovate and get a free advance copy of the new SAS For Dummies book! Use the code "SASforDummies" to register. Don't miss out, May 6-9, in Orlando, Florida.

 

View the full agenda.

Register now!

Article Labels
Article Tags