[R-sig-Finance] fMultivar rollMax question

Spencer Graves spencer.graves at pdf.com
Sat Jul 8 04:35:54 CEST 2006


	  This is known in some circles as an "infelicity" in the code.  A 
corrected version of rollFun, called by rollMax, appears below.

	  In brief, the problem occurs because the author of rollFun (Diethelm 
Wuertz, I believe) did not envision n<2, and rollFun contains "for(i in 
2:n)".  My proposed solution is simply to insert a new statement as the 
first line of "rollFun":

   if(n<=1)return(FUN(x))

	  I'm copying Prof. Wuertz on this email, so he can take appropriate 
action.  Until that change works its way into code on your computer via, 
e.g., "update.packages()", you can copy the revised function into any 
script that uses rollMax, rollMin, rollMean, rollVar, or rollFun.

	  Hope this helps.
	  Spencer Graves
####################
rollFun <-
function (x, n, trim = TRUE, na.rm = FALSE, FUN, ...)
{
   if(n<=1)return(FUN(x))
   #
     x.orig = x
     if (is.timeSeries(x))
         TS = TRUE
     else TS = FALSE
     if (TS) {
         positions = x.orig at positions
         x = x.orig at Data[, 1]
     }
     else {
         x = as.vector(x.orig)
         names(x) = NULL
     }
     if (na.rm) {
         if (TS)
             positions = positions[!is.na(x)]
         x = as.vector(na.omit(x))
     }
     start = 1
     end = length(x) - n + 1
     m = x[start:end]
     for (i in 2:n) {
         start = start + 1
         end = end + 1
         m = cbind(m, x[start:end])
     }
     ans = apply(m, MARGIN = 1, FUN = FUN, ...)
     if (!trim)
         ans = c(rep(NA, (n - 1)), ans)
     if (trim & TS)
         positions = positions[-(1:(n - 1))]
     if (TS) {
         ans = timeSeries(as.matrix(ans), positions, units = x.orig at units,
             FinCenter = x.orig at FinCenter)
     }
     ans
}

####################
Omar Lakkis wrote:
> I am using fMultivar under R 2.2.1 on a Debian linux box. Could
> someone, please, explain to me why there are two trailing NAs in the
> last statement in the code beow?
> 
> 
>> library(fMultivar)
>> x <- 1:20
>> rollMax(x, n=3)
>  [1]  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
>> rollMax(x, n=2)
>  [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
>> rollMax(x, n=1)
>  [1]  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 NA NA
> 
> _______________________________________________
> R-SIG-Finance at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance



More information about the R-SIG-Finance mailing list