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

将按事件行的Medicaid数据转换为按患者行并保留诊断日期

SAS解决方案:从医保索赔数据生成患者级宽格式数据集(保留所有诊断日期)

核心思路

针对9600万索赔记录、25万患者的超大数据量,采用先筛选去重→日期编号→转置→全量合并的流程,确保高效处理同时保留所有患者(含无诊断记录者)。

分步实现代码

1. 生成全量患者基础表

先提取所有唯一患者ID,保证无诊断记录的患者不被遗漏:

/* 从原始索赔数据提取唯一患者ID,作为基础表 */
proc sort data=raw_claims(keep=patient_id) out=all_patients nodupkey threads;
    by patient_id;
run;

注:threads选项需SAS/THREADS许可,可大幅提升排序速度

2. 预处理索赔数据:筛选有效诊断并去重

提取每种精神障碍的诊断日期,去除同一患者同一障碍的重复日期:

/* 自动提取所有精神障碍哑变量及其名称(适配25种障碍) */
proc sql noprint;
    /* 获取所有xxx_disorder格式的哑变量名 */
    select name into :disorder_vars separated by ' '
    from dictionary.columns
    where libname='WORK' and memname='RAW_CLAIMS' and name like '%_disorder';
    /* 提取障碍名称前缀(如mood_disorder→mood) */
    select quote(scan(name, 1, '_')) into :disorder_names separated by ' '
    from dictionary.columns
    where libname='WORK' and memname='RAW_CLAIMS' and name like '%_disorder';
quit;

/* 筛选出所有有诊断的记录,按障碍类型拆分并去重 */
data claims_clean;
    set raw_claims;
    array disorders[*] &disorder_vars.;
    array disorder_names[*] $32 &disorder_names.;
    
    /* 用HASH表去重,避免排序,适合超大数据量 */
    if _n_ = 1 then do;
        declare hash h(ordered:'no');
        h.definekey('patient_id', 'disorder_type', 'claim_date');
        h.definedone();
    end;
    
    do i=1 to dim(disorders);
        if disorders[i] = 1 then do;
            disorder_type = disorder_names[i];
            /* 仅保留未重复的记录 */
            if h.add() = 0 then output;
        end;
    end;
    keep patient_id claim_date disorder_type;
run;

3. 给诊断日期编号

为每个患者的每种障碍诊断日期按时间顺序生成序号(如mood_1、mood_2):

data claims_numbered;
    set claims_clean;
    by patient_id disorder_type;
    if first.disorder_type then date_seq = 0;
    date_seq + 1;
    /* 生成转置后的列名 */
    col_name = cats(disorder_type, '_', date_seq);
run;

4. 转置为患者级宽格式

将长格式的诊断记录转置为每行对应一位患者的宽格式:

proc transpose data=claims_numbered out=claims_wide prefix=;
    by patient_id;
    id col_name;
    var claim_date;
run;

5. 合并全量患者数据

将转置后的诊断数据与全量患者表合并,确保无诊断记录的患者保留:

data final_patient_data;
    merge all_patients(in=a) claims_wide(in=b);
    by patient_id;
run;

性能优化建议

  • SPDE引擎:如果服务器支持,将中间数据集存储在SPDE库中,减少磁盘IO压力:
    libname spde spde '/path/to/spde_storage';
    /* 将后续中间表(如claims_clean、claims_numbered)指定到spde库 */
    
  • 分块处理:若内存不足,可按患者ID范围分块处理,最后合并结果。
  • 缺失值处理:转置后无诊断的患者对应列会显示为SAS缺失值(.),后续回归分析可根据需求用0或其他方式填充。

内容的提问来源于stack exchange,提问作者Angela A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:55:05