如何在lavaan中纳入潜因子残差/扰动项?
visual的残差方差计算问题 示例代码
library(lavaan) model <- ' #latent variable definition visual =~ x1 + x2 + x3 #regressions visual ~ x4 visual ~ x5 visual ~ x6 #(co)variances visual ~~ visual ' fit <- sem(model, data = HolzingerSwineford1939) summary(fit) inspect(fit,"estimates")
问题描述
我认为visual的方差并未完全被x4、x5和x6解释,因此希望纳入潜因子残差(扰动项)来代表visual的剩余方差。
我尝试加入visual ~~ visual来设置潜变量的残差方差,但确信这仅代表方差而非残差方差,属于冗余代码。
在summary(fit)输出的“variances:”项下,visual的估计值为0.608;移除visual ~~ visual后,数值完全一致。
在inspect(fit,"estimates")输出的“$psi”项下,visual自身交叉项的数值同样为0.608;移除冗余代码后结果仍相同。
我认为这两个数值是visual的总方差估计值,而非残差方差。那么如何获取visual的残差方差估计值?
lavaan教程提到“残差方差会自动添加”,但我认为这可能仅针对观测变量,而非潜变量。
解答
在lavaan的结构方程模型中,当潜变量作为回归因变量(比如你模型里的visual ~ x4 + x5 + x6)时,模型默认会为这个潜变量添加残差方差——你看到的$psi里的visual ~~ visual估计值,本身就是残差方差,并非总方差。
所谓的“总方差”由两部分构成:预测变量(x4、x5、x6)解释的方差,加上这个残差方差。可以手动验证:
- 用
parameterEstimates(fit)提取visual ~ x4、visual ~ x5、visual ~ x6的回归系数,记为b4、b5、b6; - 用
cov(HolzingerSwineford1939[, c("x4","x5","x6")])获取三个预测变量的协方差矩阵; - 计算预测变量解释的方差:
b4²*var(x4) + b5²*var(x5) + b6²*var(x6) + 2*b4*b5*cov(x4,x5) + 2*b4*b6*cov(x4,x6) + 2*b5*b6*cov(x5,x6); - 将解释方差加上
$psi中的0.608,得到的就是visual的总方差。
另外你加入的visual ~~ visual确实是冗余代码,因为潜变量作为回归因变量时,lavaan会自动为其设定自由估计的残差方差,手动添加不会改变模型结构,所以移除后结果完全一致。
如果要直接提取残差方差,除了用inspect(fit, "estimates")$psi,还可以用parameterEstimates(fit)筛选出lhs=="visual" & rhs=="visual" & op=="~~"的行,对应的est值就是残差方差。
内容的提问来源于stack exchange,提问作者Curtis Drake

