| |
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,
underlined 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
|
|