Bantuan dengan pemodelan SEM (OpenMx, polycor)

10

Saya punya banyak masalah dengan satu set data yang saya coba terapkan SEM.

Kami menduga keberadaan 5 faktor laten A, B, C, D, E, dengan indikator resp. A1 to A5 (faktor yang dipesan), B1 ke B3 (kuantitatif), C1, D1, E1 (semua tiga faktor terakhir, dengan hanya 2 level untuk E1. Kami tertarik pada kovarian antara semua faktor.

Saya mencoba menggunakannya OpenMxuntuk melakukannya. Inilah beberapa upaya saya:

  • Saya pertama kali mencoba menggunakan matriks ambang untuk semua faktor yang dipesan, tetapi konvergensi gagal.

  • Saya memutuskan untuk menggunakan korelasi polychoric / polyserial daripada data mentah, dengan fungsi hetcordari perpustakaan polycor(saya berencana untuk bootstrap sampel untuk mendapatkan interval kepercayaan). Itu juga gagal untuk bertemu!

  • Saya mencoba membatasi untuk individu dengan data lengkap, gagal juga!

Pertanyaan pertama saya adalah: adakah cara alami untuk menafsirkan kegagalan ini?

Pertanyaan kedua saya adalah: apa yang harus saya lakukan ???

Sunting: untuk pembaca masa depan yang mungkin mengalami masalah yang sama , setelah melalui kode fungsi di polycor... solusinya adalah dengan menggunakan hetcor()opsi tersebut std.err=FALSE. Ini memberikan perkiraan yang sangat mirip dengan yang diberikan StasK. Saya tidak punya waktu sekarang untuk memahami lebih baik apa yang terjadi di sini! Pertanyaan-pertanyaan di bawah ini telah dijawab dengan cukup baik oleh StasK.

Saya punya pertanyaan lain, tetapi sebelum apa pun, berikut adalah url dengan file RData yang berisi bingkai data L1yang hanya berisi data lengkap: data_sem.RData

Berikut beberapa baris kode yang menunjukkan kegagalan 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

Tapi saya masih bisa menghitung korelasi atau matriks kovarian dengan cara yang sangat kotor, mengingat faktor-faktor yang saya pesan sebagai variabel kuantitatif:

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

Berikut adalah sepotong OpenMxkode bersama dengan pertanyaan saya berikutnya: apakah model berikut ini benar? Tidak terlalu banyak parameter gratis?

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])
       );

Dan satu pertanyaan terakhir. Dengan model ini (mari kita lupakan sejenak cara yang tidak tepat matriks korelasi dihitung), saya menjalankan OpenMx:

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

di antara ringkasan, ini:

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 

Kelihatannya sangat buruk, meskipun sejumlah besar parameter. Apa artinya? Apakah itu berarti bahwa kita harus menambahkan kovarian antara variabel manifes?

Terima kasih banyak sebelumnya atas semua jawaban Anda, saya perlahan menjadi gila ...

Elvis
sumber

Jawaban:

10

Anda harus menemukan bug di polycordalamnya, yang ingin Anda laporkan ke John Fox. Semuanya berjalan baik di Stata menggunakan polychoricpaket saya :

    . 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

Untuk variabel laten yang diukur dengan indikator tunggal ( C, D, E), Anda harus memperbaiki varians dari indikator dalam versi terus-menerus itu, karena kalau skala variabel laten tidak diidentifikasi. Mengingat bahwa dengan respons biner / ordinal, tetap ditetapkan ke 1 dengan tautan tipe-probit (ordinal), mungkin berarti Anda harus mendalilkan bahwa laten Anda setara dengan indikator yang diamati, atau Anda harus mendalilkan pemuatan standar . Ini pada dasarnya membuat model Anda setara dengan model CFA di mana Anda memiliki faktor laten A dan B yang diukur dengan {A1-A5, C1, D1, E1} dan {B1-B3, C1, D1, E1}.

Tugas
sumber
Terima kasih banyak telah meluangkan waktu untuk mencoba ini! Jadi: apakah ada yang punya alternatif untuk menyarankan untuk menghitung korelasi ini dalam R?
Elvis
Mengenai faktor-faktor itu, aku sadar ada sesuatu yang bersembunyi di sana - tapi aku belum yakin sepenuhnya. Dalam apa yang saya tulis, saya memiliki hubungan seperti - kecuali bahwa ini sebenarnya adalah polytomy dari ini. Bahkan jika itu tidak ordinal, tetapi kuantitatif, karena saya hanya memberikan korelasi (bahkan bukan kovarians) saya tidak mengerti bagaimana skala dapat diambil. Maksud saya tidak hanya varian , tetapi juga nilai . Namun memperbaikinya membuat cocok lebih buruk! Saya memahami hal-hal dengan lebih baik ketika kami memasukkan data mentah, tetapi sayangnya ini gagal ...Ai=αiA+ϵAiAiϵαsaya
Elvis
Untuk faktor-faktor dengan satu indikator, hal-hal yang terburuk ...! Sebenarnya C1, D1, E1 adalah jumlah dari beberapa variabel; mereka seperti ini ketika saya diberikan data, saya meminta seluruh kumpulan data karena saya pikir itu lebih disukai tetapi pada beberapa titik saya beralih kembali ke jumlah karena tidak ada yang bekerja dengan baik ... Jika saya dapat menemukan cara untuk menghitung korelasi ini dengan R Saya akan menggunakan set data lengkap.
Elvis
Oke, sekarang saya pikir lebih baik saya pikir saya mengerti.
Elvis