简体   繁体   中英

Why are there inequalities in an R for loop using a vector and using “:”?

I have not a real problem but I don't quite get the difference in my code due to different writing schemes.

The situation is as follows:

I wrote a for loop that should insert certain values in my function. Before I did this I defined the parameters to insert. The code looks like this:

yield <- rep(1, nrow(timeseries1))
pc <- c(1:1265)
tc <- c(1:1265)
for(i in 1:1265){
  pc[i] <- timeseries1$`CoCo-Preis`[i]
  tc[i] <- timeseries1$t[i]
  yield[i] <- yield.to.call(ytc,p=pc[i],t=tc[i],c=5,N=100)
}
yield <- data.table(yield)

I simply want to tell the loop to insert the values from i=1 to i=1265 but what he does is to define i as 1264L. When i run another code AFTER I did the above he assigns i to 1265. The code is:

for(i in c(1,1265)){
  pc[i] <- timeseries1$`CoCo-Preis`[i]
  tc[i] <- timeseries1$t[i]
  yield[i] <- yield.to.call(ytc,p=pc[i],t=tc[i],c=5,N=100)
}
yield <- data.table(yield)

(Note the new interval as a vector) Now he especially offers me the right solution for the last value. But when I only run this second code it does not yield the right solutions at all apart from only the first value. So my workaround is to run both codes after each other but I want to know why I simply cannot run the second code only or why the first code stops before the last value.

I hope that anyone can help.

EDIT:

