Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

Re: st: RE: using loop to generate distributions with different means and standard deviations

 From Sarah Elizabeth Edgington To statalist@hsphsun2.harvard.edu Subject Re: st: RE: using loop to generate distributions with different means and standard deviations Date Fri, 20 May 2011 23:44:06 -0700

```Lance,
```
My first piece of advice is when working on something complicated, get it to work once before you worry about loops.
```
```
Since I haven't used -drawnorm-, I assumed that the syntax you initially gave actually worked for the case you gave and that what you were trying to do was figure out how to repeat it. If the syntax doesn't work once, it clearly won't work in a loop.
```
```
Looking at how -drawnorm- works, you want to create a vector of means and standard deviations.
```
```
I'm going to assume that the code that you said you initially ran to create the mean and sd vars, does what you want it to. Obviously if you haven't already confirmed that you have the variables that you want to feed into -drawnorm- you should do that first.
```
```
What you need is a list of variable names you want drawnorm to create, a vector of means, and a vector of standard deviations. There's almost certainly a more elegant way to do this, but here is one way to get you what you need:
```
forv i=1/3 {
*create a local macro that has the list of vars you want to create
local products "`products' product`i' "

*then create one with the mean values with a slash
sum max_product`i'
local mn`i'=r(mean)
local means="`means' \ `mn`i'' "

*and now the values for the SD
sum sd_product`i'
local sd`i'=r(mean)
local sds="`sds' \ `sd`i'' "
}

display "`means'"
display "`sds'"

**have to get rid of initial "\" or matrix syntax won't work
local mnmat : subinstr local means "\" " "
local sdmat : subinstr local sds "\" " "

display "`mnmat'"
display "`sdmat'"

