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

# RE: st: Looping over datetimes for simultaneous variable generation

 From Paul Balcombe <[email protected]> To "[email protected]" <[email protected]> Subject RE: st: Looping over datetimes for simultaneous variable generation Date Thu, 3 Oct 2013 16:33:54 +0000

```That looks great, thanks a lot.
For my understanding, what is the role of `j' in this and why do I need it? And why does the code require the quietly command?
Many thanks, very helpful
Paul

________________________________________
From: [email protected] [[email protected]] on behalf of Nick Cox [[email protected]]
Sent: 03 October 2013 17:02
To: [email protected]
Subject: Fwd: st: Looping over datetimes for simultaneous variable generation

Corrected version below. Previous was sent prematurely.

Nick
[email protected]

qui forval j = 2/`=_N' {
if z[`j' - 1] <  x[`j' - 1] & mi(x[`j']) {
replace y = y[_n-1] in `j'
replace z = z[_n-1] + y  in `j'
replace x = x[_n-1] in `j'
}
}

On 3 October 2013 16:47, Paul Balcombe
<[email protected]> wrote:
> This doesn't work either because the command must estimate x, y and z at time point n before moving on to point n+1.
> The code you suggest estimates y at all time points first, before estimating x and z. This doesn't work because y depends upon z(n-1) and x(n-1), as shown in the code.
> So I need the computation to work out multiple variables (x,y,z) at each time point before moving on to the next time point, which is why I thought I needed a looping command such as forvalues. Does that make sense?
> Thanks,
> Paul
>
> _______________________________________
> From: [email protected] [[email protected]] on behalf of Nick Cox [[email protected]]
> Sent: 03 October 2013 16:34
> To: [email protected]
> Subject: Re: st: Looping over datetimes for simultaneous variable generation
>
> Fair enough. So -replace- y first.
>
> replace y = y[_n-1] if mi(x) & z[_n-1] < x[_n-1]
> replace z = z[_n-1] + y  if mi(x) & z[_n-1] < x[_n-1]
> replace x = x[_n-1] if mi(x) & z[_n-1] < x[_n-1]
>
> Nick
> [email protected]
>
>
> On 3 October 2013 14:57, Paul Balcombe
> <[email protected]> wrote:
>> But this won't work because when we replace z(n) we need y(n), which is dependent on knowing z(n-1). So, I must use a command that calculates y(n), x(n), z(n) and then y(n+1), x(n+1), z(n+1), rather than calculating all the values for x then y then z.
>>
>> Thanks,
>> Paul
>>
>> ________________________________________
>> From: [email protected] [[email protected]] on behalf of Nick Cox [[email protected]]
>> Sent: 03 October 2013 12:56
>> To: [email protected]
>> Subject: Re: st: Looping over datetimes for simultaneous variable generation
>>
>> Might be as simple as
>>
>> replace z = z[_n-1] + y  if mi(x) & z[_n-1] < x[_n-1]
>> replace y = y[_n-1] if mi(x) & z[_n-1] < x[_n-1]
>> replace x = x[_n-1] if mi(x) & z[_n-1] < x[_n-1]
>>
>> Nick
>> [email protected]
>>
>>
>> On 3 October 2013 11:53, Paul Balcombe
>> <[email protected]> wrote:
>>> Thankyou for the response.
>>>
>>> I'll try to explain what I want to calculate more clearly:
>>> I have a dataset with observations of 4 variables every hour for one year. An  example of the data is below. I now want to calculate 5 minutely values in between this hourly data. At each 5 minute interval I want to estimate w, x, y and z with the following rules (not in stata language):
>>>
>>> At time t, replace the following variables if mi(x) and if z(t-1) < x(t-1):
>>> z(t) = z(t-1) + y(t)
>>> y(t) = y(t-1)
>>> x(t) = x(t-1)
>>>
>>> Where the if statements are false, do not generate new values for the variables.
>>>
>>> I need to calculate all variables at each time period, rather than estimate one variable at a time because they are dependent on each other at each time point.
>>>
>>> I hope  this is slightly clearer.
>>> Thanks,
>>> Paul
>>>
>>>
>>> datetime w x y z
>>> 19/08/2012 00:00 0 0 0 0
>>> 19/08/2012 00:05 . . . .
>>> 19/08/2012 00:10 . . . .
>>> 19/08/2012 00:15 . . . .
>>> 19/08/2012 00:20 . . . .
>>> 19/08/2012 00:25 . . . .
>>> 19/08/2012 00:30 . . . .
>>> 19/08/2012 00:35 . . . .
>>> 19/08/2012 00:40 . . . .
>>> 19/08/2012 00:45 . . . .
>>> 19/08/2012 00:50 . . . .
>>> 19/08/2012 00:55 . . . .
>>> 19/08/2012 01:00 3.4 0.2448 0.2833333 0.2833333
>>> 19/08/2012 01:05 . . . .
>>> 19/08/2012 01:10 . . . .
>>> 19/08/2012 01:15 . . . .
>>> 19/08/2012 01:20 . . . .
>>> 19/08/2012 01:25 . . . .
>>> 19/08/2012 01:30 . . . .
>>> 19/08/2012 01:35 . . . .
>>> 19/08/2012 01:40 . . . .
>>> 19/08/2012 01:45 . . . .
>>> 19/08/2012 01:50 . . . .
>>> 19/08/2012 01:55 . . . .
>>> 19/08/2012 02:00 0 0 0 0
>>>
>>>
>>>
>>> ________________________________________
>>> From: [email protected] [[email protected]] on behalf of Nick Cox [[email protected]]
>>> Sent: 03 October 2013 10:48
>>> To: [email protected]
>>> Subject: Re: st: Looping over datetimes for simultaneous variable generation
>>>
>>> There are several problems evident here, and I guess some latent too.
>>>
>>> You don't refer to any `datetime' macro within the loop, so at best it
>>> would do the same things, regardless of the loop.
>>>
>>> The syntax ' ' means nothing to Stata. You may wish to evaluate
>>> numeric constants on the fly, for which the syntax would be something
>>> like  `=  tc(19aug2012 0:00:00)’
>>>
>>> The constant tc(00:05:00) seems unlikely to be what you intend.
>>>
>>> For an arbitrary numlist you need -foreach- not -forvalues-.
>>>
>>> Those points aside, a better strategy might to explain what you want
>>> to calculate, with enough about your data and some example data for
>>> people to follow.
>>> Nick
>>> [email protected]
>>>
>>>
>>> On 3 October 2013 10:18, Paul Balcombe
>>> <[email protected]> wrote:
>>>> I have a timeseries data set and I want to generate a number of variables that are conditional on each other and their previous values, so I want to create a value for the set of variables at each time period in my data. I thought I should use a forvalues command, but this is new to me and I have so far been unsuccessful: invalid syntax. below is the command I wish to make:
>>>>
>>>> forvalues datetime= ‘tc(19aug2012 00:00:00)’ (‘tc(00:05:00)’) ‘tc(18aug2013 23:00:00)’ {
>>>>                 replace seen=seen[_n-1] if seen==. & seen3[_n-1]<seen[_n-1]
>>>>                 replace segaspow=segaspow[_n-1] if seen==. & seen3[_n-1]<seen[_n-1]
>>>>                 replace seen2=seen2[_n-1] if seen==. & seen3[_n-1]<seen[_n-1]
>>>>                 replace seen3=seen2+seen3[_n-1] if seen==. & seen3[_n-1]<seen[_n-1]
>>>> }
>>>>
>>>> I may be describing the datetime functions incorrectly.
>>
>> *
>> *   For searches and help try:
>> *   http://www.stata.com/help.cgi?search
>> *   http://www.stata.com/support/faqs/resources/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/faqs/resources/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/faqs/resources/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/faqs/resources/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/faqs/resources/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/faqs/resources/statalist-faq/
*   http://www.ats.ucla.edu/stat/stata/
```

• Follow-Ups:
• References: