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

SAS实现100次循环生成不同二项式结果并写入数据表

SAS实现100次二项式违约结果循环模拟并存储

完整实现代码

假设你的资产数据存储在数据集assets中,包含资产唯一标识id、评级rating、F1-F5变量,以及已计算好的违约概率pd(取值0-1),以下代码可直接复用:

/* 1. 初始化存储所有模拟结果的空数据集,提前定义变量类型避免冲突 */
data all_default_results;
    length loop_id 8 id $20 rating $10 F1-F5 8 pd 8 default_flag 8;
    stop;
run;

/* 2. 定义模拟循环宏 */
%macro run_default_simulation(num_runs=100);
    %do i=1 %to &num_runs.;
        /* 单次模拟:生成当前循环的违约结果 */
        data temp_default;
            set assets;
            loop_id = &i.; /* 标记当前是第几次模拟 */
            /* 基于违约概率生成二项式结果:1=违约,0=未违约 */
            default_flag = rand('BINOMIAL', pd, 1);
            /* 可选:设置随机数种子保证结果可复现,每次循环用不同种子避免重复 */
            call streaminit(&i. * 12345);
        run;

        /* 将本次模拟结果追加到总数据集 */
        proc append base=all_default_results data=temp_default force;
        run;

        /* 删除临时数据集节省内存 */
        proc datasets lib=work nolist;
            delete temp_default;
        run;
    %end;
%mend run_default_simulation;

/* 3. 执行100次模拟 */
%run_default_simulation(num_runs=100);

关键细节说明

  • 违约结果生成:rand('BINOMIAL', pd, 1)是SAS生成二项分布随机数的函数,这里设置试验次数为1,直接输出0(未违约)或1(违约),概率由你预先计算的pd决定。
  • 循环标识loop_id:必须保留该字段,用于区分不同模拟批次的结果,是后续分组绘图的核心依据。
  • 高效数据追加:proc append比传统data step的set追加更高效,尤其适合多次循环的场景,避免反复读取大体积的总数据集。
  • 随机数种子控制:如果需要复现模拟结果,可保留call streaminit(&i. * 12345)语句;若不需要固定结果,可删除该行,SAS会自动使用系统随机种子。

后续绘图示例参考

生成总数据集后,可直接用SAS绘图工具分析,比如统计不同评级资产的违约频率分布:

proc sgplot data=all_default_results;
    vbar rating / response=default_flag stat=mean group=loop_id transparency=0.7;
    yaxis label="平均违约概率";
    xaxis label="资产评级";
run;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:12:46