QA

질문하기

질문
case군과 control군의 표본차이가 너무 많이 나는 경우에 처리

안녕하세요. 수업을 열심히 듣고 있는 학생입니다.

 

회사에서 데이터를 분석하는 과정에서 문제가 생겨서 이렇게 질문 올립니다.

 

case집단과 control 집단을 비교 분석하는 가운데서 case 군의 n수가 740이고 control군의 n수

 

가 16,300 으로 집단 n수 차이가 너무 많이 납니다. 이런 경우 분석을 그대로 진행했을 떄 올바를

 

결과가 나올 수 없다고 알고있는데요. 그래서 case군에 맞춰 control군에 cost를 주거나 아님

 

propensity score를 이용하여 매칭을 통해 그룹의 n수를  맞춰주는 경우가 있다고 알고있는데 우

 

찌해야되는지...알려주세요. ㅠㅠ  그리고 sas 와 stata의 프로그램 방법도 부탁드립니다.   

뽀로리77 | 2006.11.25 04:31 수정됨 | 신고 Daum카페 보건복지통계고위과정 에서 등록된 질문 | 답변 0
  • 답변 1
  • 조회 0

1개의 답변

답변
  • Case와 Control 집단을 1:k로 무작위 추출해서 매칭하는 방법

     

    Stata

    1. 아래의 내용을 복사해서 실행하면 radmatch 함수를 쓸 수 있습니다.

    /*This is a code fragment that defines the program "radmatch" to perform random 1:k case-control radius matching.*/
    /*First we give the program and then define its arguments. This is followed by a quick example.*/

    capture program drop radmatch
    program define radmatch
    syntax varlist [, id(varname) mpair(string) case(varname) k(integer 1) rad(string) seed(real 123456)]

    quietly {

    set seed `seed'
    gen `mpair' = .
    local cond: word count `rad'
    preserve
     keep if ~`case'
     save control, replace /*Creates "working" dataset of eligible controls to match cases to*/
     save control2, replace /*Creates a dataset to link cases to controls*/
    restore
    preserve
     keep if `case' /*Creates data set of cases only*/
     set seed `seed'
     gen order=uniform() /*Randomly orders cases for selection*/
     sort order
     drop order
     quietly count
     local caseN = r(N)
     replace `mpair' = _n /*Create an index to define matched groups*/
    save case, replace
    restore
    local l = 1
     while `l' <= `k' { /*Starts the loop over the 1:k matching*/
     local cN = 1
     while `cN' <= `caseN' { /*Starts the loop over the n observations in case dataset*/
      quietly {
      use case, clear
      local i = 1
      while `i' <= `cond' { /*For the cN^th observation in the case dataset, */
       local varn : word `i' of `varlist'
       local val`i' = `varn'[`cN'] /*obtain measurements on matching variable and */
       local pair = `mpair'[`cN'] /*index for defining match group.*/
      local i = `i'+1
       }
     use control, clear /*Opens up "working" dataset of eligible controls*/
     local j = 1
    preserve
     while `j' <= `cond' { /*From "working" control data set, we reduces the dataset*/
      local varn: word `j' of `varlist'
      local rad`j': word `j' of `rad'
      replace `varn' = abs(`varn' - `val`j'') /* based off the matching radius for the*/
      keep if `varn' <= `rad`j'' /* respective variables. We end up a*/
     local j = `j'+1 /*dataset with all possible matches for the cN^th case.*/
       }
     sample 1, count /*Randomly take one observation from eligible matches*/
     local contID = `id'[1] /*Get the id of the control that was the selected match for the cN^th case*/
    restore

     drop if `id' == `contID' /*Drop the selected match from the "working" control dataset*/
     save control, replace
    use control2, clear /*In control2 dataset, insert the cN^th case "pair" value for the*/
     replace `mpair' =`pair' if `contID'==`id' /*cN^th case's matched control. */
    save, replace
     } /*close quietly loop*/
     local cN =`cN'+1 /*Update the cN^th case loop*/
     }
     local l = `l' + 1 /*Update the k^th loop for the 1:k matching scheme.*/
     }
    use case, clear /*Create new dataset linking the cases and respective matches. Matches are defined*/
    append using control2 /*by the "pair" variable.*/
    sort `mpair' `id'
     }
    end
    /*Here is a description of the required arguments for this program*/
    /*syntax: radmatch varlist [, id() mpair() case() k() rad() seed()]*/
     /*varlist: these are the variables that we want to match the controls to cases on.*/
     /*mpair(): defines a variable that links the a given control to its matched case.*/
     /*id(varname): the id argument requires the "id" variable that uniquely defines each observation in the data set.*/
     /*case(varname): the case argument requires the "case" variable that defines an observation's case status. requires
      the "case" variable be coded 0-1 and the 1 corresponding to the cases.*/
     /*k(): defines the k in the 1:k matching. the default is k == 1.*/
     /*rad(): these are the respective radius's corresponding to the variables specified in the varlist.*/
     /*seed(): this is the seed to replicate results.*/
    /*Example: We are going to use the hsb2 data set and perform a 1:1 match on the variables female, ses and */
    /*read (we first have to define a "case" variable). The radius for female and ses is 0 (i.e. matches have */
    /*to be of the same sex and ses level) and 3 for read (the control's read score must be within 3 units of */
    /*the case's). Once the matching is done, we are going to list the first three matched pairs, by the matching variable match.*/

     

    2. case를 지정해주고 자료에 맞게 radmatch를 실행합니다.

    gen case = (uniform( )>=.75)

    radmatch female ses read, id(id) case(case) mpair(match) k(1) rad(0 0 3) seed(1523689)

    위 예제에서 사용한 옵션을 몇가지 설명드리겠습니다.

    female, ses read는 매칭 변수입니다.
    id는 구별자 변수입니다.
    case는 처리군을 나타내는 변수입니다.
    mpair(match)라고 했으므로 match라는 새로운 변수에 몇 번째 짝인지가 저장됩니다.
    k() 괄호 안에 숫자가 매칭하고자 하는 대조군의 숫자를 넣으면 되고, 1:4 짝짓기를 하고 싶으면 k(4)라고 넣으면 됩니다.
    rad() 옵션에는 0이라고 주면 매칭변수의 값이 완전히 일치하고, 3이라고 주면 3까지의 차이를 허용합니다. 예제에서 rad(0 0 3)이라고 했으므로 female과 ses는 똑같고 read(쓰기 점수로 연속변수)는 3차이가 나는 대조군을 선택하라는 명령이 됩니다.
    seed(1523689)는 시드번호이므로 임의의 숫자를 입력하면 됩니다.

     

    자세한 사항은 http://www.ats.ucla.edu/stat/stata/code/radius_match.htm를 참조하세요

     

    SAS

    1. 아래의 내용을 복사해서 실행하면 MATCH라는 매크로를 쓸 수 있습니다.

    %MACRO MATCH(RAW,NEW,STRTA, N1,N2, N3, N4,N5,N6, N7, N8, N9, N10,N11,N12, N13 );
    PROC SORT DATA=&RAW;
     BY &STRTA;
     RUN;

    PROC SURVEYSELECT DATA=&RAW OUT=&NEW
     METHOD=SRS N=(&N1,&N2, &N3, &N4,&N5,&N6, &N7, &N8, &N9, &N10,&N11,&N12, &N13);
     STRATA &STRTA;
    RUN;

    PROC FREQ DATA=&NEW;
     TABLES &STRTA;
    RUN;
    %MEND;

     

    2. 대조군에서 AGE1이라는 매칭변수의 값에 따라 지정해준 관찰치를 무작위 추출합니다.


    %MATCH(CONTROL_SMOKE, CONTROL_SMOKE1, AGE1, 44,84,168,360,480,836,960,1160,1172,992,668,448,176);

    /*아래의 수는 CASE의 도수에 4배를 한 수입니다*/

     

    CONTROL_SMOKE는 대조군 전체입니다.

    CONTROL_SMOKE1는 처리군의 K배만큼 무작위로 추출한 집단입니다.

    AGE1는 매칭변수입니다.

    44, 84, ..., 176은 AGE1별 대조군에서 추출할 관찰치입니다. 개수와 값이 바뀔 수 있습니다.

     

    3. 대조군에서 추출한 집단과 처리군을 머지합니다.

    DATA MATCH_LUNG_MALE;
       SET CONTROL_SMOKE2 CASE_SMOKE1;
    RUN;

     

    CONTROL_SMOKE2는 K배 추출한 대조군입니다.

    CASE_SMOKE1는 처리군입니다.

     

     

    propensity score를 이용하여 매칭방법

    Stata

    PSMATCH2라는 함수를 이용하면 됩니다.

    자세한 사항은

     

    SAS

    SUGI 214-26 “GREEDY” Macro

    2006.11.23 20:17 | 신고

추천토픽&메뉴 바로가기

추천토픽
메뉴 바로가기