Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: RE: using loop to generate distributions with different means and standard deviations
From
Sarah Elizabeth Edgington <[email protected]>
To
[email protected]
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 <[email protected]> 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: [email protected]
> [mailto:[email protected]] On Behalf Of Lance Wiggains
> Sent: Friday, May 20, 2011 11:29 AM
> To: [email protected]
> 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 <[email protected]> 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: [email protected]
>> [mailto:[email protected]] On Behalf Of Lance
>> Wiggains
>> Sent: Wednesday, May 18, 2011 10:36 AM
>> To: [email protected]
>> 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 <[email protected]> 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: [email protected]
>>> [mailto:[email protected]] On Behalf Of Lance
>>> Wiggains
>>> Sent: Wednesday, May 18, 2011 10:09 AM
>>> To: [email protected]
>>> 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)
>>>
>>> Thanks for your consideration,
>>>
>>> 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/