Como prever pontuações fatoriais em Lavaan

7

Ao fazer um CFA Lavaan, eu tive que usar a matriz de covariância como entrada, porque estava recebendo alguns erros com os dados originais, como variações negativas.

Eu normalmente teria pontuações fatoriais previstas usando a predict()função, lavPredictfunciona da mesma forma, mas agora que estou usando a matriz de covariância não é possível fazer isso diretamente.

Existe uma maneira de usar as informações do CFA para calcular as pontuações dos fatores da mesma maneira que Lavaanfaz? Acredito que a predict()função use o método de regressão para calcular as pontuações dos fatores.

Este é um código de amostra para produzir pontuações de fatores com dados brutos como entrada. Usando este método, recebo um erro em uma das minhas variações:

library(lavaan)

model1 = '
Latent1 =~ X1 + X2
Latent2 =~ X3 + X4 + X5
Latent3 =~ X6 + X7
'

model1.fit = cfa(model1, data=mydata) #fit Lavaan model

predict(model1.fit) #Predict factor scores (method of regression)

Este é o código para produzir pontuações fatoriais com matriz de covariância como entrada. Não há mensagens de erro aqui, mas não consigo produzir pontuações fatoriais, pois não há dados para vinculá-las a:

cov = cor2cov(cor,std) #(using cor2cov function to create covariance matrix out of correlation table (cor) and standard deviations (std))

model2 = '
Latent1 =~ X1+ X2
Latent2 =~ X3 + X4 + X5
Latent3 =~ X6 + X7
'

model2.fit = cfa(model=model2, sample.cov=cov,sample.nobs=102,std.lv=FALSE)

Como proceder a partir daqui para produzir pontuações fatoriais usando os resultados da Lavaananálise CFA?

Charlie Glez
fonte
11
Se você encontrou erros nos dados, deve obter erros na matriz de covariância (a menos que tenha faltado dados ou tenha usado algo diferente de ML). talvez algum código ajudaria?
Jeremy Miles
11
Oi Jeremy, não necessariamente. Alguns erros desaparecem se você apenas usar a matriz de covariância e os desvios padrão como entrada para o Lavaan. A coisa é que agora eu não posso usar a função de prever (), e calcular escores fatoriais utilizando independentemente do método de regressão está além da minha atual conjunto de habilidades ...
Charlie Glez
À direita da tela, vejo algumas perguntas relacionadas, por exemplo, stats.stackexchange.com/q/142285/3277 . Isso pode ajudar?
ttnphns
Só para obter informações, tenho a idéia de usar a tabela de covariância em vez dos dados brutos para obter melhores modelos das palestras de Erin Buchanan CFA, como esta: youtube.com/… (minutos 6 a 9)
Charlie Glez
Oi ttnphns, na verdade não. Eu vi essa resposta, mas a resposta da matriz está além do meu entendimento. e o outro "Como as pontuações fatoriais são uma função linear dos observáveis, depois de calculá-las uma vez, você pode simplesmente usar lm para ajustar uma regressão linear entre as pontuações ajustadas e os observáveis". desde que eu não fui capaz de calcular pontuações ajustadas.
Charlie Glez

Respostas:

4

Esta pergunta recebeu várias visualizações desde que foi colocada pela primeira vez, mas nenhuma resposta. Aqui está uma solução, que pode ser útil para futuros leitores desta questão.

Para demonstrar que funciona, primeiro executarei um cfa()modelo usando o HolzingerSwineford1939. O modelo é retirado da lavaan página do tutorial .

library(lavaan)
dat<-data.frame(HolzingerSwineford1939[,7:15])

mod<-'
visual=~x1+x2+x3
textual=~x4+x5+x6
speed=~x7+x8+x9
'

fit<-cfa(mod, data = dat)

Isso retorna a seguinte solução:

> summary(fit)
lavaan (0.5-22) converged normally after  35 iterations

  Number of observations                           301

  Estimator                                         ML
  Minimum Function Test Statistic               85.306
  Degrees of freedom                                24
  P-value (Chi-square)                           0.000

Parameter Estimates:

  Information                                 Expected
  Standard Errors                             Standard

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  visual =~                                           
    x1                1.000                           
    x2                0.554    0.100    5.554    0.000
    x3                0.729    0.109    6.685    0.000
  textual =~                                          
    x4                1.000                           
    x5                1.113    0.065   17.014    0.000
    x6                0.926    0.055   16.703    0.000
  speed =~                                            
    x7                1.000                           
    x8                1.180    0.165    7.152    0.000
    x9                1.082    0.151    7.155    0.000

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)
  visual ~~                                           
    textual           0.408    0.074    5.552    0.000
    speed             0.262    0.056    4.660    0.000
  textual ~~                                          
    speed             0.173    0.049    3.518    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .x1                0.549    0.114    4.833    0.000
   .x2                1.134    0.102   11.146    0.000
   .x3                0.844    0.091    9.317    0.000
   .x4                0.371    0.048    7.779    0.000
   .x5                0.446    0.058    7.642    0.000
   .x6                0.356    0.043    8.277    0.000
   .x7                0.799    0.081    9.823    0.000
   .x8                0.488    0.074    6.573    0.000
   .x9                0.566    0.071    8.003    0.000
    visual            0.809    0.145    5.564    0.000
    textual           0.979    0.112    8.737    0.000
    speed             0.384    0.086    4.451    0.000

Ao usar dados brutos para inserir lavPredict()e predict()retornar valores previstos para as variáveis ​​latentes.

> head(lavPredict(fit))
          visual     textual       speed
[1,] -0.81767524 -0.13754501  0.06150726
[2,]  0.04951940 -1.01272402  0.62549360
[3,] -0.76139670 -1.87228634 -0.84057276
[4,]  0.41934153  0.01848569 -0.27133710
[5,] -0.41590481 -0.12225009  0.19432951
[6,]  0.02325632 -1.32981727  0.70885348

A execução do mesmo modelo com a matriz de covariância que a entrada retorna os mesmos resultados, mas conforme observa o pôster original, ocorre um erro ao tentar derivar as pontuações dos fatores.

> COV<-cov(dat)
> fit1<-cfa(mod, sample.cov = COV, sample.nobs = 301, sample.mean = colMeans(dat))
> lavPredict(fit1)
Error in lavPredict(fit1) : 
  lavaan ERROR: sample statistics were used for fitting and newdata is empty

A solução é bastante direta, pois o pacote precisa de alguns dados brutos para "mastigar", por assim dizer. Aqui você altera o código para identificar o conjunto de dados original como entrada de dados brutos para a função de previsão ( lavPredict(fit1, newdata = dat)). Isso retorna o seguinte (que é o mesmo modelo ajustado no lavaan, mas usando a matriz de covariância como entrada).

> head(lavPredict(fit1, newdata = dat))
          visual     textual       speed
[1,] -0.81767524 -0.13754501  0.06150726
[2,]  0.04951940 -1.01272402  0.62549360
[3,] -0.76139670 -1.87228634 -0.84057276
[4,]  0.41934153  0.01848569 -0.27133710
[5,] -0.41590481 -0.12225009  0.19432951
[6,]  0.02325632 -1.32981727  0.70885348

Como você pode ver, os resultados são idênticos.

Matt Barstead
fonte
Obrigado Matt. Mas, o que acontece se você tiver apenas a matriz cov sem o arquivo de dados brutos original.
Ph.D. Mehmet Türegün
Você está dizendo que possui a matriz de covariância e um objeto lavaan já ajustado (e / ou modelo)? Você simplesmente não possui os dados brutos que geram a covariância ou o modelo?
Matt Barstead 14/05/19