Newbie code to count runs of up or down moves
Debugging nested loops is something we try to avoid in R, because there are usually more efficient ways to accomplish things.
Does this do what you want?
hist(rle(diff(z)<0)$lengths)
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go...
Live: OO#.. Dead: OO#.. Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#. rocks...1k
---------------------------------------------------------------------------
Sent from my phone. Please excuse my brevity.
Newbie1234 <larry at riskengineer.com> wrote:
I hope this text does not come out unreadable as before. It is
readable in R
Studio.. What I am trying to do is take a time-series of prices and
create
a histogram of the run lengths, where a run is a sequence of all up
moves or
all down moves.
Arun of length k is sequence of k moves all in the same direction
followed
by a move in the opposite direction.
To do this I first difference the time series.
Two first differences of the same sign followed by a first difference
of
opposite sign is a run length 2.
The outer loop is on the run length denoted by k. The middle loop is
over
the date the run starts denoted by i. The inner most loop is on dates
from
date i +1 through date i + k. indexed by j.
At each j , I test to see if the price change at date j has the same
sign as
that on date j-1. If after testing that the run has a length of at
least k
and that is not more than k to determine if starting on date i there
was a
run that was exactly of length k, then I increment y[k].
********************************
The code follows, then after the next ********, is the output with
error
messages.
z<-c(3,1,4,5,2,1,0,3,5,8)
z
length(z)
y<-c(0,0,0,0,0,0,0,0,0,0)
y
length(y)
zdiff = diff(z)
zdiff
n<-length(zdiff)
n
x<-zdiff
f<-function(x,y)
{
for (k in 1:n){
for (i in 1:n-k){
endOfRun<-FALSE
anotherRunStep<-TRUE
if(i == (n-k)) endofrun<-TRUE
else if(x[i+k+1]*x[i+k] > 0) endOfRun<-FALSE
for(j in i+1:i+k){
if ((x[j] * x[j-1] < 0){
anotherRunStep<-FALSE
break
} # endif
} # endforj
if (endOfRun && anotherRunStep) y[k]<-y[k]+1
} # endfori
} #e endfork
return(y)
}
f(x,y)
************************
[1] 3 1 4 5 2 1 0 3 5 8
length(z)
[1] 10
y<-c(0,0,0,0,0,0,0,0,0,0) y
[1] 0 0 0 0 0 0 0 0 0 0
length(y)
[1] 10
zdiff = diff(z) zdiff
[1] -2 3 1 -3 -1 -1 3 2 3
n<-length(zdiff) n
[1] 9
x<-zdiff f<-function(x,y)
+ {
+ for (k in 1:n){
+ for (i in 1:n-k){
+ endOfRun<-FALSE
+ anotherRunStep<-TRUE
+ if(i == (n-k)) endofrun<-TRUE
+ else if(x[i+k+1]*x[i+k] > 0) endOfRun<-FALSE
+ for(j in i+1:i+k){
+ if ((x[j] * x[j-1] < 0){
Error: unexpected '{' in:
" for(j in i+1:i+k){
if ((x[j] * x[j-1] < 0){"
anotherRunStep<-FALSE
break
Error: no loop for break/next, jumping to top level
} # endif
Error: unexpected '}' in " }"
} # endforj
Error: unexpected '}' in " }"
if (endOfRun && anotherRunStep) y[k]<-y[k]+1
Error: object 'endOfRun' not found
} # endfori
Error: unexpected '}' in " }"
} #e endfork
Error: unexpected '}' in " }"
return(y)
Error: no function to return from, jumping to top level
}
Error: unexpected '}' in "}"
f(x,y)
[1] 6 5 6 5 5 6 5 6 0 0 -- View this message in context: http://r.789695.n4.nabble.com/Newbie-code-to-count-runs-of-up-or-down-moves-tp4662423p4662459.html Sent from the R help mailing list archive at Nabble.com.
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.