\m2v operator?

11 replies [Last post]
svrieze's picture
Offline
Joined: 01/03/2010

Hello,

What would be the R or OpenMx equivalent of the \m2v operator in Classic Mx?

Related question: if I define in R my own function that performs this operation, can I use that function within the mxAlgebra command?

-Scott

svrieze's picture
Offline
Joined: 01/03/2010
Hello again, Related

Hello again,

Related question: how can I use colMeans() in an mxAlgebra command?

In some releases it appears that colMeans was a legitimate function within mxAlgebra (http://openmx.psyc.virginia.edu/docs/OpenMx/0.2.1-922/_static/Rdoc/mxAlg...).

In the latest manual it is not listed as a viable function under the mxAlgebra command (http://openmx.psyc.virginia.edu/docs/OpenMx/latest/_static/Rdoc/mxAlgebr...).

Thanks for the quick and helpful replies,

-Scott

mspiegel's picture
Offline
Joined: 07/31/2009
Opened a ticket for colMeans

Opened a ticket for colMeans and rowMeans: http://openmx.psyc.virginia.edu/issue/2010/06/mxalgebra-wishlist

neale's picture
Offline
Joined: 07/31/2009
Agreed these functions

Agreed these functions (
ceiling, floor, trunk, round
dim
rowMeans, colMeans
cov2cor)
Would be useful. There are some gotchas with cov2cor - it fails when diagonal elements are non-positive. I guess it will end up with NaNs in the rows and cols of any non-pos elements. In classic Mx it would throw an error which was inconvenient. NaN is much better.

tbates's picture
Offline
Joined: 07/31/2009
Extra vote for a speedy

Extra vote for a speedy cov2cor() postRelease(1.0) , esp with error catching to return NA :-)

mspiegel's picture
Offline
Joined: 07/31/2009
Yes. colMeans used to be

Yes. colMeans used to be listed in the documentation, but that was an error as it wasn't implemented. We'll put it on the TODO list, it shouldn't be too hard to implement rowMeans() and colMeans(). At best, you can currently compute the column means explicitly, although it is a pain. For example, if A is a 3 x 3 MxMatrix or MxAlgebra, then the column mean is:

col1 <- mxAlgebra(sum(A[,1]) / 3, name = "col1")
col2 <- mxAlgebra(sum(A[,2]) / 3, name = "col2")
col3 <- mxAlgebra(sum(A[,3]) / 3, name = "col3")
colMean <- mxAlgebra(rbind(col1, col2, col3), name = "colMean")

neale's picture
Offline
Joined: 07/31/2009
Or with a bit more generality

Or with a bit more generality using the number of rows in A and a bit of matrix algebra

v <- mxMatrix("Full", 1, dim(A@values)[1], values=1/dim(A@values)[1], name="v")
colMean <- mxAlgebra(v %*% A, name="colMeansOfA")

Steve's picture
Offline
Joined: 07/30/2009
And similarly for row means v

And similarly for row means

v <- mxMatrix("Full", 1, dim(A@values)[2], values=1/dim(A@values)[2], name="v")
rowlMean <- mxAlgebra(A %*% v, name="rowMeansOfA")

mspiegel's picture
Offline
Joined: 07/31/2009
I don't have access to R at

I don't have access to R at the moment, but I believe that dims(a) will work, where a is a MxMatrix object. Or if that doesn't work try nrow(a) and ncol(a).

svrieze's picture
Offline
Joined: 01/03/2010
Apologies, I believe I've

Apologies, I believe I've found my own answer.

For \m2v(X) one can use as.vector(t(X)).

-Scott

mspiegel's picture
Offline
Joined: 07/31/2009
If I remember correctly,

If I remember correctly, as.vector is not supported by OpenMx. Use the functions cvectorize or rvectorize to perform either row or column vectorization. There is a wiki page with matrix operators and functions but it is missing these two (sorry!). To write your own matrix function, you need to provide an implementation in C for OpenMx. There is a HOWTO on the wiki. You can also define an arbitrary objective function in R. See the user guide for help on that.

mspiegel's picture
Offline
Joined: 07/31/2009
The wiki page is up to date