英文:
SAS running a macro loop for n and p generating variables--> then creating a macro loop which has n and p as arguments
问题
以下是代码的翻译部分:
"As the title states im trying to illustrate the law of large numbers through bernoulli(p) by running a macro loop to generate output in the log. However with the following code i am getting no output what so ever. Following code is below."
"正如标题所述,我正在尝试通过运行宏循环来通过伯努利(p)来说明大数定律,并生成日志中的输出。但是,使用以下代码,我根本没有得到任何输出。以下是代码:"
英文:
As the title states im trying to illustrate the law of large numbers through bernoulli(p) by running a macro loop to generate output in the log. However with the following code i am getting no output what so ever. Following code is below.
Code:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-html -->
%macro LLN(n=10, p=0.6);
%let sum = 0; %let mean = 0;
data LLN;
%do i = 1 %to &n;
x = rand("Bernoulli", &p);
sum = sum + x;
mean = sum / i;
output;
%end;
run;
%mend LLN;
<!-- end snippet -->
答案1
得分: 2
以下是翻译好的部分:
- 你实际上不需要宏。可以在正常的数据步骤中完成do循环。
- 如果你想在数据步骤中使用宏变量
i
来与数据步骤变量进行计算,你应该使用&i
。 sum
和mean
的初始方式是为宏变量设计的,但你实际上将它们用作数据步骤变量。
我建议你使用数据步骤:
data test;
do i=1 to 10000;
x = rand("Bernoulli", 0.6);
sum + x;
mean = sum / i;
end;
run;
英文:
There are three points to improve:
- You don't really need a macro. The do loop can be done in normal data step.
- If you want to use macro variable
i
in your data step to join the calculation with data step variables, you should use&i
. - The initial way of
sum
andmean
is for macro variable, but you truly use them as data step variables.
I suggest you to use a data step:
data test;
do i=1 to 10000;
x = rand("Bernoulli", 0.6);
sum + x;
mean = sum / i;
end;
run;
答案2
得分: 1
这是您提供的代码的中文翻译:
将@whymath代码宏化将接受循环<code>max</code>和<code>p</code>作为rand()
函数的参数。
示例:
使用此宏创建单个数据集。为什么要在每次循环迭代中计算平均值?在LLN的研究中是否需要中间平均值?如果需要,在循环内部添加一个OUTPUT
。如果不需要,在循环结束后计算mean = sum / &N
。您可能还希望宏接受一个随机数种子以便未来运行时能够复现性。
%macro LLN (N=1000, p=0.6, out=, seed=.); /* .表示随机种子 */
data &out (label="LLN: N=&N, p=&p");
call streaminit(&seed);
do i=1 to &N;
x = rand("Bernoulli", &p);
sum + x;
mean = sum / i;
end;
* mean = sum / &N; * 或许? ;
run;
%mend;
但是,您还可以在单个数据步骤中为不同的N和p组合计算总和和平均值,并涉及使用by
和group
概念的某种可视化。
data LLN_study;
do p = 0.1, 0.2, 0.4, 0.5, 0.6, 0.8, 0.9;
do N = 1e3, 1e4, 1e5;
call missing (sum, mean);
do i = 1 to N;
x = rand("Bernoulli", p);
sum + x;
mean = sum / i;
* OUTPUT ; /* 如果需要每个N、p、i的sum和mean,请取消注释 */
end;
* mean = sum / N;
* OUTPUT ; /* 如果需要每个N、p的sum和mean,请取消注释 */
end; /* p变化 */
end; /* N变化 */
run;
proc sgplot data=LLN_study;
series y=mean x=i / group=N;
where mod(i,10)=1;
by p;
run;
希望这有助于您理解代码的中文翻译。
英文:
A macro-ization of @whymath code would take argument for the loop <code>max</code> and <code>p</code> parameter of the rand()
function.
Example:
A use of this macro creates a single data set. Why mean is calculated at each loop iteration? Do you want the intermediate mean in you study of LLN? If so, add an OUTPUT
inside the loop. If not, after the loop concludes compute mean = sum / &N
. You probably also want the macro to accept a random number seed for reproducibility in future runs.
%macro LLN (N=1000, p=0.6, out=, seed=.); /* . is a random seed */
data &out (label="LLN: N=&N, p=&p");
call streaminit(&seed);
do i=1 to &N;
x = rand("Bernoulli", &p);
sum + x;
mean = sum / i;
end;
* mean = sum / &N; * maybe? ;
run;
%mend;
However, you can also compute the sum & mean for various combinations of N & p in a single data step and do some sort of visualizaton involving by
and group
concepts.
data LLN_study;
do p = 0.1, 0.2, 0.4, 0.5, 0.6, 0.8, 0.9;
do N = 1e3, 1e4, 1e5;
call missing (sum, mean);
do i = 1 to N;
x = rand("Bernoulli", p);
sum + x;
mean = sum / i;
* OUTPUT ; /* uncomment if you want every sum & mean for each N,p,i */
end;
* mean = sum / N;
* OUTPUT ; /* uncomment if you want every sum & mean for each N,p */
end; /* p variation */
end; /* N variation */
run;
proc sgplot data=LLN_study;
series y=mean x=i / group=N;
where mod(i,10)=1;
by p;
run;
答案3
得分: 1
Get the SAS code to work properly for some value of N and P first.
So this code will create 10 observations.
data LLN;
do i = 1 to 10;
x = rand("Bernoulli", 0.6);
sum + x;
mean = sum / i;
output;
end;
run;
If you just want the final observation and not all of the partial sums then either move the OUTPUT statement outside the loop, or delete it since SAS will write the observation at the end of the step when there is no explicit output statement.
data LLN;
do i = 1 to 10;
x = rand("Bernoulli", 0.6);
sum + x;
end;
mean = sum / 10;
run;
Now you can try to convert it to a macro by replacing 10 with &N and 0.6 with &P.
%let n=10;
%let p=0.6;
data LLN;
do i = 1 to &n;
x = rand("Bernoulli", &p);
sum + x;
end;
mean = sum / &n;
run;
Once you see that works you are ready to create a macro with parameters N and P.
%macro LLN(n, p);
data LLN;
do i = 1 to &n;
x = rand("Bernoulli", &p);
sum + x;
end;
mean = sum / &n;
run;
%mend LLN;
%LLN(n=10,p=0.6)
英文:
Get the SAS code to work properly for some value of N and P first.
So this code will create 10 observations.
data LLN;
do i = 1 to 10;
x = rand("Bernoulli", 0.6);
sum + x;
mean = sum / i;
output;
end;
run;
If you just want the final observation and not all of the partial sums then either move the OUTPUT statement outside the loop, or delete it since SAS will write the observation at the end of the step when there is no explicit output statement.
data LLN;
do i = 1 to 10;
x = rand("Bernoulli", 0.6);
sum + x;
end;
mean = sum / 10;
run;
Now you can try to convert it to a macro by replacing 10 with &N and 0.6 with &P.
%let n=10;
%let p=0.6;
data LLN;
do i = 1 to &n;
x = rand("Bernoulli", &p);
sum + x;
end;
mean = sum / &n;
run;
Once you see that works you are ready to create a macro with parameters N and P.
%macro LLN(n, p);
data LLN;
do i = 1 to &n;
x = rand("Bernoulli", &p);
sum + x;
end;
mean = sum / &n;
run;
%mend LLN;
%LLN(n=10,p=0.6)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论