What does class(r1) give you ? If it is "data.frame", then try exp( diff( log( as.matrix( df ) ) ) )
BTW, I made the assumption that both x and y are positive values only. Regards, Adai On Tue, 2005-07-19 at 16:30 +0100, Gilbert Wu wrote: > Hi Adai, > > When I tried the optimized routine, I got the following error message: > > r1 > 899188 902232 901714 28176U 15322M > 20050713 7.595 10.97 17.96999 5.1925 11.44 > 20050714 7.605 10.94 18.00999 5.2500 11.50 > 20050715 7.480 10.99 17.64999 5.2500 11.33 > 20050718 7.415 11.05 17.64000 5.2250 11.27 > > exp(diff(log(r1))) -1 > Error in r[i1] - r[-length(r):-(length(r) - lag + 1)] : > non-numeric argument to binary operator > > > > Any idea? > > Many Thanks. > > Gilbert > -----Original Message----- > From: Adaikalavan Ramasamy [mailto:[EMAIL PROTECTED] > Sent: 19 July 2005 12:20 > To: Gilbert Wu > Cc: r-help@stat.math.ethz.ch > Subject: RE: [R] colnames > > > First, your problem could be boiled down to the following example. See > how the colnames of the two outputs vary. > > df <- cbind.data.frame( "100"=1:2, "200"=3:4 ) > df/df > X100 X200 > 1 1 1 > 2 1 1 > > m <- as.matrix( df ) # coerce to matrix class > m/m > 100 200 > 1 1 1 > 2 1 1 > > It appears that whenever R has to create a new dataframe automatically, > it tries to get nice colnames. See help(data.frame). I am not exactly > sure why this behaviour is different when creating a matrix. But I do > not think this is a major problem for most people. If you coerce your > input to matrix, the problem goes away. > > > Next, note the following points : > a) "mat[ 1:3, 1:ncol(mat) ]" is equivalent to simply "mat[ 1:3, ]". > b) "mat[ 2:nrow(mat), ]" is equivalent to simply "mat[ -1, ]" > See help(subset) for more information. > > Using the points above, we can simplify your function as > > p.RIs2Returns <- function (mat){ > > mat <- as.matrix(mat) > x <- mat[ -nrow(mat), ] > y <- mat[ -1, ] > > return( y/x -1 ) > } > > If your data contains only numerical data, it is probably good idea to > work with matrices as matrix operations are faster. > > > Finally, we can shorten your function. You can use the diff (which works > column-wise if input is a matrix) and apply function if you know that > > y/x = exp(log(y/x)) = exp( log(y) - log(x) ) > > which could be coded in R as > > exp( diff( log(r1) ) ) > > and then subtract 1 from above to get your returns. > > Regards, Adai > > > > On Tue, 2005-07-19 at 09:17 +0100, Gilbert Wu wrote: > > Hi Adai, > > > > Many Thanks for the examples. > > > > I work for a financial institution. We are exploring R as a tool to > > implement our portfolio optimization strategies. Hence, R is still a new > > language to us. > > > > The script I wrote tried to make a returns matrix from the daily return > > indices extracted from a SQL database. Please find below the output that > > produces the 'X' prefix in the colnames. The reason to preserve the column > > names is that they are stock identifiers which are to be used by other sub > > systems rather than R. > > > > I would welcome any suggestion to improve the script. > > > > > > Regards, > > > > Gilbert > > > > > "p.RIs2Returns" <- > > + function (RIm) > > + { > > + x<-RIm[1:(nrow(RIm)-1), 1:ncol(RIm)] > > + y<-RIm[2:nrow(RIm), 1:ncol(RIm)] > > + RReturns <- (y/x -1) > > + RReturns > > + } > > > > > > > > > channel<-odbcConnect("ourSQLDB") > > > result<-sqlQuery(channel,paste("select * from equityRIs;")) > > > odbcClose(channel) > > > result > > stockid sdate dbPrice > > 1 899188 20050713 7.59500 > > 2 899188 20050714 7.60500 > > 3 899188 20050715 7.48000 > > 4 899188 20050718 7.41500 > > 5 902232 20050713 10.97000 > > 6 902232 20050714 10.94000 > > 7 902232 20050715 10.99000 > > 8 902232 20050718 11.05000 > > 9 901714 20050713 17.96999 > > 10 901714 20050714 18.00999 > > 11 901714 20050715 17.64999 > > 12 901714 20050718 17.64000 > > 13 28176U 20050713 5.19250 > > 14 28176U 20050714 5.25000 > > 15 28176U 20050715 5.25000 > > 16 28176U 20050718 5.22500 > > 17 15322M 20050713 11.44000 > > 18 15322M 20050714 11.50000 > > 19 15322M 20050715 11.33000 > > 20 15322M 20050718 11.27000 > > > r1<-reshape(result, timevar="stockid", idvar="sdate", direction="wide") > > > r1 > > sdate dbPrice.899188 dbPrice.902232 dbPrice.901714 dbPrice.28176U > > dbPrice.15322M > > 1 20050713 7.595 10.97 17.96999 5.1925 > > 11.44 > > 2 20050714 7.605 10.94 18.00999 5.2500 > > 11.50 > > 3 20050715 7.480 10.99 17.64999 5.2500 > > 11.33 > > 4 20050718 7.415 11.05 17.64000 5.2250 > > 11.27 > > > #Set sdate as the rownames > > > rownames(r1) <-as.character(r1[1:nrow(r1),1:1]) > > > #Get rid of the first column > > > r1 <- r1[1:nrow(r1),2:ncol(r1)] > > > r1 > > dbPrice.899188 dbPrice.902232 dbPrice.901714 dbPrice.28176U > > dbPrice.15322M > > 20050713 7.595 10.97 17.96999 5.1925 > > 11.44 > > 20050714 7.605 10.94 18.00999 5.2500 > > 11.50 > > 20050715 7.480 10.99 17.64999 5.2500 > > 11.33 > > 20050718 7.415 11.05 17.64000 5.2250 > > 11.27 > > > colnames(r1) <- as.character(sub("[[:alnum:]]*\\.","", colnames(r1))) > > > r1 > > 899188 902232 901714 28176U 15322M > > 20050713 7.595 10.97 17.96999 5.1925 11.44 > > 20050714 7.605 10.94 18.00999 5.2500 11.50 > > 20050715 7.480 10.99 17.64999 5.2500 11.33 > > 20050718 7.415 11.05 17.64000 5.2250 11.27 > > > RRs<-p.RIs2Returns(r1) > > > RRs > > X899188 X902232 X901714 X28176U X15322M > > 20050714 0.001316656 -0.002734731 0.002225933 0.011073664 0.005244755 > > 20050715 -0.016436555 0.004570384 -0.019988906 0.000000000 -0.014782609 > > 20050718 -0.008689840 0.005459509 -0.000566006 -0.004761905 -0.005295675 > > > > > > > ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html