From: Gabor Grothendieck <ggrothendieck_at_gmail.com>

Date: Sun, 13 May 2007 19:02:37 -0400

R-devel_at_r-project.org mailing list

https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sun 13 May 2007 - 23:04:18 GMT

Date: Sun, 13 May 2007 19:02:37 -0400

I suggest you define a "relist" class and then define an unlist method for it which stores the skeleton as an attribute. Then one would not have to specify skeleton in the relist command so

relist(unlist(relist(x))) === x

On 5/13/07, Andrew Clausen <clausen_at_econ.upenn.edu> wrote:

> Hi all,

*>
**> I wrote a function called relist, which is an inverse to the existing
**> unlist function:
**>
**> http://www.econ.upenn.edu/~clausen/computing/relist.R
**>
**> Some functions need many parameters, which are most easily represented in
**> complex structures. Unfortunately, many mathematical functions in R,
**> including optim, nlm, and grad can only operate on functions whose domain is
**> a vector. R has a function to convert complex objects into a vector
**> representation. This file provides an inverse operation called "unlist" to
**> convert vectors back to the convenient structural representation. Together,
**> these functions allow structured functions to have simple mathematical
**> interfaces.
**>
**> For example, a likelihood function for a multivariate normal model needs a
**> variance-covariance matrix and a mean vector. It would be most convenient to
**> represent it as a list containing a vector and a matrix. A typical parameter
**> might look like
**>
**> list(mean=c(0, 1), vcov=cbind(c(1, 1), c(1, 0)))
**>
**> However, optim can't operate on functions that take lists as input; it
**> only likes vectors. The solution is conversion:
**>
**> initial.param <- list(mean=c(0, 1), vcov=cbind(c(1, 1), c(1, 0)))
**>
**> ll <- function(param.vector)
**> {
**> param <- relist(initial.param, param.vector)
**> -sum(dnorm(x, mean=param$mean, vcov=param$vcov, log=TRUE))
**> # note: dnorm doesn't do vcov... but I hope you get the point
**> }
**>
**> optim(unlist(initial.param), ll)
**>
**> "relist" takes two parameters: skeleton and flesh. Skeleton is a sample
**> object that has the right "shape" but the wrong content. "flesh" is a vector
**> with the right content but the wrong shape. Invoking
**>
**> relist(skeleton, flesh)
**>
**> will put the content of flesh on the skeleton.
**>
**> As long as "skeleton" has the right shape, it should be a precise inverse
**> of unlist. These equalities hold:
**>
**> relist(skeleton, unlist(x)) == x
**> unlist(relist(skeleton, y)) == y
**>
**> Is there any easy way to do this without my new relist function? Is there any
**> interest in including this in R's base package? (Or anywhere else?) Any
**> comments on the implementation?
**>
**> Cheers,
**> Andrew
**>
**> ______________________________________________
**> R-devel_at_r-project.org mailing list
**> https://stat.ethz.ch/mailman/listinfo/r-devel
**>
*

R-devel_at_r-project.org mailing list

https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sun 13 May 2007 - 23:04:18 GMT

Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.

Archive generated by hypermail 2.2.0, at Mon 14 May 2007 - 07:33:33 GMT.

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel.
Please read the posting
guide before posting to the list.
*