지식! 메뉴 바로가기 지식! 내용 바로가기

Highlight navigation

miniDaum navigation

관련 서비스

검색

지식 메인메뉴

다음앱 설치

다음 지식이 TIP으로 새롭게 태어납니다. 보기


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

뽀로리77 | 2006-11-22 23:56 | 조회 0 | 답변 1

Daum 카페 보건복지통계고위과정 (http://cafe.daum.net/NCCStat)에서 등록된 질문입니다.

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

 

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

 

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

 

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

 

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

 

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

 

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

이 질문에 답변하시면 지식머니 5, 채택시엔 30 을 더 드립니다.

현선림 | 답변 3 | 채택률 100%

활동분야 : 해당 분야가 없습니다.
본인소개 : 입력된 정보가 없습니다.

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 | 출처 : 본인작성 , [카페] 보건복지통계고위과정



우측 영역