Somebody kindly called my attention to incanter.zoo that deals with many of 
the issues I mentioned in my previous post.



On Friday, April 19, 2013 1:49:08 PM UTC-3, Fernando Saldanha wrote:
>
> I am new to the Clojure world. After years of developing finance 
> applications in R, I am trying to convert a relatively big R/Finance 
> project into Clojure/Incanter. Some things are going very smoothly. I can 
> see how the number of LOC is drastically reduced and the code is clean and 
> concise.
>
> However, in the core area of dealing with financial time series I am 
> having difficulties. Here are some thoughts:
>
> 1) In R one works with matrices and data frames, analogous to Incanter's 
> matrices and datasets. In R you can do calculations with both types, in 
> Incanter only with matrices, but not with datasets. Both data frames and 
> datasets allow for heterogeneous data, both matrices do not.
>
> 2) In R a matrix can have both column and row names, in Incanter it can 
> have neither.
>
> 3) From 1) and 2) it seems to me that in Incanter every time you want to 
> do calculations you lose the naming of your data. This gives me a feeling 
> of insecurity as I have to think about the ordering of the rows (which is 
> usually not a problem) and of the columns (which is a big problem).
>
> 4) Finance people work primarily with time series. They tend to work with 
> data frames or matrices in which each column is a time series. The R data 
> frame structure fits nicely with this since a data frame is a list of its 
> columns (loosely speaking). Although I don't know what is going on in the 
> innards of Incanter, it seems to be focused on rows. I wonder if that has a 
> performance penalty when one is working with columns. One could think of 
> representing time series as rows in datasets, but that would lead to a loss 
> of naming, as datasets don't have row names. Or one could work with columns 
> in datasets and rows in matrices, which would require systematically 
> transposing the data, which is expensive.
>
> 5) I understand that working with Clojure one loses the possibility of 
> writing code like 
>
> A[i, j] = something 
>
> where A is a matrix. Here i and j may be numbers or vectors. Actually in R 
> a new matrix A is created when executes a command like this, so it is not 
> the performance that is the issue. It is rather the convenience. Would it 
> be possible to have a function in Clojure/Incanter that when called in the 
> following way
>
> (def B (foo A i j z))
>
> would create a matrix B with the same dimensions and entries as A except 
> that the subset of rows and columns defined by i and j would be replaced by 
> z? (Here i and j could be vectors like [3 5 12] or just ints like 4)
>
> 6) To complement the functionality in 5) one would like to be able to 
> apply a function to the columns or rows or a matrix, *with the parameters 
> varying with the column*. Sometimes in R the functionality is already 
> embedded in the function. For example, the function pmin (parallel min), So 
> , if I have a matrix
>
> mat
>      [,1] [,2] [,3]
> [1,]    1    4    7
> [2,]    2    5    8
> [3,]    3    6    9
>
> I can call pmin and get the following:
>
> pmin(mat, c(3, 4, 5))
>      [,1] [,2] [,3]
> [1,]    1    3    3
> [2,]    2    4    4
> [3,]    3    5    5
>
> (This uses R's "recycling," which is not how Incanter deals with vectors 
> of different lengths)
>
> If a function does not have that functionality, one can write
>
> t(apply(mat, 1, function(x, z) {x + z}, c(0, 1, 2)))
>
>      [,1] [,2] [,3]
> [1,]    1    5    9
> [2,]    2    6   10
> [3,]    3    7   11
>
> In any case, just the ability to apply a function to a give or all the 
> columns or rows of a matrix would be a big help. 
>
> I wrote the functions
>
> (defn matrix-map-col
>   "Applies a function on each element of a column of a matrix."
>   [A foo j] (matrix-map foo ($ :all j A)))
>
> (defn matrix-maps-cols
>   "Applies a sequence of functions to the elements of the columns of a 
> matrix.
>    The return value is a matrix with the same dimensions as the argument 
> matrix."
>   [A foos xs]
>   (trans (matrix (map #(matrix-map-col A %1 %2) foos xs))))
>
> which would be part of the solution. One would still have to add the 
> ability to vary the parameters and return a matrix. Given my short 
> experience with Clojure I wonder if they could be made faster/better and 
> what would be the best way to implement the remaining functionality.
>
> 7) I wrote in R a class that extends R's matrices. It associates a Date 
> object to each row and provides many other capabilities. When I extract 
> data from an object I can see the date range and the series I am dealing 
> with, which is crucial for checking calculations. I understand Clojure is 
> not OO. How could I have similar capabilities. What kind of construct in 
> Clojure could I use? I thought about a map with the following keys:
>
> :date - a Java date vector or just a vector of strings of the form 
> "20130415"
>
> :data - One of the following two alternatives
>
> a) A vector of maps, each one of which would have as a key the column name 
> (a string) and as value a time series
>
> b) An Incanter dataset
>
> Each alternative has advantages and disadvantages. Has anyone thought 
> about these issues?  Any comments would be very welcome.
>
> These are my thoughts for now. I will also post this on the Incanter group 
> (I hope that is not a problem).
>
> FS 
>
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to