Amos Basic Tip

Reporting all fit measures with missing data

When you have missing data it takes extra work to get the chi square statistic and other fit measures like CFI. Amos Graphics does the extra work automatically, but when you write an Amos Basic program, you have to include code to do the extra work.

The following Basic program does not do the extra work. It fits a factor analysis model to the grant_x data, which contains missing values. The output does not include the chi square statistic and also does not include most fit measures.

Sub main()
    Const FileName As String = "c:\program files\amos 4\examples\grant_x.sav"
    
    'Create a new instance of the Amos engine
    Dim Sem As AmosEngine
    Set Sem = New AmosEngine
    
    Sem.TableOutput
    Sem.Standardized
    Sem.Smc
    Sem.AllImpliedMoments
    Sem.ModelMeansAndIntercepts
        
    Sem.BeginGroup FileName
        Sem.Structure "visperc   = ( ) + (1) spatial + (1) err_v"
        Sem.Structure "cubes     = ( ) +     spatial + (1) err_c"
        Sem.Structure "lozenges  = ( ) +     spatial + (1) err_l"

        Sem.Structure "paragrap = ( ) + (1) verbal  + (1) err_p"
        Sem.Structure "sentence  = ( ) +     verbal  + (1) err_s"
        Sem.Structure "wordmean  = ( ) +     verbal  + (1) err_w"

End Sub

In order to compute the chi square statistic the Amos engine needs to know the "function of log likelihood" of the saturated model. Furthermore, to compute many fit measures, the Amos engine needs to know the "function of log likelihood" of the baseline independence model. You need to supply code for fitting the saturated and independence models. Then when you fit your model you need to include statements to tell the Amos engine the value of "function of log likelihood" for the saturated and independence models. The following program shows how this can be done. The SaturatedOrIndependence subroutine can be used as-is in your own programs. The lines that were added to the main program in order to report all fit measures are shown in bold italic type.

Sub Main()
    Const FileName As String = "c:\program files\amos 4\examples\grant_x.sav"
    
    Dim SaturatedCmin As Double
    Dim LSaturatedResult As Long
    Dim IndependenceCmin As Double
    Dim LIndependenceResult As Long
    
    'Try to fit the saturated and independence models
    LSaturatedResult = SaturatedOrIndependence(SaturatedCmin, False, 6, _
        Array("visperc", "cubes", "lozenges", "paragrap", "sentence", "wordmean"), _
        FileName)
    LIndependenceResult = SaturatedOrIndependence(IndependenceCmin, True, 6, _
        Array("visperc", "cubes", "lozenges", "paragrap", "sentence", "wordmean"), _
        FileName)
    
    'Create a new instance of the Amos engine
    Dim Sem As AmosEngine
    Set Sem = New AmosEngine
    
    'Tell the Amos engine about the fit of the saturated and independence models
    Sem.SetSaturatedFit LSaturatedResult = 0, SaturatedCmin
    Sem.SetIndependenceFit LIndependenceResult = 0, IndependenceCmin
    
    Sem.TableOutput
    Sem.Standardized
    Sem.Smc
    Sem.AllImpliedMoments
    Sem.ModelMeansAndIntercepts
        
    Sem.BeginGroup FileName
        Sem.Structure "visperc   = ( ) + (1) spatial + (1) err_v"
        Sem.Structure "cubes     = ( ) +     spatial + (1) err_c"
        Sem.Structure "lozenges  = ( ) +     spatial + (1) err_l"

        Sem.Structure "paragrap = ( ) + (1) verbal  + (1) err_p"
        Sem.Structure "sentence  = ( ) +     verbal  + (1) err_s"
        Sem.Structure "wordmean  = ( ) +     verbal  + (1) err_w"

End Sub

'This is a generic routine that you can use without modification
'to fit the saturated and independence models

'Output:
'   CMin
'       The minimum discrepancy for the saturated (or independence) model

'Input:
'   Independence
'       True to fit the independence model, False to fit the saturated model

'   NObservedVariables
'       Number of observed variables

'   ObservedVariables_0b
'       Array of observed variable names

'   FileName
'       Data file name

'   TableName
'       Data table name (for file formats
'       that can contain multiple data tables in a single file)

'   GroupingVariable
'       Name of variable used to select a subset of data for analysis

'   GroupValue
'       Value of the GroupingVariable used to select a subset of data for analysis

'Return 0 if ok
Function SaturatedOrIndependence(CMin As Double, Independence As Boolean, _
        NObservedVariables As Long, ObservedVariables_0b As Variant, _
        FileName As String, Optional TableName As String, _
        Optional GroupingVariable As String, _
        Optional GroupValue As Variant) As Long
    Dim Sem As AmosEngine
    Dim i As Integer
    Dim STemp As String
    SaturatedOrIndependence = 0
    On Error GoTo EHandler
    Set Sem = New AmosEngine
    Sem.ModelMeansAndIntercepts
    
    Call Sem.GenerateDefaultCovariances(Not Independence)

    Sem.BeginGroup FileName, TableName, GroupingVariable, GroupValue
    For i = 0 To NObservedVariables - 1
        STemp = ObservedVariables_0b(i)
        Sem.Mean STemp
    Next
    
    If Sem.FitModel() = 0 Then
        CMin = Sem.CMin
    Else
        SaturatedOrIndependence = 1
    End If
Quit:
    Set Sem = Nothing
    DoEvents
    Exit Function

EHandler:
    SaturatedOrIndependence = 1
    GoTo Quit
End Function