yield.to.call <- function(ytc,p,c,t,f=4,N=100){
c <- c/f #new to adjust the coupon
if(t<92){t <- ((92-t)/(92-0))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+c/((1+(ytc/f)))^(t+11)+c/((1+(ytc/f)))^(t+12)+c/((1+(ytc/f)))^(t+13)+c/((1+(ytc/f)))^(t+14)+c/((1+(ytc/f)))^(t+15)+c/((1+(ytc/f)))^(t+16)+c/((1+(ytc/f)))^(t+17)+c/((1+(ytc/f)))^(t+18)+(c+N)/((1+(ytc/f)))^(t+19)-p}}
else if(t<184){t <- ((184-t)/(184-92))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+c/((1+(ytc/f)))^(t+11)+c/((1+(ytc/f)))^(t+12)+c/((1+(ytc/f)))^(t+13)+c/((1+(ytc/f)))^(t+14)+c/((1+(ytc/f)))^(t+15)+c/((1+(ytc/f)))^(t+16)+c/((1+(ytc/f)))^(t+17)+(c+N)/((1+(ytc/f)))^(t+18)-p}}
else if(t<275){t <- ((275-t)/(275-184))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+c/((1+(ytc/f)))^(t+11)+c/((1+(ytc/f)))^(t+12)+c/((1+(ytc/f)))^(t+13)+c/((1+(ytc/f)))^(t+14)+c/((1+(ytc/f)))^(t+15)+c/((1+(ytc/f)))^(t+16)+(c+N)/((1+(ytc/f)))^(t+17)-p}}
else if(t<365){t <- ((365-t)/(365-275))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+c/((1+(ytc/f)))^(t+11)+c/((1+(ytc/f)))^(t+12)+c/((1+(ytc/f)))^(t+13)+c/((1+(ytc/f)))^(t+14)+c/((1+(ytc/f)))^(t+15)+(c+N)/((1+(ytc/f)))^(t+16)-p}}
else if(t<457){t <- ((457-t)/(457-365))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+c/((1+(ytc/f)))^(t+11)+c/((1+(ytc/f)))^(t+12)+c/((1+(ytc/f)))^(t+13)+c/((1+(ytc/f)))^(t+14)+(c+N)/((1+(ytc/f)))^(t+15)-p}}
else if(t<548){t <- ((548-t)/(548-457))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+c/((1+(ytc/f)))^(t+11)+c/((1+(ytc/f)))^(t+12)+c/((1+(ytc/f)))^(t+13)+(c+N)/((1+(ytc/f)))^(t+14)-p}}
else if(t<639){t <- ((639-t)/(639-548))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+c/((1+(ytc/f)))^(t+11)+c/((1+(ytc/f)))^(t+12)+(c+N)/((1+(ytc/f)))^(t+13)-p}}
else if(t<730){t <- ((730-t)/(730-639))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+c/((1+(ytc/f)))^(t+11)+(c+N)/((1+(ytc/f)))^(t+12)-p}}
else if(t<821){t <- ((821-t)/(821-730))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+c/((1+(ytc/f)))^(t+10)+(c+N)/((1+(ytc/f)))^(t+11)-p}}
else if(t<915){t <- ((915-t)/(915-821))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+c/((1+(ytc/f)))^(t+9)+(c+N)/((1+(ytc/f)))^(t+10)-p}}
else if(t<1006){t <- ((1006-t)/(1006-915))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+c/((1+(ytc/f)))^(t+8)+(c+N)/((1+(ytc/f)))^(t+9)-p}}
else if(t<1097){t <- ((1097-t)/(1097-1006))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+c/((1+(ytc/f)))^(t+7)+(c+N)/((1+(ytc/f)))^(t+8)-p}} 
else if(t<1188){t <- ((1188-t)/(1188-1097))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+c/((1+(ytc/f)))^(t+6)+(c+N)/((1+(ytc/f)))^(t+7)-p}}
else if(t<1280){t <- ((1280-t)/(1280-1188))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+c/((1+(ytc/f)))^(t+5)+(c+N)/((1+(ytc/f)))^(t+6)-p}}
else if(t<1371){t <- ((1371-t)/(1371-1280)) 
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+c/((1+(ytc/f)))^(t+4)+(c+N)/((1+(ytc/f)))^(t+5)-p}}
else if(t<1461){t <- ((1461-t)/(1461-1371))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+c/((1+(ytc/f)))^(t+3)+(c+N)/((1+(ytc/f)))^(t+4)-p}}
else if(t<1553){t <- ((1553-t)/(1553-1461)) 
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+c/((1+(ytc/f)))^(t+2)+(c+N)/((1+(ytc/f)))^(t+3)-p}}
else if(t<1645){t <- ((1645-t)/(1645-1553))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+c/((1+(ytc/f)))^(t+1)+(c+N)/((1+(ytc/f)))^(t+2)-p}}
else if(t<1736){t <- ((1736-t)/(1736-1645))
q <- function(ytc,p,c,t,f=4,N=100){c/((1+(ytc/f)))^(t)+(N+c)/((1+(ytc/f)))^(t+1)-p}}  
else if(t<1826){t<-((1826-t)/(1826-1736))
q <- function(ytc,p,c,t,f=4,N=100){(N+c)/(1+(ytc/f))^(t)-p}} 
else q <- function(ytc,p,c,t=0,f=4,N=100){((N+c)/p)-((ytc/f))-1} 

q2<- function(ytc){q(ytc,p,c,t,N=100)}
yield.t.c <- uniroot(q2,c(-1,10),tol = .Machine$double.eps^0.5)$root 
return(yield.t.c)
}

Sample data:

structure(list(Datum = structure(c(17960, 17961, 17962, 17963, 
17966, 17967), class = "Date"), `CoCo-Preis` = c(98.19, 98.14, 
98.21, 97.97, 98.01, 98.03), `CDS-Spread` = c(55.67, 55.23, 55.64, 
56.27, 55.05, 53.33), Aktienpreis = c(4.244, 4.3145, 4.163, 4.0785, 
4.1375, 4.142), Zins = c(-0.287467, -0.31443, -0.360349, -0.351772, 
-0.363637, -0.36096), t = c(1819L, 1820L, 1821L, 1822L, 1825L, 
1826L)), row.names = 1260:1265, class = "data.frame")

When reproducing, it seems the loop stops at the 2nd but last iteration of the loop, hence your i being stuck at 1264L or in the sample data at the 5th iteration. From here it was clear that the problem is with the intervals of the uniroot function. As per the suggestion in that link, it worked for me when adding the extendInt = "yes" to the line.

yield.t.c <- uniroot(q2,c(-1,10),tol = .Machine$double.eps^0.5, extendInt = "yes")$root 

Hope it helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM