# \m2v operator?

12 posts / 0 new
Offline
Joined: 01/03/2010 - 20:52
\m2v operator?

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

Offline
Joined: 01/03/2010 - 20:52
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

Offline
Joined: 07/31/2009 - 15:24
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.

Offline
Joined: 07/31/2009 - 15:24
The wiki page is up to date

The wiki page is up to date again: http://openmx.psyc.virginia.edu/wiki/matrix-operators-and-functions

Offline
Joined: 01/03/2010 - 20:52
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/mxAlgebra.html).

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/mxAlgebra.html).

Thanks for the quick and helpful replies,

-Scott

Offline
Joined: 07/31/2009 - 15:24
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")
Offline
Joined: 07/31/2009 - 15:14
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")

Offline
Joined: 07/30/2009 - 14:03
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")

Offline
Joined: 07/31/2009 - 15:24

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).

Offline
Joined: 07/31/2009 - 15:24
Opened a ticket for colMeans

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

Offline
Joined: 07/31/2009 - 15:14
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.

Offline
Joined: 07/31/2009 - 14:25
Extra vote for a speedy

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