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

Reply via email to