Yes > bar <- function(y = "12345"){ + message(y) + } > foo <- function(x = "a", y = "b"){ + bar(y = y) + } > bar() 12345 > bar(y = "abc") abc > foo() b > foo(y = "xyz") xyz
ir. Thierry Onkelinx Instituut voor natuur- en bosonderzoek / Research Institute for Nature and Forest team Biometrie & Kwaliteitszorg / team Biometrics & Quality Assurance Kliniekstraat 25 1070 Anderlecht Belgium To call in the statistician after the experiment is done may be no more than asking him to perform a post-mortem examination: he may be able to say what the experiment died of. ~ Sir Ronald Aylmer Fisher The plural of anecdote is not data. ~ Roger Brinner The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from a given body of data. ~ John Tukey 2015-05-13 17:43 GMT+02:00 Glenn Schultz <glennmschu...@me.com>: > Hi Thierry, > > Last question I promise. This function is often embedded in other > functions which call various analytic functions for mortgage backed > securities like total return etc. If I understand you correctly the > default is set in the TermStructure function. This is the first software > package I have built so sometimes my understanding is incomplete due to a > lack of experience. If I provide "ns" default in the function and the user > chooses an alternative such as "cs" will that flow to method? > > for example: > PassThroughAnalytic(bond.id = foo, tradedate= foo, method = cs, price){ > bond.id <- MBS(bond.id = bond.id) > rates.data <- rate(trade.date = foo) > TermStrucuture <- TermStructure(rate.data = rates.data, method = method) > *#if I understand correctly the method = "cs" will override the default > value "ns" in TermStructure * > MtgCashFlow <- MortgageCashFlow(bond.id = bond.id, tradedate = tradedate, > price = price) > KeyRate <- MtgKeyRate(trade.date = trade.date, MtgCashFlow = MtgCashFlow} > > Thanks, > Glenn > > > > On May 13, 2015, at 02:53 AM, Thierry Onkelinx <thierry.onkel...@inbo.be> > wrote: > > Dear Glenn, > > Please keep the mailing list in cc. > > In this case I would drop the "signature" like values and use correct > defaults. > > TermStructure <- function(rates.data, method = "ns") > > you can drop if(missing(method)) method = "ns" in that case. > > Best regards, > > ir. Thierry Onkelinx > Instituut voor natuur- en bosonderzoek / Research Institute for Nature and > Forest > team Biometrie & Kwaliteitszorg / team Biometrics & Quality Assurance > Kliniekstraat 25 > 1070 Anderlecht > Belgium > > To call in the statistician after the experiment is done may be no more > than asking him to perform a post-mortem examination: he may be able to say > what the experiment died of. ~ Sir Ronald Aylmer Fisher > The plural of anecdote is not data. ~ Roger Brinner > The combination of some data and an aching desire for an answer does not > ensure that a reasonable answer can be extracted from a given body of data. > ~ John Tukey > > 2015-05-12 13:43 GMT+02:00 Glenn Schultz <glennmschu...@me.com>: > >> Hi Thierry, >> Thanks, I see what you are saying. I should alter the code to test for >> values, correct? >> >> Glenn >> >> Sent from my iPhone >> >> On May 12, 2015, at 2:40 AM, Thierry Onkelinx <thierry.onkel...@inbo.be> >> wrote: >> >> Dear Glenn, >> >> I think that you are confusing the signature of a method and the default >> values of of function. It looks like you want the signature(rates.data = >> "character", method = "character"). But you are setting "character" as >> default value of both function arguments. Since you define a default value >> for methods, it will not be missing when you omit is from the call. >> >> Best regards, >> >> ir. Thierry Onkelinx >> Instituut voor natuur- en bosonderzoek / Research Institute for Nature >> and Forest >> team Biometrie & Kwaliteitszorg / team Biometrics & Quality Assurance >> Kliniekstraat 25 >> 1070 Anderlecht >> Belgium >> >> To call in the statistician after the experiment is done may be no more >> than asking him to perform a post-mortem examination: he may be able to say >> what the experiment died of. ~ Sir Ronald Aylmer Fisher >> The plural of anecdote is not data. ~ Roger Brinner >> The combination of some data and an aching desire for an answer does not >> ensure that a reasonable answer can be extracted from a given body of data. >> ~ John Tukey >> >> 2015-05-11 17:36 GMT+02:00 Glenn Schultz <glennmschu...@me.com>: >> >>> Hi Thierry, >>> >>> Below is the function >>> setMethod("initialize", signature("TermStructure"), function(.Object, >>> ..., tradedate = "character", period = "numeric", date = "character", >>> spotrate = "numeric", forwardrate = "numeric", TwoYearFwd = "numeric", >>> TenYearFwd = "numeric") { .Object@tradedate = tradedate .Object@period = >>> period .Object@date = date .Object@spotrate = spotrate .Object@ >>> forwardrate = forwardrate .Object@TwoYearFwd = TwoYearFwd .Object@ >>> TenYearFwd = TenYearFwd return(.Object) callNextMethod(.Object,...) }) >>> #' The TermStructure constructor function it is a wrapper function >>> around the package termstrc #' #' This is a wrapper function around >>> the R package termstrc. The function passes swap rate data #' cash >>> flows the to termstrc and creates the TermStructure object used by Bondlab. >>> #' The function call rates data processes the yield curve and derives >>> cashflow #' for the daily close swap curve. A Rates object must be >>> called in the local #' environment for this function to work. #' @param >>> rates.data A character string representing the data for which the user #' >>> would like to call the swap curve #' @param method A character string >>> indicating the fitting method ns = Nelson Siegel, dl = Diebold Lee, #' >>> sv = Severson, asv = adjusted Severson, cs = cubic spline (not yet >>> implemented in Bond Lab). #' For addiition details see the termstrc >>> documentation. #' @examples #' \dontrun{ #' TermStructure(rates.data = >>> "01-10-2013", method = "ns")} #' @importFrom lubridate %m+% #' >>> @importFrom lubridate years #' @importFrom lubridate day #' @importFrom >>> lubridate month #' @importFrom termstrc estim_nss estim_cs spotrates >>> forwardrates #'@export TermStructure TermStructure <- function( >>> rates.data = "character", method = "character"){ #function(trade.date >>> = "character", method = "character") #Error Trap User inputs to the >>> function if(missing(rates.data)) stop("missing rates data object") # >>> this is the code snippet that works in MAC but not windows *#Default to >>> Nelson-Siegel* * if(missing(method)) method = "ns"* #Default to >>> parametric if(method == "cs") stop("cubic spline not implemented") #Check >>> that the user input a valid method CheckMethod <- c("ns", "dl", "sv", " >>> asv", "cs") if(!method %in% CheckMethod) stop ("Invalid 'method' Value") >>> # pass the yield curve to the function rates.data <- rates.data #set >>> the column counter to make cashflows for termstrucutre ColCount <- >>> as.numeric(ncol(rates.data)) Mat.Years <- as.numeric(rates.data[2,2: >>> ColCount]) Coupon.Rate <- as.numeric(rates.data[1,2:ColCount]) >>> Issue.Date <- as.Date(rates.data[1,1]) #initialize coupon bonds S3 >>> class #This can be upgraded when bondlab has portfolio function ISIN <- >>> vector() MATURITYDATE <- vector() ISSUEDATE <- vector() COUPONRATE <- >>> vector() PRICE <- vector() ACCRUED <- vector() CFISIN <- vector() CF <- >>> vector() DATE <- vector() CASHFLOWS <- list(CFISIN,CF,DATE) names( >>> CASHFLOWS) <- c("ISIN","CF","DATE") TODAY <- vector() data <- list() >>> TSInput <- list() ### Assign Values to List Items ######### data = >>> NULL data$ISIN <- colnames(rates.data[2:ColCount]) data$ISSUEDATE <- >>> rep(as.Date(rates.data[1,1]),ColCount - 1) data$MATURITYDATE <- >>> sapply(Mat.Years, function(Mat.Years = Mat.Years, Issue = Issue.Date) { >>> Maturity = if(Mat.Years < 1) {Issue %m+% months(round(Mat.Years * >>> months.in.year))} else {Issue %m+% years(as.numeric(Mat.Years))} return >>> (as.character(Maturity)) }) data$COUPONRATE <- ifelse(Mat.Years < 1, 0, >>> Coupon.Rate) data$PRICE <- ifelse(Mat.Years < 1, (1 + (Coupon.Rate/100 >>> ))^(Mat.Years * -1) * 100, 100) data$ACCRUED <- rep(0, ColCount -1) >>> for(j in 1:(ColCount-1)){ Vector.Length <- as.numeric(round(difftime( >>> data[[3]][j], data[[2]][j], units = c("weeks"))/weeks.in.year,0)) >>> Vector.Length <- ifelse(Vector.Length < 1, 1, Vector.Length * >>> pmt.frequency) #pmt.frequency should be input data$CASHFLOWS$ISIN <- >>> append(data$CASHFLOWS$ISIN, rep(data[[1]][j],Vector.Length)) data$ >>> CASHFLOWS$CF <- append(data$CASHFLOWS$CF, as.numeric(c(rep((data[[4]][j] >>> /100/pmt.frequency), Vector.Length-1) * min.principal, (min.principal + >>> (data$COUPONRATE[j]/100/pmt.frequency)* min.principal)))) by.months = >>> ifelse(data[[4]][j] == 0, round(difftime(data[[3]][j], rates.data[1,1])/ >>> days.in.month), 6) # this sets the month increment so that cashflows >>> can handle discount bills data$CASHFLOWS$DATE <- append(data$CASHFLOW$ >>> DATE, seq(as.Date(rates.data[1,1]) %m+% months(as.numeric(by.months)), >>> as.Date(data[[3]][j]), by = as.character(paste(by.months, "months", sep >>> = " ")))) } #The Loop Ends here and the list is made data$TODAY <- >>> as.Date(rates.data[1,1]) TSInput[[as.character(rates.data[1,1])]] <- c( >>> data) #set term strucuture input (TSInput) to class couponbonds class( >>> TSInput) <- "couponbonds" #Fit the term structure of interest rates >>> if(method != "cs") {TSFit <- estim_nss(dataset = TSInput, group = >>> as.character(rates.data[1,1]), matrange = "all", method = method)} else >>> {TSFit <- estim_cs(bonddata = TSInput, group = as.character(rates.data[1 >>> ,1]), matrange = "all", rse = TRUE)} #Return the coefficient vector >>> to be passed in to the spot and forward rate functions #Maybe have the >>> method choosen based on the one that gives the smallest RMSE Vector <- >>> switch(method, ns = unname(TSFit$opt_result[[1]]$par[c("beta0", "beta1", >>> "beta2", "tau1")]), dl = unname(TSFit$opt_result[[1]]$par[c("beta0", " >>> beta1", "beta2")]), sv = unname(TSFit$opt_result[[1]]$par[c("beta0", " >>> beta1", "beta2", "tau1", "beta3", "tau2")]), asv = unname(TSFit$ >>> opt_result[[1]]$par[c("beta0", "beta1", "beta2", "tau1", "tau2", "tau3" >>> )]), #cs = need to figure this out ) #Calculate the spot rate curve >>> and determine the forward rates needed to period <- seq(from = 1, to = >>> 492, by = 1) #Use the date from the cashflow file date <- seq(as.Date( >>> rates.data[1,1]) %m+% months(1), as.Date(data[[3]][j]), by="1 months") >>> spot.rate.curve <- spotrates(method = method, beta = Vector, m = seq( >>> from = 1/12, to = 492/12, by = 1/12)) forward.rate.curve <- >>> forwardrates(method = method, beta = Vector, m = seq(from = 1/12, to = >>> 492/12, by = 1/12)) Two.Year.Fwd <- (((1 + spot.rate.curve[seq(from = >>> 25, to = 385, by = 1)]) ^ (period[seq(from = 25, to = 385, by = 1)]/12) >>> / (1 + spot.rate.curve[seq(from = 1, to = 361, by = 1)]) ^ (period[seq( >>> from = 1, to = 361, by = 1)]/12))^(1/2))-1 Ten.Year.Fwd <- (((1 + >>> spot.rate.curve[seq(from = 121, to = 481, by = 1)]) ^ (period[seq(from = >>> 121, to = 481, by = 1)]/12) / (1 + spot.rate.curve[seq(from = 1, to = >>> 361, by = 1)]) ^ (period[seq(from = 1, to = 361, by = 1)]/12))^(1/10))-1 >>> new("TermStructure", tradedate = as.character(rates.data[1,1]), >>> period = as.numeric(period), date = as.character(date), spotrate = >>> spot.rate.curve, forwardrate = forward.rate.curve, TwoYearFwd = >>> Two.Year.Fwd, TenYearFwd = Ten.Year.Fwd ) } setGeneric(" >>> TermStructure", function(rates.data = "character", method = "character") >>> {standardGeneric("TermStructure")}) >>> >>> On May 11, 2015, at 01:54 AM, Thierry Onkelinx <thierry.onkel...@inbo.be> >>> wrote: >>> >>> Dear Glenn, >>> >>> We need more details on the function. Please provide a commented, >>> minimal, self-contained version of the function that reproduces the problem >>> (as the posting guide asks you to do). >>> >>> Best regards, >>> >>> ir. Thierry Onkelinx >>> Instituut voor natuur- en bosonderzoek / Research Institute for Nature >>> and Forest >>> team Biometrie & Kwaliteitszorg / team Biometrics & Quality Assurance >>> Kliniekstraat 25 >>> 1070 Anderlecht >>> Belgium >>> >>> To call in the statistician after the experiment is done may be no more >>> than asking him to perform a post-mortem examination: he may be able to say >>> what the experiment died of. ~ Sir Ronald Aylmer Fisher >>> The plural of anecdote is not data. ~ Roger Brinner >>> The combination of some data and an aching desire for an answer does not >>> ensure that a reasonable answer can be extracted from a given body of data. >>> ~ John Tukey >>> >>> 2015-05-11 3:03 GMT+02:00 Glenn Schultz <glennmschu...@me.com>: >>> >>>> Hello All, >>>> >>>> Testing my code on a Windows based machine today. There seems to be an >>>> offending line of code. I have pasted it below. Basically, I check to see >>>> if the user passed a fit method to TermStructure and if not then default to >>>> "ns". >>>> >>>> The above works fine on my Mac but a windows build errors no method. I >>>> have to pass a method = "ns" in the function. If I pass the value for >>>> method to the function it will run with no error. Any thoughts are >>>> appreciated. >>>> >>>> Best Regards, >>>> Glenn >>>> >>>> #Default method for TermStructure >>>> if(missing(method)) method = "ns" >>>> ______________________________________________ >>>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>> 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. >>>> >>> >>> >> > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.