[R] Code works on Mac but not Windows

Thierry Onkelinx thierry.onkelinx at inbo.be
Wed May 13 09:53:31 CEST 2015


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 <glennmschultz op 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.onkelinx op 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 <glennmschultz op 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 op tradedate = tradedate .Object op period = period .
>> Object op date = date .Object op spotrate = spotrate .Object op forwardrate =
>> forwardrate .Object op TwoYearFwd = TwoYearFwd .Object op 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.onkelinx op 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 <glennmschultz op 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 op 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]]



More information about the R-help mailing list