Standardize a RAM Model

Posted on
Picture of user. Ryne Joined: 07/31/2009
Here's a beta of a new function to get standardized output from a RAM model. I've only tested it on one or two models, so I'd love some help breaking it. You have to either supply a model that uses mxRAMObjective or you have to supply the names of the A and S matrices.

Edit (11/1/10): Previous version standardized S correctly but A incorrectly. Fixed. Also improved some error messages.

Edit (12/13/10): Previous version correctly standardized model and matrix output, but incorrectly standardized A matrix on 'parameters' output. Fixed. Reminder that when using 'model' output, only the model matrices are affected: the matrices in the 'output' slot are not affected, as that would require changing model optimization information.

Replied on Thu, 10/21/2010 - 06:57
Picture of user. tbates Joined: 07/31/2009

Hi Ryne: This will be very helpful for people!

Question: Shouldn't
rescale <- invSDs[as.numeric(p$row)] * invSDs[as.numeric(p$col)]
be
rescale <- invSDs[p$row] * invSDs[p$col]

Best, wishes
t

Replied on Thu, 10/21/2010 - 11:06
Picture of user. Ryne Joined: 07/31/2009

In reply to by tbates

You're right. I did that as a work-around to mxSummary, which returned the row names as numeric 1:4 and column names as characters 1:4. I now realize that won't work if someone actually specifies dimnames for their A and S matrices. I added a patch that gives the invSDs default names of the numbers 1:length(invSDs) as characters, so that invSDs[1] and invSDs["1"] both work. However, if there are dimnames on the columns of the A matrix, those are populated instead. I'm choosing not to check whether the dimnames of A and the dimnames of S are identical, because they're usually either NULL or autopopulated to be equal through type="RAM". One would have to manually set A and S to have different dimnames.

I might as well describe the function a little better. The primary argument is an existing model to be standardized. If it is type="RAM" or uses the mxRAMObjective, you don't have to do anything else. If you don't use the RAM objective (say, you use an algebra to to the RAM matrices), you have to supply the names (as character strings) of the A and S matrices. The output (varied by the argument 'return') is either an mxSummary-style list of standardized parameters and standard errors (return="parameters"), the standardized matrices (return="matrices") or a model with the standardized A and S matrices populated (return="model").

The last option also returns a standardized M matrix, which is all zeros by definition, whereas the parameters and matrices options don't return the M matrices or their free parameters. It should be noted that return="model" only changes the model matrices; no changes are made to the 'output' slot of a returned model, summary(standardizeRAM(model)) will look exactly like summary(model). If you want a standardized parameter list a la summary, use standardizeRAM(model).

Replied on Thu, 12/16/2010 - 16:08
Picture of user. rabil Joined: 01/14/2010

Hi. What am I doing wrong? I'm using FIML. I supply the matrix names:

> standardizeRAM(Fit4238,Amat=Fit4238@output$matrices$s4238.A,Smat=Fit4238@output$matrices$s4238.S,Mmat=Fit4238@output$matrices$s4238.M)
Error in standardizeRAM(Fit4238, Amat = Fit4238@output$matrices$s4238.A, :
I need either mxRAMObjective or the names of the A and S matrices.

I've also tried with quotes around the matrix names.

I've also tried:

standardizeRAM(Fit4238,Amat=Fit4238@matrices$A@values,Smat=Fit4238@matrices$S@values,Mmat=Fit4238@matrices$M@values)

Replied on Fri, 12/17/2010 - 10:10
Picture of user. rabil Joined: 01/14/2010

In reply to by Ryne

Thanks. That does work. Aren't these names the standard names for these matrices? I would have tried these names but it seemed to simple and that something more was needed.
Replied on Fri, 12/17/2010 - 10:22
Picture of user. Ryne Joined: 07/31/2009

In reply to by rabil

Yeah, I'd imagine most people will use matrices named "A", "S" and "M". I avoided the default because I didn't want to make unnecessary assumptions, and I hadn't come up with a good way to catch when someone had a matrix called "A" and it wasn't the A matrix (for instance, some people use words like "asym" or "arrows"). The function does automatically grab the names when you use the RAMObjective, but not with FIML.