この質問は、最初に提起されて以来、多くの意見を得ていますが、回答はありません。この質問の将来の読者に役立つかもしれない解決策があります。
それが機能することを示すために、まずcfa()
を使用してモデルを実行しHolzingerSwineford1939
ます。モデルはlavaan
チュートリアルページから取得されます。
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)
これにより、次のソリューションが返されます。
> 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
入力のための生データを使用する場合lavPredict()
とpredict()
戻り、潜在変数の値を予測しました。
> 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
入力として共分散行列を使用して同じモデルを実行すると、同じ結果が返されますが、元のポスターノートでは、因子スコアを導出しようとするとエラーが発生します。
> 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
パッケージが必要とするのは、いわば「かみ砕く」ためのいくつかの生データなので、解決策はかなり単純です。ここで、元のデータセットを予測関数の生データ入力として識別するようにコードを修正します(lavPredict(fit1, newdata = dat)
)。これにより、次のものが返されます(これは、溶岩にフィットした同じモデルですが、入力として共分散行列を使用していることを覚えています)。
> 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
ご覧のとおり、結果は同じです。