2014-09-18 2 views
1

이것은 프로그래밍 관련 질문이지만 통계 배경을 먼저 설명해 드리겠습니다. 이 질문은 혼합 효과 위치 스케일 모델 (즉, 이질적 분산)에 대한 데이터 시뮬레이션의 일부를 지칭합니다. IML의 RANDNORMAL 함수를 사용하여 두 MVN 분산 구성 요소를 시뮬레이션하려고합니다. 두 분산 구성 요소가 이기종이므로 ​​RANDNORMAL에서 사용하는 분산은 사람마다 다릅니다. 따라서 IML을 사용하여 특정 행 (예 : 행 1 = 사람 1)을 선택하고 다음 행으로 이동하기 전에 RANDNORMAL 함수를 사용하는 등의 작업이 필요합니다.SAS/IML : RANDNORMAL에서 개별 분산 구성 요소를 사용하는 방법

아래 예제 코드는 2 인분입니다. DO를 사용하여 각 개인의 특정 분산 구성 요소 (VC1 및 VC2)를 반복합니다. 오류가 발생합니다 : "모듈 RANDNORMAL 이전 호출에서 종료하기 전에 다시 전화." DO 루프에서 BREAK 또는 EXIT 함수가 필요하다고 가정하고 있지만 아무 것도 시도하지 않았습니다.

PROC IML; 
    ColNames = {"ID" "VC1" "VC2"}; 
    A = {1 2 3, 
     2 8 9}; 
    PRINT A[COLNAME=ColNames]; 
    /*Set men of each variance component to 0*/ 
    MeanVector = {0, 0}; 
    /*Loop through each person's data using THEIR OWN variances*/ 
    DO i = 1 TO 2; 
     VC1 = A[i,2]; 
     VC2 = A[i,3]; 
     CovMatrix = {VC1 0, 
        0 VC2}; 
     CALL RANDSEED(1); 
     U = RANDNORMAL(2, MeanVector, CovMatrix); 
    END; 
QUIT; 

도움을 주시면 감사하겠습니다. 아, SAS 9.4를 사용하고 있습니다.

+0

총 2 행 또는 1 인당 2 행을 생성합니까? (또한 IML을 사용하는 경우 올바른 태그를 사용하십시오. - Rick은 [tag : sas-iml] 질문에 대답하지만 그는 [tag : sas] 만 보는지 모르겠습니다.) – Joe

+0

각 행은 한 사람입니다. . 아, 그리고 그들은 1500의 평판을 가지고 있지 않기 때문에 유일한 "IML"태그를 사용하지 않을 것입니다 ... –

+0

그것은 [tag : sas-iml]이기 때문에입니다. – Joe

답변

1

당신은 주위를 움직이기를 원하지만 대개는 U를 두 번 다시 쓰고 싶지 않습니다. 당신이하려고하는 것을 이해한다면 U의 첫 번째 행을 쓰고 U의 두 번째 행을 써야합니다. 다음은 루프를 통해 매번 새로운 것을 생성하는 것보다 (그리고 느리다) U와 _Cv 행렬을 j() 이후에 좀 더 효율적입니다.

proc iml; 

    a = {1 2 3,2 8 9}; 
    print(a); 
    _mv = {0,0}; 
    U = J(2,2); 
    _cv = J(2,2,0); 
    CALL RANDSEED(1); 

    do i = 1 to 2; 
    _cv[1,1] = a[i,2]; 
    _cv[2,2] = a[i,3]; 
    U[i,] = randnormal(1,_mv, _cv); 
    end; 
    print(u); 
quit; 
+0

이 답변은 완전히 정확하고 훌륭하게 작동했습니다. 그렇게 말하면, 예제 코드는 IML의 단계가 비슷해 보이는 것과 유사하게 프로그래밍되었으므로 아래의 Rick 코드 수정 사항은 일관성있게 유지되었습니다 (정신 근육을 덜 필요로 함). 당신의 솔루션은 필연적으로 다른 사람들에게 매우 유용 할 것입니다. 감사! –

+0

나는 릭의 다른 블로그 게시물을 읽는 것을 강력히 추천한다. 그는 위의 방법을 사용하는 이유와 매번 반복 할 때처럼 재생성하는 것을 포함하여 특정 일이 어떻게 수행되어야하는지에 대한 좋은 예를 갖고있다. (그러나 실제로 IML 프로그래머가 아니기 때문에 주로 내 대답은 그 독서를 기반으로합니다!) – Joe

+0

두 솔루션을 비교하고 최대 1000 명까지 램핑 한 결과 코드가 훨씬 효율적이라는 것을 알았습니다. 이것은 릭의 잘못이 아니라 내 자신의 진절머리 나는 프로그래밍이다. 당신이하고있는 일을 정확하게 파악하는 데 시간이 걸렸습니다. 응답을 선택하는 이유는 두 곳의 응답을 동일한 장소로 가져 오기 때문에 응답 확인 표시 사이를 전환하기 때문입니다. 어쨌든, 정말 고마워! 양해 해 주셔서 다시 한 번 감사드립니다. –

1

귀하의 실수는 유효한 SAS/IML 구문 아니다 라인

CovMatrix = {VC1 0, 0 VC2}; /* wrong */ 

입니다. "Constructing block matrices with applications to mixed models." 대신, 기사 "How to build matrices from expressions."

을 당신은 또한 블록 대각 행렬과 시뮬레이션을 수행하는 방법을 설명하는이 문서에 관심이있을 수 있습니다 참조 조의 접근 @ 사용하거나 자세한 내용은

CovMatrix = (VC1 || 0) // (0 || VC2); 

를 사용

+0

정말 대단합니다, 릭 감사합니다! 처음으로 링크 된 블로그 게시물은 내가 잘못한 것을 설명하는 데 훌륭한 역할을합니다. 솔직히, 나는 그 블로그 게시물을 얻기 위해 구글 검색에서 내 질문을 잘 표현할 수 없었다. 과거에는 행렬에 중괄호를 사용 했었지만 중괄호는 고정 값에만 유용하다는 것을 전혀 알지 못했습니다 (어, 리터럴). –

관련 문제