Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | Wu Yi <yi_wu@nuhs.edu.sg> |
To | "statalist@hsphsun2.harvard.edu" <statalist@hsphsun2.harvard.edu> |
Subject | st: Case-control matching_seek for help |
Date | Mon, 4 Apr 2011 21:15:10 +0800 |
Hi, I am a research assistant in the Department of Public Health, National University of Singapore. I want to do a case-control matching. I found the following program by Stefan Kuhle using Google search. However, the program does not work if there are not enough matching controls. It just goes to a dead loop and never exits. Any suggestions to solve the problem? Many thanks in advance. Best regards, Wu Yi *--------------------------------------------------------------------------- * Case-control matching *--------------------------------------------------------------------------- (C) Stefan Kuhle, University of Alberta, 2007 E-mail: myfirstname.mylastname at ualberta.ca /* ---------------------------------------------------------------------------- This syntax will perform a 1:2 case-control matching on one matching variable. If you want to do a 1:1 or 1:3 etc matching, please change the while-loop condition below as indicated. If you want to match on two or more variables, then please uncomment the statement '& matchvar2[`i'] == matchvar2[`rndobs']' in the while-loop. To match on three or more variables, append more of above statements (using matchvar3, matchvar4, etc) to the if..then condition. ---------------------------------------------------------------------------- You will need the following variables in your dataset: **matchvar** Variable on which cases and controls are matched. For obvious reasons, this variable should be binary or categorical. **case** Binary variable that specifies if the observation is a case (=1) or a potential control (=0). **id** Unique observation ID ---------------------------------------------------------------------------- */ gsort - case id gen match = _n if case == 1 replace match = 99999 if match == . quietly count if case == 1 local casecount r(N) local matched `casecount' local total _N local i 1 set seed 65979 quietly while `i' <= `casecount' { local assigned 0 while `assigned' < 2 { /* If you want to do a 1:1 match, change this number to 1 (or to 3 for a 1:3 match etc) */ local rndobs = `matched' + int(uniform() * (`total' - `matched')) + 1 /* Un-comment inserted statement below to match on two variables */ /* Add more statements to match on three or more variables */ if matchvar[`i'] == matchvar[`rndobs'] /* & matchvar2[`i'] == matchvar2[`rndobs'] */ & match[`rndobs'] == 99999 { replace match = `i' in `rndobs' local matched = `matched' + 1 gsort - case match id local assigned = `assigned' + 1 } } local i = `i' + 1 } drop if match == 99999 /* This will drop all unmatched observations */ tab case matchvar /* There should now be exactly twice as many controls as cases */ * * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/statalist/faq * http://www.ats.ucla.edu/stat/stata/