You are here

Revision of Writing Demo Scripts from Sat, 09/26/2009 - 08:21

Revisions allow you to track differences between multiple versions of your content, and revert back to older versions.

Wiki home pageDemo scripts are invaluable for helping others learn OpenMx, and, during development, to test that the integrity of the program is maintained as well as to test new features.

How to write

Avoid using functions which will not work for all users/platforms. Things to avoid include:

Avoid Instead
source() Include the source in the demo so it is self-contained
setwd() use data() to avoid needing to set the current directory
read.table
(unless from a URL)
data(, package="OpenMx")
Undefined variables check that your script is not dependent on variables which it does not set. "rm(list = ls())" will remove all variables from your environment - a bit extreme but if your script still runs it is a good check that you are not using variables you don't set'

Where to put demos

Demo scripts with the intention of teaching or sharing a technique can be added to the "/trunk/demos/" directory.
nb: When adding a file to this directory, please manually update the "00INDEX" file in this directory with the name of the file and a 1-line description of its purpose.

Test scripts with the intention of verifying OpenMx functionality can be added to the "/trunk/models/passing" or "/trunk/models/failing".

nb: Test scripts differ from other scripts in that they MUST verify that the results obtained are those returned in Mx 1.x using omxCheckCloseEnough() and related functions.

Using omxCheckCloseEnough()

omxCloseEnough() simply compares the elements of two compatible arrays, returning TRUE if no pair of elements differ by more than epsilon (the maximum allowed difference)
omxCloseEnough() takes three arguments:

   omxCheckCloseEnough(a, b, epsilon = 10^(-15))

'a' and 'b' are numeric vectors or matrices, and 'epsilon' is the maximum allowed (absolute?) difference between the elements of 'a' and the elements of 'b'.

In usage, you would typically fill vector a with results from the results of an OpenMx mxRun() statement, while the elements of b will be hard-coded from a comparable Mx run. nb:

For convenience, you can run mx 1.x from OpenMx using the function omxOriginalMx(), which takes two arguments: 'mx.filename' is a string that is the path and name of the mx script to run (relative be found in the directory returned by getwd() ), and 'output.directory' similarly the relative path to the directory where output files will be written.

notes: 'mx' must appear somewhere in your $PATH.
While you can use omxOriginalMx() to get the correct values for omxCloseEnough(). comment this code out in the demo, and hard code the results: We cannot assume that developers and users have installed Mx 1.X.

Comments

Textmate 2 with dropdown select support attached to make this trivial (just type demo and tab)

remove the .txt extension (added to trick the upload filter)

-----------------------------------------------------------------------------

Program: ${1:ExampleDemo}.R

Author: ${2:$TM_FULLNAME}

Date: date +%Y-%m-%d

#

ModelType: ${3:CFA,EFA,ACE,Multilevel,Mixture,Growth Curve,Growth Mixture,Saturated,Locus Likelihood,Log-odds,Joint,Ordinal,Continuous}

DataType: ${4|Time Series,Likert,Twin,Count,Frequencies,Log-odds,Binary,Survey,Personality,Family,Joint,Ordinal,Continuous,Simulated,Clustered|}

Field: ${5|Path model,Behavior Genetics,Genetic Epidemiology,Functional Magnetic Resonance Imaging (FMRI)|}

#

Purpose:

${6:One Factor model to demonstrate style header for demos.}

#

RevisionHistory:

$2 -- date +%Y-%m-%d initial creation

-----------------------------------------------------------------------------