Lavaan CFA: Why Isn’t a Factor Loading Auto-Set to One?

Performing CFA with Lavaan in R, I expected a default loading fixed at 1, yet none are. For example:

model_spec <- 'Latent1 =~ x_one + x_two + x_three
Latent2 =~ y_one + y_two + y_three'
result_model <- cfa(model_spec, data=sample_data, std.lv=TRUE)
summary(result_model)

Why isn’t Lavaan automatically assigning a loading of 1?

hey, its because std.lv=true fixes the latent variance, not a specific loading. lavaan identifys the model by scaling the entire factor, so loads come out freely, not auto-one. roughread the docs for more details

The behavior you’re observing is related to your use of the std.lv=TRUE option. In my experience with Lavaan, when std.lv=TRUE is specified, the latent variable’s variance is fixed at one rather than fixing one of the loadings to one. This method of identification scales the latent factor based on its variance, meaning that all loadings are freely estimated relative to that fixed variance. As a result, none of the loadings are automatically set to one, which is a design choice in Lavaan.

Hey folks, I’m really intrigued by this topic! It seems Lavaan’s design choice to fix the latent variance using std.lv=TRUE automatically shifts the focus away from having any one loading sticking at 1. From what I’ve seen, it feels like Lavaan is taking an approach where the latent constructs have their scales independently standardized, so all loadings can express relative importance freely. Has anyone else found that this approach affects how you interpret the parameter estimates? I’d love to hear if you’ve encountered any benefits or drawbacks with this method in your analyses. It really makes me wonder what would happen if we tried an alternative identification strategy… any thoughts on that? :blush:

hey, i think it’s just the way lavaan scales factors. std.lv=true fixes the latent var instead of one loading so all items are estimated relative to that var. a bit confusing at first, but it gives more flexble estimations overall.

In my experience using Lavaan, the setting std.lv=TRUE is used to standardize the latent variable by fixing its variance at one, which allows the loadings to be freely estimated. This approach effectively separates the scaling of the latent factor from the measurement model, thereby offering a consistent quantification of latent traits. While this might seem counterintuitive compared to fixing a single loading to one, it frequently results in more interpretable and robust parameter estimates, especially when dealing with multi-indicator constructs. I have found this method quite effective in ensuring model identification and reducing scaling issues.