Aiuto per la modellazione SEM (OpenMx, policycor)


10

Ho un sacco di problemi con un set di dati a cui sto cercando di applicare SEM.

Supponiamo che esistano 5 fattori latenti A, B, C, D, E, con indicatori resp. Da A1 a A5 (fattori ordinati), da B1 a B3 (quantitativo), C1, D1, E1 (tutti gli ultimi tre fattori ordinati, con solo 2 livelli per E1. Siamo interessati alle covarianze tra tutti i fattori.

Ho provato a usare OpenMxper farlo. Ecco alcuni dei miei tentativi:

  • Prima ho provato a usare le matrici delle soglie per tutti i fattori ordinati, ma la convergenza non è riuscita.

  • Ho deciso di utilizzare le correlazioni policorico / poliseriale anziché i dati non elaborati , con la funzione hetcordella libreria polycor(avevo pianificato di avviare il campione per ottenere intervalli di confidenza). Inoltre non riesce a convergere!

  • Ho cercato di limitarmi a persone con dati completi, fallisce anche!

La mia prima domanda è: esiste un modo naturale per interpretare questi fallimenti?

La mia seconda domanda è: cosa devo fare ???

Modifica: per i futuri lettori che potrebbero riscontrare lo stesso problema , dopo aver esaminato il codice delle funzioni in polycor... la soluzione è semplicemente quella di utilizzare hetcor()con l'opzione std.err=FALSE. Ciò fornisce stime molto simili a quelle fornite da StasK. Non ho tempo per capire meglio cosa sta succedendo qui! StasK ha risposto abbastanza bene alle domande che seguono.

Ho altre domande, ma prima di tutto, ecco un URL con un file RData contenente un frame di dati L1contenente solo i dati completi: data_sem.RData

Ecco alcune righe di codice che mostrano il fallimento di hetcor.

> require("OpenMx")
> require("polycor")
> load("data_sem.RData")
> hetcor(L1)
Erreur dans cut.default(scale(x), c(-Inf, row.cuts, Inf)) : 
  'breaks' are not unique
De plus : Il y a eu 11 avis (utilisez warnings() pour les visionner)
> head(L1)
   A1 A2 A3 A4 A5       B1       B2       B3 C1 D1 E1
1   4  5  4  5  7 -0.82759  0.01884 -3.34641  4  6  1
4   7  5  0  4  6 -0.18103  0.14364  0.35730  0  1  0
7   7  5  7  6  9 -0.61207 -0.18914  0.13943  0  0  0
10  5  5 10  7  3 -1.47414  0.10204  0.13943  2  0  0
11  7  5  8  9  9 -0.61207  0.06044 -0.73203  0  2  0
12  5  5  9 10  5  0.25000 -0.52192  1.44662  0  0  0

Ma posso ancora calcolare una correlazione o una matrice di covarianza in modo molto sporco, considerando i miei fattori ordinati come variabili quantitative:

> Cor0 <- cor(data.frame(lapply(L1, as.numeric)))

Ecco un pezzo di OpenMxcodice insieme alla mia prossima domanda: il seguente modello è corretto? Non ci sono troppi parametri gratuiti?

manif <- c("A1","A2","A3","A4","A5", "B1","B2","B3", "C1", "D1", "E1");

model1 <- mxModel(type="RAM",
        manifestVars=manif, latentVars=c("A","B","C","D","E"),
        # factor variance
        mxPath(from=c("A","B","C","D","E"), arrows=2, free=FALSE, values = 1),
        # factor covariance
        mxPath(from="A", to="B",  arrows=2, values=0.5),
        mxPath(from="A", to="C",  arrows=2, values=0.5),
        mxPath(from="A", to="D",  arrows=2, values=0.5),
        mxPath(from="A", to="E",  arrows=2, values=0.5),
        mxPath(from="B", to="C",  arrows=2, values=0.5),
        mxPath(from="B", to="D",  arrows=2, values=0.5),
        mxPath(from="B", to="E",  arrows=2, values=0.5),
        mxPath(from="C", to="D",  arrows=2, values=0.5),
        mxPath(from="C", to="E",  arrows=2, values=0.5),
        mxPath(from="D", to="E",  arrows=2, values=0.5),
        # factors → manifest vars
        mxPath(from="A", to=c("A1","A2","A3","A4","A5"), free=TRUE, values=1),
        mxPath(from="B", to=c("B1","B2","B3"), free=TRUE, values=1),
        mxPath(from="C", to=c("C1"), free=TRUE, values=1),
        mxPath(from="D", to=c("D1"), free=TRUE, values=1),
        mxPath(from="E", to=c("E1"), free=TRUE, values=1),
        # error terms
        mxPath(from=manif, arrows=2, values=1, free=TRUE),
        # data
        mxData(Cor0, type="cor",numObs=dim(L1)[1])
       );

E un'ultima domanda. Con questo modello (dimentichiamo per un momento il modo inappropriato in cui viene calcolata la matrice di correlazione), eseguo OpenMx:

> mxRun(model1) -> fit1
Running untitled1 
> summary(fit1)

tra i riassunti, questo:

observed statistics:  55 
estimated parameters:  32 
degrees of freedom:  23 
-2 log likelihood:  543.5287 
saturated -2 log likelihood:  476.945 
number of observations:  62 
chi-square:  66.58374 
p:  4.048787e-06 

La vestibilità sembra molto male, nonostante l'enorme numero di parametri. Cosa significa? Ciò significa che dovremmo aggiungere covarianze tra variabili manifest?

Molte grazie in anticipo per tutte le tue risposte, sto lentamente diventando pazzo ...

Risposte:


10

Devi aver scoperto un bug polycor, che vorresti segnalare a John Fox. Tutto funziona bene in Stata usando il mio polychoricpacchetto:

    . polychoric *

    Polychoric correlation matrix

               A1          A2          A3          A4          A5          B1          B2          B3          C1          D1          E1
   A1           1
   A2   .34544812           1
   A3   .39920225   .19641726           1
   A4   .09468652   .04343741   .31995685           1
   A5   .30728339   -.0600463   .24367634   .18099061           1
   B1   .01998441  -.29765985   .13740987   .21810968   .14069473           1
   B2  -.19808738   .17745687  -.29049459  -.21054867   .02824307  -.57600551          1
   B3   .17807109  -.18042045   .44605383   .40447746   .18369998   .49883132  -.50906364           1
   C1  -.35973454  -.33099295  -.19920454  -.14631621  -.36058235   .00066762  -.05129489  -.11907687           1
   D1   -.3934594  -.21234022  -.39764587  -.30230591  -.04982743  -.09899428   .14494953   -.5400759   .05427906           1
   E1  -.13284936   .17703745  -.30631236  -.23069382  -.49212315  -.26670382   .24678619  -.47247566    .2956692   .28645516           1

Per le variabili latenti che sono misurate con un unico indicatore ( C, D, E), è necessario fissare la varianza dell'indicatore nella versione continua di esso, altrimenti la scala della variabile latente non è identificato. Dato che con risposte binarie / ordinali, è comunque fissato a 1 con collegamenti (ordinali) di tipo probit, probabilmente significa che dovresti postulare che il tuo latente è equivalente all'indicatore osservato, oppure devi postulare il caricamento standardizzato . Questo essenzialmente rende il tuo modello equivalente a un modello CFA in cui hai i fattori latenti A e B misurati con {A1-A5, C1, D1, E1} e {B1-B3, C1, D1, E1}, rispettivamente.


Mille grazie per aver dedicato del tempo a provare questo! Quindi: qualcuno ha un'alternativa da suggerire per calcolare queste correlazioni in R?
Elvis,

Per quanto riguarda i fattori, ero consapevole che qualcosa si nascondeva lì dentro - ma non sono sicuro di averlo ancora capito. In quello che ho scritto, ho relazioni come - tranne per il fatto che questo è in effetti una polittomia di questo. Anche se non era ordinale, ma quantitativo, dato che fornisco solo correlazioni (nemmeno covarianza) non capisco come si possa recuperare la scala di . Intendo non solo la varianza di , ma anche il valore di . Tuttavia, ripararlo peggiora la misura! Capisco meglio le cose quando adattiamo i dati non elaborati, ma sfortunatamente questo fallisce ...A i A i ϵ α iAi=αiA+ϵAiAiϵαi
Elvis,

Per i fattori con un singolo indicatore le cose sono semplicemente peggiori ...! In effetti C1, D1, E1 sono la somma di diverse variabili; erano così quando mi sono stati forniti i dati, ho chiesto l'intero set di dati come pensavo fosse preferibile, ma a un certo punto sono tornato alle somme poiché nulla funzionava bene ... Se riesco a trovare un modo per calcolare queste correlazioni con R userò il set completo di dati.
Elvis,

Bene, ora che lo penso meglio penso di averlo capito.
Elvis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.