---
title: "Omega Hierarchical vs. Omega Total"
subtitle: "Demonstrasi reliabilitas di konstruk multidimensional"
format:
html:
toc: true
code-fold: show
code-tools: true
df-print: kable
---
## Konteks
[*Slide* Pertemuan 6](/slides/pertemuan6.qmd) menunjukkan bahwa menggabungkan **5 item Extraversion** (E1, E2, E3, E5, E8) dengan **5 item Neuroticism** (N1, N2, N7, N8, N9) dari data IPIP *Big Five* (`data/data.csv`, *n* = 19.718) menghasilkan Cronbach's $\alpha = 0{.}616$. Koefisien ini terlihat tidak terlalu mengecewakan, padahal item-itemnya jelas mengukur dua konstruk yang berbeda.
Laman ini menunjukkan perhitungannya secara langsung di {{< fa brands r-project >}}, termasuk kenapa McDonald's ω di `jamovi` **tidak menangkap** masalah ini, sementara $\omega$ *hierarchical* (dihitung lewat dekomposisi [*bifactor*](http://www.personalityresearch.org/intelligence/structure.html) [Schmid-Leiman](https://www.statpower.net/Content/319SEM/Lecture%20Notes/BiFactor.pdf) di `psych::omega()`) dapat menangkapnya dengan jelas.
## Setup
```{r}
library(psych) # install the package
data <- read.csv("../data/data.csv", sep = "\t") # import the dataset
data[data == 0] <- NA # set 0 = missing
rev_items <- c("E2", "E4", "E6", "E8", "E10", "N2", "N4") # tell R which items in Ext and Neu scale that are unfavorable
items <- c("E1", "E2", "E3", "E5", "E8", "N1", "N2", "N7", "N8", "N9") # we are only interested in these items. We combine these 5 items Ext (E1, E2, E3, E5, E8) and 5 items Neu (N1, N2, N7, N8, N9) into one single scale.
d <- reverse.code(ifelse(items %in% rev_items, -1, 1), data[, items], mini = 1, maxi = 5) # make a new dataset that contains only in the `items` vector, then reversing the score of unfavorable items
d <- na.omit(d) # get rid of participants with missing data for the sake of simplicity, we're essentially doing listwise deletion here
nrow(d) # how many participants do we have now after getting rid of those with missing data?
```
Lihat mana item yang *favorable* dan *unfavorable* di kamus data: [`codebook.txt`](/data/codebook.txt).
## Cronbach's alpha
```{r}
al <- alpha(d, check.keys = FALSE)$total$raw_alpha # calculate alpha -- you will see the alpha coefficient in the end of this code
```
## Omega (hierarchical dan total)
```{r}
om <- omega(d, nfactors = 2, fm = "minres", flip = FALSE, plot = FALSE,
title = "E1,E2,E3,E5,E8 + N1,N2,N7,N8,N9") # now calculate omega -- here, you can see there than I specify `nfactors` = 2, because essentially we know that this scale consists of two latent constructs (Ext and Neu)
```
```{r}
#| echo: false
cat(capture.output(print(om)), sep = "\n") # printing out the results
```
::: {.callout-warning}
### Lihat *error message* di *output*
`psych` menampilkan peringatan *"Three factors are required for identification -- general factor
loadings set to be equal. Proceed with caution"* di bagian atas *output.* Dekomposisi *bifactor* idealnya butuh **≥3 dimensi/faktor** untuk identifikasi yang stabil; dengan hanya 2 (Extraversion dan Neuroticism), $\omega_h$ di atas adalah estimasi yang belum benar-benar stabil.
:::
## Ringkasan
```{r}
data.frame(
Koefisien = c("Cronbach's alpha", "Omega hierarchical", "Omega total"),
Nilai = round(c(al, om$omega_h, om$omega.tot), 3)
) # lets create a simple table consisting of alpha, omega hierarchical and omega total
```
**Interpretasi:** $\alpha$ dan G.6 tetap terlihat "cukup baik" karena keduanya hanya melihat
**rata-rata korelasi antar-item** dan di dalam masing-masing subskala korelasinya memang tinggi.
Sedangkan $\omega_h$ mendekati nol karena secara struktural **tidak ada faktor umum tunggal** yang
mendasari kesepuluh item ini; yang ada adalah **dua konstruk psikologis** (Extraversion, Neuroticism) yang berkorelasi negatif kecil (tidak berhubungan) satu sama lain.
## Kenapa `jamovi` tidak menunjukkan ini
`jamovi` menghitung McDonald's $\omega$ dari **satu** model faktor *congeneric* (bukan dekomposisi *bifactor*), dan menormalisasinya dengan **varians total yang diobservasi**, bukan varians yang diimplikasikan model.
Itulah kenapa koefisiennya tetap tinggi meski struktur datanya jelas dua dimensi. McDonald's $\omega$ tidak mampu "melihat" bahwa data Anda punya struktur multidimensional dengan dua dimensi ynang berbeda.
Untuk mendeteksi multidimensionalitas lewat $\omega$, dekomposisi *bifactor* (`psych::omega()` di {{< fa brands r-project >}}) adalah cara yang tepat. Alternatifnya, Anda bisa menggunakan [*online calculator* dari Lensym](https://lensym.com/tools/mcdonalds-omega-calculator/).
## Reka-ulang analisis ini
```{r}
sessionInfo()
```