I have used ifelse in count variables to count the number of times in a
simulation the values of a vector of logprice fall within mutually exclusive
ranges. However, there is a double count in the result i.e. i am getting output
indicating values falling in mutually exclusive ranges. Here is the code and
result
R script
niter = 1e5 # number of iterations is 10^5
CountLoss = rep(0,niter)
CountProf = rep (0,niter)
set.seed(2009) # enables reproducibility of result if script run again"
for (i in 1:niter)
{
r = rnorm(100,mean=.05/253,
sd=.23/sqrt(253)) # generate 100 random normal numbers
logPrice = log(1e6) + cumsum(r) #vector of 100 days log prices
maxlogP = max(logPrice) # max price over next 100 days
minlogP = min(logPrice)
CountLoss[i] <- ifelse (minlogP < log(950000), 1, ifelse (maxlogP >
log (1000000), 0, 1))
CountProf[i] <- ifelse (maxlogP < log (1100000),0,1)
}
sum(CountLoss)
mean(CountLoss) # fraction of times out of niter that stock is sold for a loss
in a 100 day period
sum(CountProf)
mean(CountProf) # fraction of times out of niter that stock is sold for a profit
in a 100 day period
Output
sum(CountLoss)
[1] 64246> mean(CountLoss) # fraction of times out of niter that stock is sold for a
loss in a 100 day period
[1] 0.64246> sum(CountProf)
[1] 51857> mean(CountProf) # fraction of times out of niter that stock is sold for a
profit in a 100 day period
[1] 0.51857
CountLoss and CountProf should sum to less than the number of interations. When
I troubleshoot by reducing the number of iterations and that size of the
logprice, I can't reproduce the contradicion.
On 26/06/2013 11:40 AM, Neville O'Reilly wrote:> I have used ifelse in count variables to count the number of times in a simulation the values of a vector of logprice fall within mutually exclusive ranges. However, there is a double count in the result i.e. i am getting output indicating values falling in mutually exclusive ranges. Here is the code and result > R script > niter = 1e5 # number of iterations is 10^5 > CountLoss = rep(0,niter) > CountProf = rep (0,niter) > set.seed(2009) # enables reproducibility of result if script run again" > for (i in 1:niter) > { > r = rnorm(100,mean=.05/253, > sd=.23/sqrt(253)) # generate 100 random normal numbers > logPrice = log(1e6) + cumsum(r) #vector of 100 days log prices > maxlogP = max(logPrice) # max price over next 100 days > minlogP = min(logPrice) > CountLoss[i] <- ifelse (minlogP < log(950000), 1, ifelse (maxlogP > log (1000000), 0, 1)) > CountProf[i] <- ifelse (maxlogP < log (1100000),0,1) > } > sum(CountLoss) > mean(CountLoss) # fraction of times out of niter that stock is sold for a loss in a 100 day period > sum(CountProf) > mean(CountProf) # fraction of times out of niter that stock is sold for a profit in a 100 day period > > Output > sum(CountLoss) > [1] 64246 > > mean(CountLoss) # fraction of times out of niter that stock is sold for a loss in a 100 day period > [1] 0.64246 > > sum(CountProf) > [1] 51857 > > mean(CountProf) # fraction of times out of niter that stock is sold for a profit in a 100 day period > [1] 0.51857 > > CountLoss and CountProf should sum to less than the number of interations. When I troubleshoot by reducing the number of iterations and that size of the logprice, I can't reproduce the contradicion.I don't see a contradiction. Both CountLoss and CountProf are less than niter. The logic of your test doesn't imply that sum(CountLoss) + sum(CountProf) should be less than niter; e.g. a case where minlogP is less than log(950000) and maxlogP > log(1100000) would be counted in both. Duncan Murdoch
On Jun 26, 2013, at 17:40 , Neville O'Reilly wrote:> I have used ifelse in count variables to count the number of times in a simulation the values of a vector of logprice fall within mutually exclusive ranges. However, there is a double count in the result i.e. i am getting output indicating values falling in mutually exclusive ranges. Here is the code and result > R scriptDon't use ifelse, it just confuses the logic. As far as I can tell, the code is equivalent (except for integer conversion) to CountLoss[i] <- (minlogP < log(950000)) | (maxlogP <= log (1000000)) CountProf[i] <- (maxlogP >= log (1100000)) and that doesn't look mutually exclusive to me.> niter = 1e5 # number of iterations is 10^5 > CountLoss = rep(0,niter) > CountProf = rep (0,niter) > set.seed(2009) # enables reproducibility of result if script run again" > for (i in 1:niter) > { > r = rnorm(100,mean=.05/253, > sd=.23/sqrt(253)) # generate 100 random normal numbers > logPrice = log(1e6) + cumsum(r) #vector of 100 days log prices > maxlogP = max(logPrice) # max price over next 100 days > minlogP = min(logPrice) > CountLoss[i] <- ifelse (minlogP < log(950000), 1, ifelse (maxlogP > log (1000000), 0, 1)) > CountProf[i] <- ifelse (maxlogP < log (1100000),0,1) > } > sum(CountLoss) > mean(CountLoss) # fraction of times out of niter that stock is sold for a loss in a 100 day period > sum(CountProf) > mean(CountProf) # fraction of times out of niter that stock is sold for a profit in a 100 day period > > Output > sum(CountLoss) > [1] 64246 >> mean(CountLoss) # fraction of times out of niter that stock is sold for a loss in a 100 day period > [1] 0.64246 >> sum(CountProf) > [1] 51857 >> mean(CountProf) # fraction of times out of niter that stock is sold for a profit in a 100 day period > [1] 0.51857 > > CountLoss and CountProf should sum to less than the number of interations. When I troubleshoot by reducing the number of iterations and that size of the logprice, I can't reproduce the contradicion. > > ______________________________________________ > 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.-- Peter Dalgaard, Professor Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
I don't see that you have set up mutually exclusive ranges. If we
modify your code so save the maxlogP and minlogP values:
niter = 1e5 # number of iterations is 10^5
CountLoss = rep(0,niter)
CountProf = rep (0,niter)
maxlogP <- rep(0, ninter)
minlogP <- rep(0, ninter)
set.seed(2009) # enables reproducibility of result if script run
again"
for (i in 1:niter)
{
r = rnorm(100,mean=.05/253,
sd=.23/sqrt(253)) # generate 100 random normal numbers
logPrice = log(1e6) + cumsum(r) #vector of 100 days log prices
maxlogP[i] = max(logPrice) # max price over next 100 days
minlogP[i] = min(logPrice)
CountLoss[i] <- ifelse (minlogP[i] < log(950000), 1, ifelse
(maxlogP[i] > log (1000000), 0, 1))
CountProf[i] <- ifelse (maxlogP[i] < log (1100000),0,1)
}
both <- which(CountLoss+CountProf>1)
length(both)
# 18484
head(both)
# [1] 1 5 9 12 15 25
ifelse (minlogP[1] < log(950000), 1, ifelse (maxlogP[1] > log
(1000000), 0, 1))
# [1] 1
ifelse (maxlogP[1] < log(1100000),0,1)
# [1] 1
exp(maxlogP[1])
# [1] 1204589
exp(minlogP[1])
# [1] 932747.5
Your first simulation meets both criteria along 18483 others!
-------------------------------------
David L Carlson
Associate Professor of Anthropology
Texas A&M University
College Station, TX 77840-4352
-----Original Message-----
From: r-help-bounces at r-project.org
[mailto:r-help-bounces at r-project.org] On Behalf Of Neville O'Reilly
Sent: Wednesday, June 26, 2013 10:41 AM
To: r-help at r-project.org
Subject: [R] Ifelse leading to inconsistent result
I have used ifelse in count variables to count the number of times
in a simulation the values of a vector of logprice fall within
mutually exclusive ranges. However, there is a double count in the
result i.e. i am getting output indicating values falling in
mutually exclusive ranges. Here is the code and result
R script
niter = 1e5 # number of iterations is 10^5
CountLoss = rep(0,niter)
CountProf = rep (0,niter)
set.seed(2009) # enables reproducibility of result if script run
again"
for (i in 1:niter)
{
r = rnorm(100,mean=.05/253,
sd=.23/sqrt(253)) # generate 100 random normal numbers
logPrice = log(1e6) + cumsum(r) #vector of 100 days log prices
maxlogP = max(logPrice) # max price over next 100 days
minlogP = min(logPrice)
CountLoss[i] <- ifelse (minlogP < log(950000), 1, ifelse
(maxlogP> log (1000000), 0, 1))
CountProf[i] <- ifelse (maxlogP < log (1100000),0,1)
}
sum(CountLoss)
mean(CountLoss) # fraction of times out of niter that stock is sold
for a loss in a 100 day period
sum(CountProf)
mean(CountProf) # fraction of times out of niter that stock is sold
for a profit in a 100 day period
Output
sum(CountLoss)
[1] 64246> mean(CountLoss) # fraction of times out of niter that stock is
sold for a loss in a 100 day period
[1] 0.64246> sum(CountProf)
[1] 51857> mean(CountProf) # fraction of times out of niter that stock is
sold for a profit in a 100 day period
[1] 0.51857
CountLoss and CountProf should sum to less than the number of
interations. When I troubleshoot by reducing the number of
iterations and that size of the logprice, I can't reproduce the
contradicion.
______________________________________________
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.