You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS匹配:为病例分配唯一对照并解决重复使用问题

SAS病例对照匹配:解决对照重复分配问题

现有数据集

以下是病例(cases)和候选对照(controls)的SAS数据集结构:

data cases;
input id age area matchid;
datalines;
0101 25 12 1 
0120 25 12 2 
0125 30 11 3 
0130 45 11 4 
0135 45 11 5 
;

data controls;
input id age area;
datalines;
0203 25 12 
0250 26 12 
0320 25 12 
1023 30 11 
3020 45 11 
2036 45 11 
3022 46 11 
0204 25 12 
0321 25 12 
1025 30 11 
3026 45 11 
2070 45 11 
;

用户原实现代码

data control; set control;
check=1;
proc sort; by check; run;

data cohort; set case(where=(matchid=1)); 
   matchid=0; 
run;

%macro ccloop;
   %do i=1 %to &nobs;
data nowcase; set case(where=(matchid=&i)) end=final;
         case_id=id;
         case_age=age;
         case_area=area;
         check=1;
         drop id age area;
      proc sort data=nowcase; by check;
      data nowcase; merge nowcase control; by check; 
         if case_age=age and case_area=area;
         zzz=ranuni((667+&i));
      proc sort data=nowcase; by zzz; run;
      data nowcase; set nowcase; if _N_<=10; run;
      data casecase; set nowcase; 
         id=case_id;
         CASE=1;
         age=case_age;
         area=case_area;
         keep id case age area matchid;
      data casecont; set nowcase;
         CASE=0;
         keep id case age area matchid;
      data cohort; set cohort casecase casecont;
    dm log "clear";
   %end;
   data cohort; set cohort; if matchid=0 then delete;

%mend ccloop; run;

%ccloop; run;

需求与问题

核心需求

  • 为每个病例匹配10个唯一对照,每个对照只能被分配给一个病例
  • 病例标记case=1,对照标记case=0
  • 对照需携带对应匹配病例的matchid

当前问题

原代码未跟踪对照的使用状态,导致同一对照可能被多个病例重复选中,违反"对照唯一使用"的要求。

修正后的解决方案

实现思路

  1. 预处理对照数据集:添加匹配组标识(age+area),并新增used变量标记是否已被使用
  2. 按病例的matchid逐个处理:
    • 筛选当前病例对应匹配组的未使用对照
    • 随机排序后选取前10个,标记这些对照为已使用
    • 将病例和选中的对照整合到最终数据集
  3. 确保每次匹配后更新对照的可用状态,避免重复分配

修正代码

/* 预处理对照数据集,添加used标记,按匹配组排序 */
data controls_available;
    set controls;
    used = 0; /* 0=未使用,1=已使用 */
run;

proc sort data=controls_available;
    by age area;
run;

/* 初始化最终数据集 */
data final_cohort;
    length id $4 age area matchid case;
    stop;
run;

/* 遍历每个病例进行匹配 */
%macro match_case_control;
    /* 获取病例总数 */
    proc sql noprint;
        select count(*) into :n_cases from cases;
    quit;

    %do i=1 %to &n_cases;
        /* 获取当前病例信息 */
        data current_case;
            set cases;
            if _n_ = &i;
            case_id = id;
            case_age = age;
            case_area = area;
            case_matchid = matchid;
            keep case_id case_age case_area case_matchid;
        run;

        /* 筛选当前病例匹配组的未使用对照,随机排序 */
        proc sql;
            create table eligible_controls as
            select id, age, area, used
            from controls_available
            where age = (select case_age from current_case)
              and area = (select case_area from current_case)
              and used = 0
            order by ranuni(667+&i); /* 随机排序 */
        quit;

        /* 选取前10个对照,标记为已使用 */
        data selected_controls;
            set eligible_controls;
            if _n_ <= 10;
            matchid = (select case_matchid from current_case);
            case = 0;
            keep id age area matchid case;
        run;

        /* 更新对照的used状态 */
        proc sql;
            update controls_available
            set used = 1
            where id in (select id from selected_controls);
        quit;

        /* 构造当前病例的记录 */
        data current_case_record;
            set current_case;
            id = case_id;
            age = case_age;
            area = case_area;
            matchid = case_matchid;
            case = 1;
            keep id age area matchid case;
        run;

        /* 合并到最终数据集 */
        data final_cohort;
            set final_cohort current_case_record selected_controls;
        run;
    %end;
%mend match_case_control;

%match_case_control;

/* 查看最终结果 */
proc print data=final_cohort;
run;

代码关键点说明

  • 对照状态跟踪:通过used变量标记对照是否已被分配,每次匹配后更新状态,彻底避免重复使用
  • 匹配组筛选:严格按病例的age和area筛选候选对照,保证匹配条件符合要求
  • 随机匹配:使用ranuni()函数对候选对照随机排序,确保分配的随机性
  • 逐步整合:逐个病例处理,将病例和选中的对照逐步添加到最终数据集,逻辑清晰易维护

内容的提问来源于stack exchange,提问作者user1897747

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:25:20