See help(system.time).

On Thu, 2005-07-21 at 17:56 +0100, Gilbert Wu wrote:
> Hi Adai,
> 
> Your diagnosis is absolutely right; class(r1) returned data.frame and your 
> suggested solution worked perfectly. Your assumption is also right; both x 
> and y are positive.
> 
> If I want to compare the performance of the my old function with yours, are 
> there some functions in R I could use to get the elapsed time etc?
> 
> Many Thanks indeed.
> 
> Regards,
> 
> Gilbert
> 
> -----Original Message-----
> From: Adaikalavan Ramasamy [mailto:[EMAIL PROTECTED]
> Sent: 19 July 2005 23:38
> To: Gilbert Wu
> Cc: r-help@stat.math.ethz.ch
> Subject: RE: [R] colnames
> 
> 
> 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