I have the following lines of code: ind <- rollapply(GSPC, 200, mean) signal <- ifelse(diff(ind, 5) > 0 , 1 , -1) signal[is.na(signal)] <- 0 I never get a value of -1 for signal even though I know diff(ind , 5) is less than zero frequently. It looks like when diff(ind , 5) is less than zero, signal gets set to 0 instead of - 1. Any ideas why ? Here's some information on ind and diff(ind, 5) :> mode(diff(ind, 5) >0)[1] "logical"> class(diff(ind, 5) >0 )[1] "zoo"> str(diff(ind, 5) > 0 )?zoo? series from 1990-05-31 to 2010-12-02 Data: logi [1:5171, 1] FALSE FALSE FALSE FALSE FALSE FALSE ... - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr "GSPC.Adjusted" Index: Date[1:5171], format: "1990-05-31" "1990-06-01" "1990-06-04" "1990-06-05" "1990-06-06" "1990-06-07" "1990-06-08" "1990-06-11" ...> class(ind)[1] "zoo"> mode(ind)[1] "numeric"> str(ind)?zoo? series from 1990-05-23 to 2010-12-02 Data: num [1:5176, 1] 339 339 338 338 338 ... - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr "GSPC.Adjusted" Index: Date[1:5176], format: "1990-05-23" "1990-05-24" "1990-05-25" "1990-05-29" "1990-05-30" "1990-05-31" "1990-06-01" "1990-06-04" -- View this message in context: http://r.789695.n4.nabble.com/why-doesn-t-ifelse-work-tp3482680p3482680.html Sent from the R help mailing list archive at Nabble.com.
Hi Eric, tough to say. Please try to provide commented, minimal, self-contained, reproducible code. Cheers Andrew On Thu, Apr 28, 2011 at 06:46:16PM -0700, eric wrote:> I have the following lines of code: > > ind <- rollapply(GSPC, 200, mean) > signal <- ifelse(diff(ind, 5) > 0 , 1 , -1) > signal[is.na(signal)] <- 0 > > I never get a value of -1 for signal even though I know diff(ind , 5) is > less than zero frequently. It looks like when diff(ind , 5) is less than > zero, signal gets set to 0 instead of - 1. Any ideas why ? Here's some > information on ind and diff(ind, 5) : > > > mode(diff(ind, 5) >0) > [1] "logical" > > class(diff(ind, 5) >0 ) > [1] "zoo" > > str(diff(ind, 5) > 0 ) > ???zoo??? series from 1990-05-31 to 2010-12-02 > Data: logi [1:5171, 1] FALSE FALSE FALSE FALSE FALSE FALSE ... > - attr(*, "dimnames")=List of 2 > ..$ : NULL > ..$ : chr "GSPC.Adjusted" > Index: Date[1:5171], format: "1990-05-31" "1990-06-01" "1990-06-04" > "1990-06-05" "1990-06-06" "1990-06-07" "1990-06-08" "1990-06-11" ... > > class(ind) > [1] "zoo" > > mode(ind) > [1] "numeric" > > str(ind) > ???zoo??? series from 1990-05-23 to 2010-12-02 > Data: num [1:5176, 1] 339 339 338 338 338 ... > - attr(*, "dimnames")=List of 2 > ..$ : NULL > ..$ : chr "GSPC.Adjusted" > Index: Date[1:5176], format: "1990-05-23" "1990-05-24" "1990-05-25" > "1990-05-29" "1990-05-30" "1990-05-31" "1990-06-01" "1990-06-04" > > -- > View this message in context: http://r.789695.n4.nabble.com/why-doesn-t-ifelse-work-tp3482680p3482680.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.-- Andrew Robinson Program Manager, ACERA Department of Mathematics and Statistics Tel: +61-3-8344-6410 University of Melbourne, VIC 3010 Australia (prefer email) http://www.ms.unimelb.edu.au/~andrewpr Fax: +61-3-8344-4599 http://www.acera.unimelb.edu.au/ Forest Analytics with R (Springer, 2011) http://www.ms.unimelb.edu.au/FAwR/ Introduction to Scientific Programming and Simulation using R (CRC, 2009): http://www.ms.unimelb.edu.au/spuRs/
Hi: It seems to work for me...here's a reproducible example. set.seed(2053) date <- seq(as.Date('1990-01-01'), by = 'days', length = 5000) range(date) # [1] "1990-01-01" "2003-09-09" date <- sort(sample(date, 2000)) tdata <- data.frame(date = date, GSPC = rpois(2000, 1000)) library(zoo) tdata2 <- tdata # copy data frame just to be on the safe side # Index GSPC by date tdata2$GSPC <- with(tdata2, zoo(GSPC, date)) ind <- with(tdata2, rollmean(GSPC, 200, align = 'right')) signal <- ifelse(diff(ind, 5) > 0, 1, -1)> table(signal)signal -1 1 903 893 Perhaps you can explain your problem in this context. Dennis On Thu, Apr 28, 2011 at 6:46 PM, eric <ericstrom at aol.com> wrote:> I have the following lines of code: > > ind <- rollapply(GSPC, 200, mean) > signal <- ifelse(diff(ind, 5) > 0 , 1 , -1) > signal[is.na(signal)] <- 0 > > I never get a value of -1 for signal even though I know diff(ind , 5) is > less than zero frequently. It looks like when diff(ind , 5) is less than > zero, signal gets set to 0 instead of - 1. Any ideas why ? ?Here's some > information on ind and diff(ind, 5) : > >> mode(diff(ind, 5) >0) > [1] "logical" >> class(diff(ind, 5) >0 ) > [1] "zoo" >> str(diff(ind, 5) > 0 ) > ?zoo? series from 1990-05-31 to 2010-12-02 > ?Data: logi [1:5171, 1] FALSE FALSE FALSE FALSE FALSE FALSE ... > ?- attr(*, "dimnames")=List of 2 > ?..$ : NULL > ?..$ : chr "GSPC.Adjusted" > ?Index: ?Date[1:5171], format: "1990-05-31" "1990-06-01" "1990-06-04" > "1990-06-05" "1990-06-06" "1990-06-07" "1990-06-08" "1990-06-11" ... >> class(ind) > [1] "zoo" >> mode(ind) > [1] "numeric" >> str(ind) > ?zoo? series from 1990-05-23 to 2010-12-02 > ?Data: num [1:5176, 1] 339 339 338 338 338 ... > ?- attr(*, "dimnames")=List of 2 > ?..$ : NULL > ?..$ : chr "GSPC.Adjusted" > ?Index: ?Date[1:5176], format: "1990-05-23" "1990-05-24" "1990-05-25" > "1990-05-29" "1990-05-30" "1990-05-31" "1990-06-01" "1990-06-04" > > -- > View this message in context: http://r.789695.n4.nabble.com/why-doesn-t-ifelse-work-tp3482680p3482680.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. >
Hi Eric, On Thu, Apr 28, 2011 at 6:46 PM, eric <ericstrom at aol.com> wrote:> I have the following lines of code: > > ind <- rollapply(GSPC, 200, mean) > signal <- ifelse(diff(ind, 5) > 0 , 1 , -1)If you had looked at signal here, you would see that it is logical.> signal[is.na(signal)] <- 0but this is not doing what you almost certainly expect it is. Consider: ind[is.na(ind)] ind[!is.na(ind)] nothing is selected. Gabor or Achim would know for sure, but I believe this is because zoos have methods for extraction (i.e., `[.zoo`), which does not work with matrices, and is.na(ind) returns a matrix. So all you are doing with: signal[is.na(signal)] <- 0 is converting the class from logical to numeric which is why you get 0s and 1s instead of TRUEs and FALSEs.> > I never get a value of -1 for signal even though I know diff(ind , 5) is > less than zero frequently. It looks like when diff(ind , 5) is less than > zero, signal gets set to 0 instead of - 1. Any ideas why ? ?Here's some > information on ind and diff(ind, 5) : > >> mode(diff(ind, 5) >0) > [1] "logical" >> class(diff(ind, 5) >0 ) > [1] "zoo"This should have set off red flags. You are using a core, nongeneric function, ifelse, with a very special class of object. In fact, even your test is not a regular old logical object, it is a zoo. You can get lucky and everything still work as expected, and often times authors have written methods that accompany their classes so everything is handled automagically in the background without you ever needing to know about it. But in this case, ifelse is not generic, so there are not any special methods written for it (side note, there is an ifelse.zoo, but it also does not quite do what I think you want). If you look at the code for ifelse, you will see that it returns the results of the test, AFTER updating any values that meet (or do not meet) the test AND are not NA. But wait, we already saw earlier what the results of: ind[!is.na(ind)] were, and you can tell from the class of your test (class(diff(ind, 5) > 0) that it is a zoo itself. This all seems to end up with ifelse() not seeing any values that match the criteria, so it simple returns the results of the the test itself (i.e., diff(ind, 5) > 0). Then you try to replace any NA values with 0, which converts the logical test results to numeric and because of how logical data is stored (FALSE = 0, TRUE = 1), you get a bunch of 0s and 1s. David already alluded to this solution, but you can use coredata (see ?zoo for details) to get what I suspect are the results you are after: signal <- ifelse(diff(coredata(ind), 5) > 0, 1, -1) mind you "signal" will not be a zoo anymore. Cheers, Josh>> str(diff(ind, 5) > 0 ) > ?zoo? series from 1990-05-31 to 2010-12-02 > ?Data: logi [1:5171, 1] FALSE FALSE FALSE FALSE FALSE FALSE ... > ?- attr(*, "dimnames")=List of 2 > ?..$ : NULL > ?..$ : chr "GSPC.Adjusted" > ?Index: ?Date[1:5171], format: "1990-05-31" "1990-06-01" "1990-06-04" > "1990-06-05" "1990-06-06" "1990-06-07" "1990-06-08" "1990-06-11" ... >> class(ind) > [1] "zoo" >> mode(ind) > [1] "numeric" >> str(ind) > ?zoo? series from 1990-05-23 to 2010-12-02 > ?Data: num [1:5176, 1] 339 339 338 338 338 ... > ?- attr(*, "dimnames")=List of 2 > ?..$ : NULL > ?..$ : chr "GSPC.Adjusted" > ?Index: ?Date[1:5176], format: "1990-05-23" "1990-05-24" "1990-05-25" > "1990-05-29" "1990-05-30" "1990-05-31" "1990-06-01" "1990-06-04" > > -- > View this message in context: http://r.789695.n4.nabble.com/why-doesn-t-ifelse-work-tp3482680p3482680.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. >-- Joshua Wiley Ph.D. Student, Health Psychology University of California, Los Angeles http://www.joshuawiley.com/