【问题标题】:how to generate unique random vector on each iteration?如何在每次迭代中生成唯一的随机向量?
【发布时间】:2022-07-08 00:11:07
【问题描述】:

我是 SAS 新手,我想为每个随机数值向量生成图。 因此,我用宏包装了我的 proc iml,并尝试在调用宏 generate_scatter_plot 之前调用它。但我每次迭代都得到相同的点数。

有人可以解释一下 SAS 的正确方法是什么。

  %MACRO generate_random_points();
proc iml;
    N = 6;
    rands = j(N,1);
    call randgen(rands, 'Uniform');  /* SAS/IML 12.1 */

    submit rands;
        data my_data;
            input x y @@;
            datalines;
            &rands
            ;
        run;
    endsubmit;
%MEND;

%MACRO generate_scatter_plot();
/* call execute('%generate_random_points();'); */
proc sgplot data=my_data;
scatter x=x y=y;
run;
%MEND;

data _null_;
do i = 1 to 20;
call execute('%generate_scatter_plot();');
end;
run;

我发现 SAS 与其他语言不同。

提前感谢所有愿意提供帮助的人!

【问题讨论】:

  • 不确定是否需要带有 IML 的宏代码,因为它有自己的循环编码结构。你为什么要尝试生成文本字符串?如果您需要随机数,只需将它们直接生成到数据集或 IML 矩阵中。

标签: sas sgplot


【解决方案1】:
  • 不需要IML,数据步循环可以生成随机值
  • 假设您正在学习宏编程
  • CALL EXECUTE 在数据步骤中是必需的,但在数据步骤之外不需要
  • CALL EXECUTE 也可以生成类似宏的代码
  • MPRINT/MLOGIC 选项有助于调试宏代码,否则代码不会显示到日志中

以下内容对您的逻辑进行了一些扩展,以演示宏的功能。

options mprint mlogic;


%macro generate_random_points(Num=);
*Macro to generate random numbers;
*number of points generated are equal to the NUM=parameter;
data my_data;
do i=1 to &num.;
x=rand('uniform');
y=rand('uniform');
output;
end;
run;

%mend;




%macro generate_scatter_plot(Num_Points=);

*create random data with specified points;
%generate_random_points(Num=&Num_Points);

*graph data;
proc sgplot data=my_data;
scatter x=x y=y;
run;

%MEND;


*Run macro with different parameters in loop;
data _null_;
do i = 3 to 5;
         call execute(catt('%generate_scatter_plot(Num_Points=', i, ');'));
end;
run;

option nomprint nomlogic;

您的流程略有不同:

data _null_;
do i = 3 to 5;
         call execute(catt("Title 'Num Points = ", i, " '; ", ' %generate_scatter_plot(Num_Points=', i, ');'));
end;
run;

【讨论】:

    【解决方案2】:

    如果您使用 IML,则无需使用 SAS 宏语言来生成代码。

    您已经展示了如何将随机数生成到 IML 矩阵中。

    您可以使用 SUBMIT/ENDSUBMIT 块来调用您的 PROC SGPLOT 代码。

    您似乎缺少将矩阵转换为数据集的 IML 语法。 https://blogs.sas.com/content/iml/2011/04/18/writing-data-from-a-matrix-to-a-sas-data-set.html

    proc iml;
    N = 6;
    x = t(1:N);
    y = j(N,1);
    call randgen(y, 'Uniform');
    
    create my_data var {x y};
    append;  
    close my_data; 
    
    submit;
    proc sgplot data=my_data;
    scatter x=x y=y;
    run;
    endsubmit;
    
    quit;
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 2013-10-01
      • 2020-12-20
      • 2011-08-19
      • 2018-06-25
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多