mat meanvec=(`mnmat')
mat sdvec=(`sdmat')

drawnorm `products', m(meanvec) sd(sdvec)

Hope that helps.

-Sarah

At 08:47 PM 5/20/2011, you wrote:
```
```I tried the command you suggested

ds mean* sd*
forvalues i=1/3 {
drawnorm product`i'_dist, m(mean_item_`i') sd(sd_item_`i')
}

but it failed, I got this error

means(mean_item_1) invalid
r(198);

end of do-file

r(198);

I think the variable might need to be in matrix form. Does that sound
right? If so, do you know how would I create the vector with the
relevant information.

Thanks for all of your help,

Lance

On Fri, May 20, 2011 at 2:44 PM, Sarah Edgington <sedging@ucla.edu> wrote:
> Lance,
> Is your actual data really different from the simulated data you've shown?
> If not I don't understand why the solution I suggested before doesn't solve
> your problem. If your variables are actually numbered like you've shown,
> it's still just a -forvalues- loop to get the drawnorm part working.
>
> forv i=1/3 {
>        drawnorm product`i', m(max_product`i') sd(sd_product`i')
> }
>
> Unless you give more specific information about the actual problem you're
> trying to solve and why the suggested solution doesn't work, I don't think
> you're going to get much help.
>
> -Sarah
>
>
>
> -----Original Message-----
> From: owner-statalist@hsphsun2.harvard.edu
> [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Lance Wiggains
> Sent: Friday, May 20, 2011 11:29 AM
> To: statalist@hsphsun2.harvard.edu
> Subject: st: using loop to generate distributions with different means and
> standard deviations
>
> Sorry for the vagueness. Right now I'm just using simulated data for 3
> different products. Here is my code:
> My data looks like this
> Week      Product 1        Product 2      Product 3
> 1                  50                 45                 50
> 2                  60                 50                 40
> 3                  70                 55                 30
> 4                  80                 50                 20
> 5                  90                 45                 10
> 6                  100               50                  0
>
> tsset week
> gen n=_n
> egen max_n=max(n)
>
> ds week n max_n, not
> foreach var in `r(varlist)'{
>       tssmooth ma ms_`var'= `var', weights(1 1<2>1)
>       }
>
> ds ms*
> foreach var in `r(varlist)' {
>       gen week3_`var'=`var' if n==max_n
>       egen max_week3_`var'=max(week3_`var')
>       drop week3*
>
> }
> drop ms*
>
> ds week n max_*, not
> foreach var in `r(varlist)' {
>       gen max_`var'=max_week3_ms_`var'
> }
> drop max_week*
>
> keep if n+3>=max_n
> ds week n max*, not
> foreach var in `r(varlist)'{
>       egen sd_`var'=sd(`var')
> }
>
> rename max_n maximum_n
>
> ds max_* sd* week, not
> foreach var in `r(varlist)'{
>       drop `var'
> }
>
> drawnorm product1, m(max_product1) sd(sd_product1)
>
> Thanks,
>
> Lance
> - Hide quoted text -
>
> On Wed, May 18, 2011 at 1:51 PM, Sarah Edgington <sedging@ucla.edu> wrote:
>> Lance,
>> That's a different problem.  From your original post I assumed you had
>> all the variables already created.
>> One strategy for writing loops is to write out the code for the first
>> two examples of something repetitive you want to do.  Then identify
>> the parts of the example that remain the same across the examples.
>> If you post the code your trying to repeat we may be able to help you
>> but your current description is too vague for me to do much more than
>> offer vague suggestions of how to think about loops.
>> -Sarah
>>
>> -----Original Message-----
>> From: owner-statalist@hsphsun2.harvard.edu
>> [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Lance
>> Wiggains
>> Sent: Wednesday, May 18, 2011 10:36 AM
>> To: statalist@hsphsun2.harvard.edu
>> Subject: Re: st: RE: using loop to generate distributions with
>> different means and standard deviations
>>
>> I've tried that but the problem is that I'm pre-calculating the means
>> and sd's for the variable because I'm only using the last 3-4
>> observations for each variable to calculate those values. I'm doing
>> this because I want it to reflect the changes that happen recently. My
>> mean function uses tssmooth, with weights (1 1<2>), to average the
>> last 3 weeks of sales. So if sales were 70,80,90, and 100 I get a
>> value of 92.5 for my mean. It also calculates a SD for the last 3-4
>> observations. Then I want to plug those numbers into the drawnorm function
> using a loop. Any idea about how that would work?
>>
>> Lance
>>
>> On Wed, May 18, 2011 at 1:16 PM, Sarah Edgington <sedging@ucla.edu> wrote:
>>> Lance,
>>> Try something like this:
>>>
>>>        forv i=1/3 {
>>>                 drawnorm name`i', m(mean_var`i') sd(sd_var`i')
>>>        }
>>>
>>> You'll run into problems, though, if your data actually includes the
>>> variable names you list since there isn't a sd_var1.
>>>
>>> -Sarah
>>>
>>> -----Original Message-----
>>> From: owner-statalist@hsphsun2.harvard.edu
>>> [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Lance
>>> Wiggains
>>> Sent: Wednesday, May 18, 2011 10:09 AM
>>> To: statalist@hsphsun2.harvard.edu
>>> Subject: st: using loop to generate distributions with different
>>> means and standard deviations
>>>
>>> Statalist members,
>>>
>>> I'm trying to get Stata to generate a distribution of data from
>>> variables in my data set.
>>>
>>> My appended data looks like this
>>> mean_var1=90
>>> standard_deviation_var1=5
>>> mean_var2=100
>>> sd_var2=10
>>> mean var3=110
>>> sd_var3=15
>>> and so on
>>>
>>> I'm need a loop that will take my variables and create the
>>> distributions for me.
>>> I've been using the drawnorm command
>>>     drawnorm name1, m(mean_var1) sd(sd_var1) but I can't get it to
>>> recognize more than 1 variable at a time
>>>
>>> I want it to perform the distribution command for each pair of my
>> variables.
>>> I.e. (m_var1, sd_var1), (m_var2, sd_var2) , (m_var3, sd_var3)
>>>
>>>
>>> Lance
> *
> *   For searches and help try:
> *   http://www.stata.com/help.cgi?search
> *   http://www.stata.com/support/statalist/faq
> *   http://www.ats.ucla.edu/stat/stata/
>
> *
> *   For searches and help try:
> *   http://www.stata.com/help.cgi?search
> *   http://www.stata.com/support/statalist/faq
> *   http://www.ats.ucla.edu/stat/stata/
>

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/
```
```
*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/
```